LCOV - code coverage report
Current view: top level - drivers/gpu/drm/amd/amdgpu - dce_v11_0.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1602 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 97 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2014 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             :  */
      23             : 
      24             : #include <drm/drm_fourcc.h>
      25             : #include <drm/drm_vblank.h>
      26             : 
      27             : #include "amdgpu.h"
      28             : #include "amdgpu_pm.h"
      29             : #include "amdgpu_i2c.h"
      30             : #include "vid.h"
      31             : #include "atom.h"
      32             : #include "amdgpu_atombios.h"
      33             : #include "atombios_crtc.h"
      34             : #include "atombios_encoders.h"
      35             : #include "amdgpu_pll.h"
      36             : #include "amdgpu_connectors.h"
      37             : #include "amdgpu_display.h"
      38             : #include "dce_v11_0.h"
      39             : 
      40             : #include "dce/dce_11_0_d.h"
      41             : #include "dce/dce_11_0_sh_mask.h"
      42             : #include "dce/dce_11_0_enum.h"
      43             : #include "oss/oss_3_0_d.h"
      44             : #include "oss/oss_3_0_sh_mask.h"
      45             : #include "gmc/gmc_8_1_d.h"
      46             : #include "gmc/gmc_8_1_sh_mask.h"
      47             : 
      48             : #include "ivsrcid/ivsrcid_vislands30.h"
      49             : 
      50             : static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev);
      51             : static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev);
      52             : 
      53             : static const u32 crtc_offsets[] =
      54             : {
      55             :         CRTC0_REGISTER_OFFSET,
      56             :         CRTC1_REGISTER_OFFSET,
      57             :         CRTC2_REGISTER_OFFSET,
      58             :         CRTC3_REGISTER_OFFSET,
      59             :         CRTC4_REGISTER_OFFSET,
      60             :         CRTC5_REGISTER_OFFSET,
      61             :         CRTC6_REGISTER_OFFSET
      62             : };
      63             : 
      64             : static const u32 hpd_offsets[] =
      65             : {
      66             :         HPD0_REGISTER_OFFSET,
      67             :         HPD1_REGISTER_OFFSET,
      68             :         HPD2_REGISTER_OFFSET,
      69             :         HPD3_REGISTER_OFFSET,
      70             :         HPD4_REGISTER_OFFSET,
      71             :         HPD5_REGISTER_OFFSET
      72             : };
      73             : 
      74             : static const uint32_t dig_offsets[] = {
      75             :         DIG0_REGISTER_OFFSET,
      76             :         DIG1_REGISTER_OFFSET,
      77             :         DIG2_REGISTER_OFFSET,
      78             :         DIG3_REGISTER_OFFSET,
      79             :         DIG4_REGISTER_OFFSET,
      80             :         DIG5_REGISTER_OFFSET,
      81             :         DIG6_REGISTER_OFFSET,
      82             :         DIG7_REGISTER_OFFSET,
      83             :         DIG8_REGISTER_OFFSET
      84             : };
      85             : 
      86             : static const struct {
      87             :         uint32_t        reg;
      88             :         uint32_t        vblank;
      89             :         uint32_t        vline;
      90             :         uint32_t        hpd;
      91             : 
      92             : } interrupt_status_offsets[] = { {
      93             :         .reg = mmDISP_INTERRUPT_STATUS,
      94             :         .vblank = DISP_INTERRUPT_STATUS__LB_D1_VBLANK_INTERRUPT_MASK,
      95             :         .vline = DISP_INTERRUPT_STATUS__LB_D1_VLINE_INTERRUPT_MASK,
      96             :         .hpd = DISP_INTERRUPT_STATUS__DC_HPD1_INTERRUPT_MASK
      97             : }, {
      98             :         .reg = mmDISP_INTERRUPT_STATUS_CONTINUE,
      99             :         .vblank = DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VBLANK_INTERRUPT_MASK,
     100             :         .vline = DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE_INTERRUPT_MASK,
     101             :         .hpd = DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_INTERRUPT_MASK
     102             : }, {
     103             :         .reg = mmDISP_INTERRUPT_STATUS_CONTINUE2,
     104             :         .vblank = DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VBLANK_INTERRUPT_MASK,
     105             :         .vline = DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VLINE_INTERRUPT_MASK,
     106             :         .hpd = DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_INTERRUPT_MASK
     107             : }, {
     108             :         .reg = mmDISP_INTERRUPT_STATUS_CONTINUE3,
     109             :         .vblank = DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VBLANK_INTERRUPT_MASK,
     110             :         .vline = DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VLINE_INTERRUPT_MASK,
     111             :         .hpd = DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_INTERRUPT_MASK
     112             : }, {
     113             :         .reg = mmDISP_INTERRUPT_STATUS_CONTINUE4,
     114             :         .vblank = DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VBLANK_INTERRUPT_MASK,
     115             :         .vline = DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VLINE_INTERRUPT_MASK,
     116             :         .hpd = DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_INTERRUPT_MASK
     117             : }, {
     118             :         .reg = mmDISP_INTERRUPT_STATUS_CONTINUE5,
     119             :         .vblank = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VBLANK_INTERRUPT_MASK,
     120             :         .vline = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT_MASK,
     121             :         .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK
     122             : } };
     123             : 
     124             : static const u32 cz_golden_settings_a11[] =
     125             : {
     126             :         mmCRTC_DOUBLE_BUFFER_CONTROL, 0x00010101, 0x00010000,
     127             :         mmFBC_MISC, 0x1f311fff, 0x14300000,
     128             : };
     129             : 
     130             : static const u32 cz_mgcg_cgcg_init[] =
     131             : {
     132             :         mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
     133             :         mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
     134             : };
     135             : 
     136             : static const u32 stoney_golden_settings_a11[] =
     137             : {
     138             :         mmCRTC_DOUBLE_BUFFER_CONTROL, 0x00010101, 0x00010000,
     139             :         mmFBC_MISC, 0x1f311fff, 0x14302000,
     140             : };
     141             : 
     142             : static const u32 polaris11_golden_settings_a11[] =
     143             : {
     144             :         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
     145             :         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
     146             :         mmFBC_DEBUG1, 0xffffffff, 0x00000008,
     147             :         mmFBC_MISC, 0x9f313fff, 0x14302008,
     148             :         mmHDMI_CONTROL, 0x313f031f, 0x00000011,
     149             : };
     150             : 
     151             : static const u32 polaris10_golden_settings_a11[] =
     152             : {
     153             :         mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
     154             :         mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
     155             :         mmFBC_MISC, 0x9f313fff, 0x14302008,
     156             :         mmHDMI_CONTROL, 0x313f031f, 0x00000011,
     157             : };
     158             : 
     159           0 : static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
     160             : {
     161           0 :         switch (adev->asic_type) {
     162             :         case CHIP_CARRIZO:
     163           0 :                 amdgpu_device_program_register_sequence(adev,
     164             :                                                         cz_mgcg_cgcg_init,
     165             :                                                         ARRAY_SIZE(cz_mgcg_cgcg_init));
     166           0 :                 amdgpu_device_program_register_sequence(adev,
     167             :                                                         cz_golden_settings_a11,
     168             :                                                         ARRAY_SIZE(cz_golden_settings_a11));
     169           0 :                 break;
     170             :         case CHIP_STONEY:
     171           0 :                 amdgpu_device_program_register_sequence(adev,
     172             :                                                         stoney_golden_settings_a11,
     173             :                                                         ARRAY_SIZE(stoney_golden_settings_a11));
     174           0 :                 break;
     175             :         case CHIP_POLARIS11:
     176             :         case CHIP_POLARIS12:
     177           0 :                 amdgpu_device_program_register_sequence(adev,
     178             :                                                         polaris11_golden_settings_a11,
     179             :                                                         ARRAY_SIZE(polaris11_golden_settings_a11));
     180           0 :                 break;
     181             :         case CHIP_POLARIS10:
     182             :         case CHIP_VEGAM:
     183           0 :                 amdgpu_device_program_register_sequence(adev,
     184             :                                                         polaris10_golden_settings_a11,
     185             :                                                         ARRAY_SIZE(polaris10_golden_settings_a11));
     186           0 :                 break;
     187             :         default:
     188             :                 break;
     189             :         }
     190           0 : }
     191             : 
     192           0 : static u32 dce_v11_0_audio_endpt_rreg(struct amdgpu_device *adev,
     193             :                                      u32 block_offset, u32 reg)
     194             : {
     195             :         unsigned long flags;
     196             :         u32 r;
     197             : 
     198           0 :         spin_lock_irqsave(&adev->audio_endpt_idx_lock, flags);
     199           0 :         WREG32(mmAZALIA_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
     200           0 :         r = RREG32(mmAZALIA_F0_CODEC_ENDPOINT_DATA + block_offset);
     201           0 :         spin_unlock_irqrestore(&adev->audio_endpt_idx_lock, flags);
     202             : 
     203           0 :         return r;
     204             : }
     205             : 
     206           0 : static void dce_v11_0_audio_endpt_wreg(struct amdgpu_device *adev,
     207             :                                       u32 block_offset, u32 reg, u32 v)
     208             : {
     209             :         unsigned long flags;
     210             : 
     211           0 :         spin_lock_irqsave(&adev->audio_endpt_idx_lock, flags);
     212           0 :         WREG32(mmAZALIA_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
     213           0 :         WREG32(mmAZALIA_F0_CODEC_ENDPOINT_DATA + block_offset, v);
     214           0 :         spin_unlock_irqrestore(&adev->audio_endpt_idx_lock, flags);
     215           0 : }
     216             : 
     217           0 : static u32 dce_v11_0_vblank_get_counter(struct amdgpu_device *adev, int crtc)
     218             : {
     219           0 :         if (crtc < 0 || crtc >= adev->mode_info.num_crtc)
     220             :                 return 0;
     221             :         else
     222           0 :                 return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
     223             : }
     224             : 
     225             : static void dce_v11_0_pageflip_interrupt_init(struct amdgpu_device *adev)
     226             : {
     227             :         unsigned i;
     228             : 
     229             :         /* Enable pflip interrupts */
     230           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++)
     231           0 :                 amdgpu_irq_get(adev, &adev->pageflip_irq, i);
     232             : }
     233             : 
     234             : static void dce_v11_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
     235             : {
     236             :         unsigned i;
     237             : 
     238             :         /* Disable pflip interrupts */
     239           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++)
     240           0 :                 amdgpu_irq_put(adev, &adev->pageflip_irq, i);
     241             : }
     242             : 
     243             : /**
     244             :  * dce_v11_0_page_flip - pageflip callback.
     245             :  *
     246             :  * @adev: amdgpu_device pointer
     247             :  * @crtc_id: crtc to cleanup pageflip on
     248             :  * @crtc_base: new address of the crtc (GPU MC address)
     249             :  * @async: asynchronous flip
     250             :  *
     251             :  * Triggers the actual pageflip by updating the primary
     252             :  * surface base address.
     253             :  */
     254           0 : static void dce_v11_0_page_flip(struct amdgpu_device *adev,
     255             :                                 int crtc_id, u64 crtc_base, bool async)
     256             : {
     257           0 :         struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
     258           0 :         struct drm_framebuffer *fb = amdgpu_crtc->base.primary->fb;
     259             :         u32 tmp;
     260             : 
     261             :         /* flip immediate for async, default is vsync */
     262           0 :         tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
     263           0 :         tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
     264             :                             GRPH_SURFACE_UPDATE_IMMEDIATE_EN, async ? 1 : 0);
     265           0 :         WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
     266             :         /* update pitch */
     267           0 :         WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset,
     268             :                fb->pitches[0] / fb->format->cpp[0]);
     269             :         /* update the scanout addresses */
     270           0 :         WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
     271             :                upper_32_bits(crtc_base));
     272             :         /* writing to the low address triggers the update */
     273           0 :         WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
     274             :                lower_32_bits(crtc_base));
     275             :         /* post the write */
     276           0 :         RREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
     277           0 : }
     278             : 
     279           0 : static int dce_v11_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
     280             :                                         u32 *vbl, u32 *position)
     281             : {
     282           0 :         if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc))
     283             :                 return -EINVAL;
     284             : 
     285           0 :         *vbl = RREG32(mmCRTC_V_BLANK_START_END + crtc_offsets[crtc]);
     286           0 :         *position = RREG32(mmCRTC_STATUS_POSITION + crtc_offsets[crtc]);
     287             : 
     288           0 :         return 0;
     289             : }
     290             : 
     291             : /**
     292             :  * dce_v11_0_hpd_sense - hpd sense callback.
     293             :  *
     294             :  * @adev: amdgpu_device pointer
     295             :  * @hpd: hpd (hotplug detect) pin
     296             :  *
     297             :  * Checks if a digital monitor is connected (evergreen+).
     298             :  * Returns true if connected, false if not connected.
     299             :  */
     300           0 : static bool dce_v11_0_hpd_sense(struct amdgpu_device *adev,
     301             :                                enum amdgpu_hpd_id hpd)
     302             : {
     303           0 :         bool connected = false;
     304             : 
     305           0 :         if (hpd >= adev->mode_info.num_hpd)
     306             :                 return connected;
     307             : 
     308           0 :         if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[hpd]) &
     309             :             DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK)
     310           0 :                 connected = true;
     311             : 
     312             :         return connected;
     313             : }
     314             : 
     315             : /**
     316             :  * dce_v11_0_hpd_set_polarity - hpd set polarity callback.
     317             :  *
     318             :  * @adev: amdgpu_device pointer
     319             :  * @hpd: hpd (hotplug detect) pin
     320             :  *
     321             :  * Set the polarity of the hpd pin (evergreen+).
     322             :  */
     323           0 : static void dce_v11_0_hpd_set_polarity(struct amdgpu_device *adev,
     324             :                                       enum amdgpu_hpd_id hpd)
     325             : {
     326             :         u32 tmp;
     327           0 :         bool connected = dce_v11_0_hpd_sense(adev, hpd);
     328             : 
     329           0 :         if (hpd >= adev->mode_info.num_hpd)
     330             :                 return;
     331             : 
     332           0 :         tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);
     333           0 :         if (connected)
     334           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 0);
     335             :         else
     336           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 1);
     337           0 :         WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);
     338             : }
     339             : 
     340             : /**
     341             :  * dce_v11_0_hpd_init - hpd setup callback.
     342             :  *
     343             :  * @adev: amdgpu_device pointer
     344             :  *
     345             :  * Setup the hpd pins used by the card (evergreen+).
     346             :  * Enable the pin, set the polarity, and enable the hpd interrupts.
     347             :  */
     348           0 : static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
     349             : {
     350           0 :         struct drm_device *dev = adev_to_drm(adev);
     351             :         struct drm_connector *connector;
     352             :         struct drm_connector_list_iter iter;
     353             :         u32 tmp;
     354             : 
     355           0 :         drm_connector_list_iter_begin(dev, &iter);
     356           0 :         drm_for_each_connector_iter(connector, &iter) {
     357           0 :                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
     358             : 
     359           0 :                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
     360           0 :                         continue;
     361             : 
     362           0 :                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
     363             :                     connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
     364             :                         /* don't try to enable hpd on eDP or LVDS avoid breaking the
     365             :                          * aux dp channel on imac and help (but not completely fix)
     366             :                          * https://bugzilla.redhat.com/show_bug.cgi?id=726143
     367             :                          * also avoid interrupt storms during dpms.
     368             :                          */
     369           0 :                         tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
     370           0 :                         tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
     371           0 :                         WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
     372           0 :                         continue;
     373             :                 }
     374             : 
     375           0 :                 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
     376           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
     377           0 :                 WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
     378             : 
     379           0 :                 tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd]);
     380           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,
     381             :                                     DC_HPD_CONNECT_INT_DELAY,
     382             :                                     AMDGPU_HPD_CONNECT_INT_DELAY_IN_MS);
     383           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,
     384             :                                     DC_HPD_DISCONNECT_INT_DELAY,
     385             :                                     AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS);
     386           0 :                 WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
     387             : 
     388           0 :                 dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
     389           0 :                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
     390             :         }
     391           0 :         drm_connector_list_iter_end(&iter);
     392           0 : }
     393             : 
     394             : /**
     395             :  * dce_v11_0_hpd_fini - hpd tear down callback.
     396             :  *
     397             :  * @adev: amdgpu_device pointer
     398             :  *
     399             :  * Tear down the hpd pins used by the card (evergreen+).
     400             :  * Disable the hpd interrupts.
     401             :  */
     402           0 : static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
     403             : {
     404           0 :         struct drm_device *dev = adev_to_drm(adev);
     405             :         struct drm_connector *connector;
     406             :         struct drm_connector_list_iter iter;
     407             :         u32 tmp;
     408             : 
     409           0 :         drm_connector_list_iter_begin(dev, &iter);
     410           0 :         drm_for_each_connector_iter(connector, &iter) {
     411           0 :                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
     412             : 
     413           0 :                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
     414           0 :                         continue;
     415             : 
     416           0 :                 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
     417           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 0);
     418           0 :                 WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
     419             : 
     420           0 :                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
     421             :         }
     422           0 :         drm_connector_list_iter_end(&iter);
     423           0 : }
     424             : 
     425           0 : static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
     426             : {
     427           0 :         return mmDC_GPIO_HPD_A;
     428             : }
     429             : 
     430           0 : static bool dce_v11_0_is_display_hung(struct amdgpu_device *adev)
     431             : {
     432           0 :         u32 crtc_hung = 0;
     433             :         u32 crtc_status[6];
     434             :         u32 i, j, tmp;
     435             : 
     436           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
     437           0 :                 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
     438           0 :                 if (REG_GET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN)) {
     439           0 :                         crtc_status[i] = RREG32(mmCRTC_STATUS_HV_COUNT + crtc_offsets[i]);
     440           0 :                         crtc_hung |= (1 << i);
     441             :                 }
     442             :         }
     443             : 
     444           0 :         for (j = 0; j < 10; j++) {
     445           0 :                 for (i = 0; i < adev->mode_info.num_crtc; i++) {
     446           0 :                         if (crtc_hung & (1 << i)) {
     447           0 :                                 tmp = RREG32(mmCRTC_STATUS_HV_COUNT + crtc_offsets[i]);
     448           0 :                                 if (tmp != crtc_status[i])
     449           0 :                                         crtc_hung &= ~(1 << i);
     450             :                         }
     451             :                 }
     452           0 :                 if (crtc_hung == 0)
     453             :                         return false;
     454           0 :                 udelay(100);
     455             :         }
     456             : 
     457             :         return true;
     458             : }
     459             : 
     460           0 : static void dce_v11_0_set_vga_render_state(struct amdgpu_device *adev,
     461             :                                            bool render)
     462             : {
     463             :         u32 tmp;
     464             : 
     465             :         /* Lockout access through VGA aperture*/
     466           0 :         tmp = RREG32(mmVGA_HDP_CONTROL);
     467           0 :         if (render)
     468           0 :                 tmp = REG_SET_FIELD(tmp, VGA_HDP_CONTROL, VGA_MEMORY_DISABLE, 0);
     469             :         else
     470           0 :                 tmp = REG_SET_FIELD(tmp, VGA_HDP_CONTROL, VGA_MEMORY_DISABLE, 1);
     471           0 :         WREG32(mmVGA_HDP_CONTROL, tmp);
     472             : 
     473             :         /* disable VGA render */
     474           0 :         tmp = RREG32(mmVGA_RENDER_CONTROL);
     475           0 :         if (render)
     476           0 :                 tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 1);
     477             :         else
     478           0 :                 tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
     479           0 :         WREG32(mmVGA_RENDER_CONTROL, tmp);
     480           0 : }
     481             : 
     482             : static int dce_v11_0_get_num_crtc (struct amdgpu_device *adev)
     483             : {
     484           0 :         int num_crtc = 0;
     485             : 
     486             :         switch (adev->asic_type) {
     487             :         case CHIP_CARRIZO:
     488             :                 num_crtc = 3;
     489             :                 break;
     490             :         case CHIP_STONEY:
     491             :                 num_crtc = 2;
     492             :                 break;
     493             :         case CHIP_POLARIS10:
     494             :         case CHIP_VEGAM:
     495             :                 num_crtc = 6;
     496             :                 break;
     497             :         case CHIP_POLARIS11:
     498             :         case CHIP_POLARIS12:
     499             :                 num_crtc = 5;
     500             :                 break;
     501             :         default:
     502             :                 num_crtc = 0;
     503             :         }
     504             :         return num_crtc;
     505             : }
     506             : 
     507           0 : void dce_v11_0_disable_dce(struct amdgpu_device *adev)
     508             : {
     509             :         /*Disable VGA render and enabled crtc, if has DCE engine*/
     510           0 :         if (amdgpu_atombios_has_dce_engine_info(adev)) {
     511             :                 u32 tmp;
     512             :                 int crtc_enabled, i;
     513             : 
     514           0 :                 dce_v11_0_set_vga_render_state(adev, false);
     515             : 
     516             :                 /*Disable crtc*/
     517           0 :                 for (i = 0; i < dce_v11_0_get_num_crtc(adev); i++) {
     518           0 :                         crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
     519             :                                                                          CRTC_CONTROL, CRTC_MASTER_EN);
     520           0 :                         if (crtc_enabled) {
     521           0 :                                 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
     522           0 :                                 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
     523           0 :                                 tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
     524           0 :                                 WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
     525           0 :                                 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
     526             :                         }
     527             :                 }
     528             :         }
     529           0 : }
     530             : 
     531           0 : static void dce_v11_0_program_fmt(struct drm_encoder *encoder)
     532             : {
     533           0 :         struct drm_device *dev = encoder->dev;
     534           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
     535           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
     536           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
     537           0 :         struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
     538           0 :         int bpc = 0;
     539           0 :         u32 tmp = 0;
     540           0 :         enum amdgpu_connector_dither dither = AMDGPU_FMT_DITHER_DISABLE;
     541             : 
     542           0 :         if (connector) {
     543           0 :                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
     544           0 :                 bpc = amdgpu_connector_get_monitor_bpc(connector);
     545           0 :                 dither = amdgpu_connector->dither;
     546             :         }
     547             : 
     548             :         /* LVDS/eDP FMT is set up by atom */
     549           0 :         if (amdgpu_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
     550             :                 return;
     551             : 
     552             :         /* not needed for analog */
     553           0 :         if ((amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
     554             :             (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
     555             :                 return;
     556             : 
     557           0 :         if (bpc == 0)
     558             :                 return;
     559             : 
     560           0 :         switch (bpc) {
     561             :         case 6:
     562           0 :                 if (dither == AMDGPU_FMT_DITHER_ENABLE) {
     563             :                         /* XXX sort out optimal dither settings */
     564             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_FRAME_RANDOM_ENABLE, 1);
     565             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_HIGHPASS_RANDOM_ENABLE, 1);
     566             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_EN, 1);
     567             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_DEPTH, 0);
     568             :                 } else {
     569           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_EN, 1);
     570           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_DEPTH, 0);
     571             :                 }
     572             :                 break;
     573             :         case 8:
     574           0 :                 if (dither == AMDGPU_FMT_DITHER_ENABLE) {
     575             :                         /* XXX sort out optimal dither settings */
     576             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_FRAME_RANDOM_ENABLE, 1);
     577             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_HIGHPASS_RANDOM_ENABLE, 1);
     578             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_RGB_RANDOM_ENABLE, 1);
     579             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_EN, 1);
     580             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_DEPTH, 1);
     581             :                 } else {
     582           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_EN, 1);
     583           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_DEPTH, 1);
     584             :                 }
     585             :                 break;
     586             :         case 10:
     587           0 :                 if (dither == AMDGPU_FMT_DITHER_ENABLE) {
     588             :                         /* XXX sort out optimal dither settings */
     589             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_FRAME_RANDOM_ENABLE, 1);
     590             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_HIGHPASS_RANDOM_ENABLE, 1);
     591             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_RGB_RANDOM_ENABLE, 1);
     592             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_EN, 1);
     593             :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_DEPTH, 2);
     594             :                 } else {
     595           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_EN, 1);
     596           0 :                         tmp = REG_SET_FIELD(tmp, FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_DEPTH, 2);
     597             :                 }
     598             :                 break;
     599             :         default:
     600             :                 /* not needed */
     601             :                 break;
     602             :         }
     603             : 
     604           0 :         WREG32(mmFMT_BIT_DEPTH_CONTROL + amdgpu_crtc->crtc_offset, tmp);
     605             : }
     606             : 
     607             : 
     608             : /* display watermark setup */
     609             : /**
     610             :  * dce_v11_0_line_buffer_adjust - Set up the line buffer
     611             :  *
     612             :  * @adev: amdgpu_device pointer
     613             :  * @amdgpu_crtc: the selected display controller
     614             :  * @mode: the current display mode on the selected display
     615             :  * controller
     616             :  *
     617             :  * Setup up the line buffer allocation for
     618             :  * the selected display controller (CIK).
     619             :  * Returns the line buffer size in pixels.
     620             :  */
     621           0 : static u32 dce_v11_0_line_buffer_adjust(struct amdgpu_device *adev,
     622             :                                        struct amdgpu_crtc *amdgpu_crtc,
     623             :                                        struct drm_display_mode *mode)
     624             : {
     625             :         u32 tmp, buffer_alloc, i, mem_cfg;
     626           0 :         u32 pipe_offset = amdgpu_crtc->crtc_id;
     627             :         /*
     628             :          * Line Buffer Setup
     629             :          * There are 6 line buffers, one for each display controllers.
     630             :          * There are 3 partitions per LB. Select the number of partitions
     631             :          * to enable based on the display width.  For display widths larger
     632             :          * than 4096, you need use to use 2 display controllers and combine
     633             :          * them using the stereo blender.
     634             :          */
     635           0 :         if (amdgpu_crtc->base.enabled && mode) {
     636           0 :                 if (mode->crtc_hdisplay < 1920) {
     637             :                         mem_cfg = 1;
     638             :                         buffer_alloc = 2;
     639           0 :                 } else if (mode->crtc_hdisplay < 2560) {
     640             :                         mem_cfg = 2;
     641             :                         buffer_alloc = 2;
     642           0 :                 } else if (mode->crtc_hdisplay < 4096) {
     643           0 :                         mem_cfg = 0;
     644           0 :                         buffer_alloc = (adev->flags & AMD_IS_APU) ? 2 : 4;
     645             :                 } else {
     646           0 :                         DRM_DEBUG_KMS("Mode too big for LB!\n");
     647           0 :                         mem_cfg = 0;
     648           0 :                         buffer_alloc = (adev->flags & AMD_IS_APU) ? 2 : 4;
     649             :                 }
     650             :         } else {
     651             :                 mem_cfg = 1;
     652             :                 buffer_alloc = 0;
     653             :         }
     654             : 
     655           0 :         tmp = RREG32(mmLB_MEMORY_CTRL + amdgpu_crtc->crtc_offset);
     656           0 :         tmp = REG_SET_FIELD(tmp, LB_MEMORY_CTRL, LB_MEMORY_CONFIG, mem_cfg);
     657           0 :         WREG32(mmLB_MEMORY_CTRL + amdgpu_crtc->crtc_offset, tmp);
     658             : 
     659           0 :         tmp = RREG32(mmPIPE0_DMIF_BUFFER_CONTROL + pipe_offset);
     660           0 :         tmp = REG_SET_FIELD(tmp, PIPE0_DMIF_BUFFER_CONTROL, DMIF_BUFFERS_ALLOCATED, buffer_alloc);
     661           0 :         WREG32(mmPIPE0_DMIF_BUFFER_CONTROL + pipe_offset, tmp);
     662             : 
     663           0 :         for (i = 0; i < adev->usec_timeout; i++) {
     664           0 :                 tmp = RREG32(mmPIPE0_DMIF_BUFFER_CONTROL + pipe_offset);
     665           0 :                 if (REG_GET_FIELD(tmp, PIPE0_DMIF_BUFFER_CONTROL, DMIF_BUFFERS_ALLOCATION_COMPLETED))
     666             :                         break;
     667           0 :                 udelay(1);
     668             :         }
     669             : 
     670           0 :         if (amdgpu_crtc->base.enabled && mode) {
     671           0 :                 switch (mem_cfg) {
     672             :                 case 0:
     673             :                 default:
     674             :                         return 4096 * 2;
     675             :                 case 1:
     676           0 :                         return 1920 * 2;
     677             :                 case 2:
     678           0 :                         return 2560 * 2;
     679             :                 }
     680             :         }
     681             : 
     682             :         /* controller not enabled, so no lb used */
     683             :         return 0;
     684             : }
     685             : 
     686             : /**
     687             :  * cik_get_number_of_dram_channels - get the number of dram channels
     688             :  *
     689             :  * @adev: amdgpu_device pointer
     690             :  *
     691             :  * Look up the number of video ram channels (CIK).
     692             :  * Used for display watermark bandwidth calculations
     693             :  * Returns the number of dram channels
     694             :  */
     695           0 : static u32 cik_get_number_of_dram_channels(struct amdgpu_device *adev)
     696             : {
     697           0 :         u32 tmp = RREG32(mmMC_SHARED_CHMAP);
     698             : 
     699           0 :         switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) {
     700             :         case 0:
     701             :         default:
     702             :                 return 1;
     703             :         case 1:
     704             :                 return 2;
     705             :         case 2:
     706             :                 return 4;
     707             :         case 3:
     708             :                 return 8;
     709             :         case 4:
     710             :                 return 3;
     711             :         case 5:
     712             :                 return 6;
     713             :         case 6:
     714             :                 return 10;
     715             :         case 7:
     716             :                 return 12;
     717             :         case 8:
     718             :                 return 16;
     719             :         }
     720             : }
     721             : 
     722             : struct dce10_wm_params {
     723             :         u32 dram_channels; /* number of dram channels */
     724             :         u32 yclk;          /* bandwidth per dram data pin in kHz */
     725             :         u32 sclk;          /* engine clock in kHz */
     726             :         u32 disp_clk;      /* display clock in kHz */
     727             :         u32 src_width;     /* viewport width */
     728             :         u32 active_time;   /* active display time in ns */
     729             :         u32 blank_time;    /* blank time in ns */
     730             :         bool interlaced;    /* mode is interlaced */
     731             :         fixed20_12 vsc;    /* vertical scale ratio */
     732             :         u32 num_heads;     /* number of active crtcs */
     733             :         u32 bytes_per_pixel; /* bytes per pixel display + overlay */
     734             :         u32 lb_size;       /* line buffer allocated to pipe */
     735             :         u32 vtaps;         /* vertical scaler taps */
     736             : };
     737             : 
     738             : /**
     739             :  * dce_v11_0_dram_bandwidth - get the dram bandwidth
     740             :  *
     741             :  * @wm: watermark calculation data
     742             :  *
     743             :  * Calculate the raw dram bandwidth (CIK).
     744             :  * Used for display watermark bandwidth calculations
     745             :  * Returns the dram bandwidth in MBytes/s
     746             :  */
     747             : static u32 dce_v11_0_dram_bandwidth(struct dce10_wm_params *wm)
     748             : {
     749             :         /* Calculate raw DRAM Bandwidth */
     750             :         fixed20_12 dram_efficiency; /* 0.7 */
     751             :         fixed20_12 yclk, dram_channels, bandwidth;
     752             :         fixed20_12 a;
     753             : 
     754           0 :         a.full = dfixed_const(1000);
     755           0 :         yclk.full = dfixed_const(wm->yclk);
     756           0 :         yclk.full = dfixed_div(yclk, a);
     757           0 :         dram_channels.full = dfixed_const(wm->dram_channels * 4);
     758           0 :         a.full = dfixed_const(10);
     759           0 :         dram_efficiency.full = dfixed_const(7);
     760           0 :         dram_efficiency.full = dfixed_div(dram_efficiency, a);
     761           0 :         bandwidth.full = dfixed_mul(dram_channels, yclk);
     762           0 :         bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
     763             : 
     764           0 :         return dfixed_trunc(bandwidth);
     765             : }
     766             : 
     767             : /**
     768             :  * dce_v11_0_dram_bandwidth_for_display - get the dram bandwidth for display
     769             :  *
     770             :  * @wm: watermark calculation data
     771             :  *
     772             :  * Calculate the dram bandwidth used for display (CIK).
     773             :  * Used for display watermark bandwidth calculations
     774             :  * Returns the dram bandwidth for display in MBytes/s
     775             :  */
     776             : static u32 dce_v11_0_dram_bandwidth_for_display(struct dce10_wm_params *wm)
     777             : {
     778             :         /* Calculate DRAM Bandwidth and the part allocated to display. */
     779             :         fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
     780             :         fixed20_12 yclk, dram_channels, bandwidth;
     781             :         fixed20_12 a;
     782             : 
     783           0 :         a.full = dfixed_const(1000);
     784           0 :         yclk.full = dfixed_const(wm->yclk);
     785           0 :         yclk.full = dfixed_div(yclk, a);
     786           0 :         dram_channels.full = dfixed_const(wm->dram_channels * 4);
     787           0 :         a.full = dfixed_const(10);
     788           0 :         disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
     789           0 :         disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
     790           0 :         bandwidth.full = dfixed_mul(dram_channels, yclk);
     791           0 :         bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
     792             : 
     793           0 :         return dfixed_trunc(bandwidth);
     794             : }
     795             : 
     796             : /**
     797             :  * dce_v11_0_data_return_bandwidth - get the data return bandwidth
     798             :  *
     799             :  * @wm: watermark calculation data
     800             :  *
     801             :  * Calculate the data return bandwidth used for display (CIK).
     802             :  * Used for display watermark bandwidth calculations
     803             :  * Returns the data return bandwidth in MBytes/s
     804             :  */
     805             : static u32 dce_v11_0_data_return_bandwidth(struct dce10_wm_params *wm)
     806             : {
     807             :         /* Calculate the display Data return Bandwidth */
     808             :         fixed20_12 return_efficiency; /* 0.8 */
     809             :         fixed20_12 sclk, bandwidth;
     810             :         fixed20_12 a;
     811             : 
     812           0 :         a.full = dfixed_const(1000);
     813           0 :         sclk.full = dfixed_const(wm->sclk);
     814           0 :         sclk.full = dfixed_div(sclk, a);
     815           0 :         a.full = dfixed_const(10);
     816           0 :         return_efficiency.full = dfixed_const(8);
     817           0 :         return_efficiency.full = dfixed_div(return_efficiency, a);
     818           0 :         a.full = dfixed_const(32);
     819           0 :         bandwidth.full = dfixed_mul(a, sclk);
     820           0 :         bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
     821             : 
     822           0 :         return dfixed_trunc(bandwidth);
     823             : }
     824             : 
     825             : /**
     826             :  * dce_v11_0_dmif_request_bandwidth - get the dmif bandwidth
     827             :  *
     828             :  * @wm: watermark calculation data
     829             :  *
     830             :  * Calculate the dmif bandwidth used for display (CIK).
     831             :  * Used for display watermark bandwidth calculations
     832             :  * Returns the dmif bandwidth in MBytes/s
     833             :  */
     834             : static u32 dce_v11_0_dmif_request_bandwidth(struct dce10_wm_params *wm)
     835             : {
     836             :         /* Calculate the DMIF Request Bandwidth */
     837             :         fixed20_12 disp_clk_request_efficiency; /* 0.8 */
     838             :         fixed20_12 disp_clk, bandwidth;
     839             :         fixed20_12 a, b;
     840             : 
     841           0 :         a.full = dfixed_const(1000);
     842           0 :         disp_clk.full = dfixed_const(wm->disp_clk);
     843           0 :         disp_clk.full = dfixed_div(disp_clk, a);
     844           0 :         a.full = dfixed_const(32);
     845           0 :         b.full = dfixed_mul(a, disp_clk);
     846             : 
     847           0 :         a.full = dfixed_const(10);
     848           0 :         disp_clk_request_efficiency.full = dfixed_const(8);
     849           0 :         disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
     850             : 
     851           0 :         bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
     852             : 
     853           0 :         return dfixed_trunc(bandwidth);
     854             : }
     855             : 
     856             : /**
     857             :  * dce_v11_0_available_bandwidth - get the min available bandwidth
     858             :  *
     859             :  * @wm: watermark calculation data
     860             :  *
     861             :  * Calculate the min available bandwidth used for display (CIK).
     862             :  * Used for display watermark bandwidth calculations
     863             :  * Returns the min available bandwidth in MBytes/s
     864             :  */
     865           0 : static u32 dce_v11_0_available_bandwidth(struct dce10_wm_params *wm)
     866             : {
     867             :         /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
     868           0 :         u32 dram_bandwidth = dce_v11_0_dram_bandwidth(wm);
     869           0 :         u32 data_return_bandwidth = dce_v11_0_data_return_bandwidth(wm);
     870           0 :         u32 dmif_req_bandwidth = dce_v11_0_dmif_request_bandwidth(wm);
     871             : 
     872           0 :         return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
     873             : }
     874             : 
     875             : /**
     876             :  * dce_v11_0_average_bandwidth - get the average available bandwidth
     877             :  *
     878             :  * @wm: watermark calculation data
     879             :  *
     880             :  * Calculate the average available bandwidth used for display (CIK).
     881             :  * Used for display watermark bandwidth calculations
     882             :  * Returns the average available bandwidth in MBytes/s
     883             :  */
     884           0 : static u32 dce_v11_0_average_bandwidth(struct dce10_wm_params *wm)
     885             : {
     886             :         /* Calculate the display mode Average Bandwidth
     887             :          * DisplayMode should contain the source and destination dimensions,
     888             :          * timing, etc.
     889             :          */
     890             :         fixed20_12 bpp;
     891             :         fixed20_12 line_time;
     892             :         fixed20_12 src_width;
     893             :         fixed20_12 bandwidth;
     894             :         fixed20_12 a;
     895             : 
     896           0 :         a.full = dfixed_const(1000);
     897           0 :         line_time.full = dfixed_const(wm->active_time + wm->blank_time);
     898           0 :         line_time.full = dfixed_div(line_time, a);
     899           0 :         bpp.full = dfixed_const(wm->bytes_per_pixel);
     900           0 :         src_width.full = dfixed_const(wm->src_width);
     901           0 :         bandwidth.full = dfixed_mul(src_width, bpp);
     902           0 :         bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
     903           0 :         bandwidth.full = dfixed_div(bandwidth, line_time);
     904             : 
     905           0 :         return dfixed_trunc(bandwidth);
     906             : }
     907             : 
     908             : /**
     909             :  * dce_v11_0_latency_watermark - get the latency watermark
     910             :  *
     911             :  * @wm: watermark calculation data
     912             :  *
     913             :  * Calculate the latency watermark (CIK).
     914             :  * Used for display watermark bandwidth calculations
     915             :  * Returns the latency watermark in ns
     916             :  */
     917           0 : static u32 dce_v11_0_latency_watermark(struct dce10_wm_params *wm)
     918             : {
     919             :         /* First calculate the latency in ns */
     920           0 :         u32 mc_latency = 2000; /* 2000 ns. */
     921           0 :         u32 available_bandwidth = dce_v11_0_available_bandwidth(wm);
     922           0 :         u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
     923           0 :         u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
     924           0 :         u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
     925           0 :         u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
     926           0 :                 (wm->num_heads * cursor_line_pair_return_time);
     927           0 :         u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
     928             :         u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
     929           0 :         u32 tmp, dmif_size = 12288;
     930             :         fixed20_12 a, b, c;
     931             : 
     932           0 :         if (wm->num_heads == 0)
     933             :                 return 0;
     934             : 
     935           0 :         a.full = dfixed_const(2);
     936           0 :         b.full = dfixed_const(1);
     937           0 :         if ((wm->vsc.full > a.full) ||
     938           0 :             ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
     939           0 :             (wm->vtaps >= 5) ||
     940           0 :             ((wm->vsc.full >= a.full) && wm->interlaced))
     941             :                 max_src_lines_per_dst_line = 4;
     942             :         else
     943           0 :                 max_src_lines_per_dst_line = 2;
     944             : 
     945           0 :         a.full = dfixed_const(available_bandwidth);
     946           0 :         b.full = dfixed_const(wm->num_heads);
     947           0 :         a.full = dfixed_div(a, b);
     948           0 :         tmp = div_u64((u64) dmif_size * (u64) wm->disp_clk, mc_latency + 512);
     949           0 :         tmp = min(dfixed_trunc(a), tmp);
     950             : 
     951           0 :         lb_fill_bw = min(tmp, wm->disp_clk * wm->bytes_per_pixel / 1000);
     952             : 
     953           0 :         a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
     954           0 :         b.full = dfixed_const(1000);
     955           0 :         c.full = dfixed_const(lb_fill_bw);
     956           0 :         b.full = dfixed_div(c, b);
     957           0 :         a.full = dfixed_div(a, b);
     958           0 :         line_fill_time = dfixed_trunc(a);
     959             : 
     960           0 :         if (line_fill_time < wm->active_time)
     961             :                 return latency;
     962             :         else
     963           0 :                 return latency + (line_fill_time - wm->active_time);
     964             : 
     965             : }
     966             : 
     967             : /**
     968             :  * dce_v11_0_average_bandwidth_vs_dram_bandwidth_for_display - check
     969             :  * average and available dram bandwidth
     970             :  *
     971             :  * @wm: watermark calculation data
     972             :  *
     973             :  * Check if the display average bandwidth fits in the display
     974             :  * dram bandwidth (CIK).
     975             :  * Used for display watermark bandwidth calculations
     976             :  * Returns true if the display fits, false if not.
     977             :  */
     978           0 : static bool dce_v11_0_average_bandwidth_vs_dram_bandwidth_for_display(struct dce10_wm_params *wm)
     979             : {
     980           0 :         if (dce_v11_0_average_bandwidth(wm) <=
     981           0 :             (dce_v11_0_dram_bandwidth_for_display(wm) / wm->num_heads))
     982             :                 return true;
     983             :         else
     984           0 :                 return false;
     985             : }
     986             : 
     987             : /**
     988             :  * dce_v11_0_average_bandwidth_vs_available_bandwidth - check
     989             :  * average and available bandwidth
     990             :  *
     991             :  * @wm: watermark calculation data
     992             :  *
     993             :  * Check if the display average bandwidth fits in the display
     994             :  * available bandwidth (CIK).
     995             :  * Used for display watermark bandwidth calculations
     996             :  * Returns true if the display fits, false if not.
     997             :  */
     998           0 : static bool dce_v11_0_average_bandwidth_vs_available_bandwidth(struct dce10_wm_params *wm)
     999             : {
    1000           0 :         if (dce_v11_0_average_bandwidth(wm) <=
    1001           0 :             (dce_v11_0_available_bandwidth(wm) / wm->num_heads))
    1002             :                 return true;
    1003             :         else
    1004           0 :                 return false;
    1005             : }
    1006             : 
    1007             : /**
    1008             :  * dce_v11_0_check_latency_hiding - check latency hiding
    1009             :  *
    1010             :  * @wm: watermark calculation data
    1011             :  *
    1012             :  * Check latency hiding (CIK).
    1013             :  * Used for display watermark bandwidth calculations
    1014             :  * Returns true if the display fits, false if not.
    1015             :  */
    1016           0 : static bool dce_v11_0_check_latency_hiding(struct dce10_wm_params *wm)
    1017             : {
    1018           0 :         u32 lb_partitions = wm->lb_size / wm->src_width;
    1019           0 :         u32 line_time = wm->active_time + wm->blank_time;
    1020             :         u32 latency_tolerant_lines;
    1021             :         u32 latency_hiding;
    1022             :         fixed20_12 a;
    1023             : 
    1024           0 :         a.full = dfixed_const(1);
    1025           0 :         if (wm->vsc.full > a.full)
    1026             :                 latency_tolerant_lines = 1;
    1027             :         else {
    1028           0 :                 if (lb_partitions <= (wm->vtaps + 1))
    1029             :                         latency_tolerant_lines = 1;
    1030             :                 else
    1031           0 :                         latency_tolerant_lines = 2;
    1032             :         }
    1033             : 
    1034           0 :         latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
    1035             : 
    1036           0 :         if (dce_v11_0_latency_watermark(wm) <= latency_hiding)
    1037             :                 return true;
    1038             :         else
    1039           0 :                 return false;
    1040             : }
    1041             : 
    1042             : /**
    1043             :  * dce_v11_0_program_watermarks - program display watermarks
    1044             :  *
    1045             :  * @adev: amdgpu_device pointer
    1046             :  * @amdgpu_crtc: the selected display controller
    1047             :  * @lb_size: line buffer size
    1048             :  * @num_heads: number of display controllers in use
    1049             :  *
    1050             :  * Calculate and program the display watermarks for the
    1051             :  * selected display controller (CIK).
    1052             :  */
    1053           0 : static void dce_v11_0_program_watermarks(struct amdgpu_device *adev,
    1054             :                                         struct amdgpu_crtc *amdgpu_crtc,
    1055             :                                         u32 lb_size, u32 num_heads)
    1056             : {
    1057           0 :         struct drm_display_mode *mode = &amdgpu_crtc->base.mode;
    1058             :         struct dce10_wm_params wm_low, wm_high;
    1059             :         u32 active_time;
    1060           0 :         u32 line_time = 0;
    1061           0 :         u32 latency_watermark_a = 0, latency_watermark_b = 0;
    1062           0 :         u32 tmp, wm_mask, lb_vblank_lead_lines = 0;
    1063             : 
    1064           0 :         if (amdgpu_crtc->base.enabled && num_heads && mode) {
    1065           0 :                 active_time = (u32) div_u64((u64)mode->crtc_hdisplay * 1000000,
    1066           0 :                                             (u32)mode->clock);
    1067           0 :                 line_time = (u32) div_u64((u64)mode->crtc_htotal * 1000000,
    1068             :                                           (u32)mode->clock);
    1069           0 :                 line_time = min(line_time, (u32)65535);
    1070             : 
    1071             :                 /* watermark for high clocks */
    1072           0 :                 if (adev->pm.dpm_enabled) {
    1073           0 :                         wm_high.yclk =
    1074           0 :                                 amdgpu_dpm_get_mclk(adev, false) * 10;
    1075           0 :                         wm_high.sclk =
    1076           0 :                                 amdgpu_dpm_get_sclk(adev, false) * 10;
    1077             :                 } else {
    1078           0 :                         wm_high.yclk = adev->pm.current_mclk * 10;
    1079           0 :                         wm_high.sclk = adev->pm.current_sclk * 10;
    1080             :                 }
    1081             : 
    1082           0 :                 wm_high.disp_clk = mode->clock;
    1083           0 :                 wm_high.src_width = mode->crtc_hdisplay;
    1084           0 :                 wm_high.active_time = active_time;
    1085           0 :                 wm_high.blank_time = line_time - wm_high.active_time;
    1086           0 :                 wm_high.interlaced = false;
    1087           0 :                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    1088           0 :                         wm_high.interlaced = true;
    1089           0 :                 wm_high.vsc = amdgpu_crtc->vsc;
    1090           0 :                 wm_high.vtaps = 1;
    1091           0 :                 if (amdgpu_crtc->rmx_type != RMX_OFF)
    1092           0 :                         wm_high.vtaps = 2;
    1093           0 :                 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
    1094           0 :                 wm_high.lb_size = lb_size;
    1095           0 :                 wm_high.dram_channels = cik_get_number_of_dram_channels(adev);
    1096           0 :                 wm_high.num_heads = num_heads;
    1097             : 
    1098             :                 /* set for high clocks */
    1099           0 :                 latency_watermark_a = min(dce_v11_0_latency_watermark(&wm_high), (u32)65535);
    1100             : 
    1101             :                 /* possibly force display priority to high */
    1102             :                 /* should really do this at mode validation time... */
    1103           0 :                 if (!dce_v11_0_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
    1104           0 :                     !dce_v11_0_average_bandwidth_vs_available_bandwidth(&wm_high) ||
    1105           0 :                     !dce_v11_0_check_latency_hiding(&wm_high) ||
    1106           0 :                     (adev->mode_info.disp_priority == 2)) {
    1107           0 :                         DRM_DEBUG_KMS("force priority to high\n");
    1108             :                 }
    1109             : 
    1110             :                 /* watermark for low clocks */
    1111           0 :                 if (adev->pm.dpm_enabled) {
    1112           0 :                         wm_low.yclk =
    1113           0 :                                 amdgpu_dpm_get_mclk(adev, true) * 10;
    1114           0 :                         wm_low.sclk =
    1115           0 :                                 amdgpu_dpm_get_sclk(adev, true) * 10;
    1116             :                 } else {
    1117           0 :                         wm_low.yclk = adev->pm.current_mclk * 10;
    1118           0 :                         wm_low.sclk = adev->pm.current_sclk * 10;
    1119             :                 }
    1120             : 
    1121           0 :                 wm_low.disp_clk = mode->clock;
    1122           0 :                 wm_low.src_width = mode->crtc_hdisplay;
    1123           0 :                 wm_low.active_time = active_time;
    1124           0 :                 wm_low.blank_time = line_time - wm_low.active_time;
    1125           0 :                 wm_low.interlaced = false;
    1126           0 :                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    1127           0 :                         wm_low.interlaced = true;
    1128           0 :                 wm_low.vsc = amdgpu_crtc->vsc;
    1129           0 :                 wm_low.vtaps = 1;
    1130           0 :                 if (amdgpu_crtc->rmx_type != RMX_OFF)
    1131           0 :                         wm_low.vtaps = 2;
    1132           0 :                 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
    1133           0 :                 wm_low.lb_size = lb_size;
    1134           0 :                 wm_low.dram_channels = cik_get_number_of_dram_channels(adev);
    1135           0 :                 wm_low.num_heads = num_heads;
    1136             : 
    1137             :                 /* set for low clocks */
    1138           0 :                 latency_watermark_b = min(dce_v11_0_latency_watermark(&wm_low), (u32)65535);
    1139             : 
    1140             :                 /* possibly force display priority to high */
    1141             :                 /* should really do this at mode validation time... */
    1142           0 :                 if (!dce_v11_0_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
    1143           0 :                     !dce_v11_0_average_bandwidth_vs_available_bandwidth(&wm_low) ||
    1144           0 :                     !dce_v11_0_check_latency_hiding(&wm_low) ||
    1145           0 :                     (adev->mode_info.disp_priority == 2)) {
    1146           0 :                         DRM_DEBUG_KMS("force priority to high\n");
    1147             :                 }
    1148           0 :                 lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
    1149             :         }
    1150             : 
    1151             :         /* select wm A */
    1152           0 :         wm_mask = RREG32(mmDPG_WATERMARK_MASK_CONTROL + amdgpu_crtc->crtc_offset);
    1153           0 :         tmp = REG_SET_FIELD(wm_mask, DPG_WATERMARK_MASK_CONTROL, URGENCY_WATERMARK_MASK, 1);
    1154           0 :         WREG32(mmDPG_WATERMARK_MASK_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    1155           0 :         tmp = RREG32(mmDPG_PIPE_URGENCY_CONTROL + amdgpu_crtc->crtc_offset);
    1156           0 :         tmp = REG_SET_FIELD(tmp, DPG_PIPE_URGENCY_CONTROL, URGENCY_LOW_WATERMARK, latency_watermark_a);
    1157           0 :         tmp = REG_SET_FIELD(tmp, DPG_PIPE_URGENCY_CONTROL, URGENCY_HIGH_WATERMARK, line_time);
    1158           0 :         WREG32(mmDPG_PIPE_URGENCY_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    1159             :         /* select wm B */
    1160           0 :         tmp = REG_SET_FIELD(wm_mask, DPG_WATERMARK_MASK_CONTROL, URGENCY_WATERMARK_MASK, 2);
    1161           0 :         WREG32(mmDPG_WATERMARK_MASK_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    1162           0 :         tmp = RREG32(mmDPG_PIPE_URGENCY_CONTROL + amdgpu_crtc->crtc_offset);
    1163           0 :         tmp = REG_SET_FIELD(tmp, DPG_PIPE_URGENCY_CONTROL, URGENCY_LOW_WATERMARK, latency_watermark_b);
    1164           0 :         tmp = REG_SET_FIELD(tmp, DPG_PIPE_URGENCY_CONTROL, URGENCY_HIGH_WATERMARK, line_time);
    1165           0 :         WREG32(mmDPG_PIPE_URGENCY_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    1166             :         /* restore original selection */
    1167           0 :         WREG32(mmDPG_WATERMARK_MASK_CONTROL + amdgpu_crtc->crtc_offset, wm_mask);
    1168             : 
    1169             :         /* save values for DPM */
    1170           0 :         amdgpu_crtc->line_time = line_time;
    1171           0 :         amdgpu_crtc->wm_high = latency_watermark_a;
    1172           0 :         amdgpu_crtc->wm_low = latency_watermark_b;
    1173             :         /* Save number of lines the linebuffer leads before the scanout */
    1174           0 :         amdgpu_crtc->lb_vblank_lead_lines = lb_vblank_lead_lines;
    1175           0 : }
    1176             : 
    1177             : /**
    1178             :  * dce_v11_0_bandwidth_update - program display watermarks
    1179             :  *
    1180             :  * @adev: amdgpu_device pointer
    1181             :  *
    1182             :  * Calculate and program the display watermarks and line
    1183             :  * buffer allocation (CIK).
    1184             :  */
    1185           0 : static void dce_v11_0_bandwidth_update(struct amdgpu_device *adev)
    1186             : {
    1187           0 :         struct drm_display_mode *mode = NULL;
    1188           0 :         u32 num_heads = 0, lb_size;
    1189             :         int i;
    1190             : 
    1191           0 :         amdgpu_display_update_priority(adev);
    1192             : 
    1193           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
    1194           0 :                 if (adev->mode_info.crtcs[i]->base.enabled)
    1195           0 :                         num_heads++;
    1196             :         }
    1197           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
    1198           0 :                 mode = &adev->mode_info.crtcs[i]->base.mode;
    1199           0 :                 lb_size = dce_v11_0_line_buffer_adjust(adev, adev->mode_info.crtcs[i], mode);
    1200           0 :                 dce_v11_0_program_watermarks(adev, adev->mode_info.crtcs[i],
    1201             :                                             lb_size, num_heads);
    1202             :         }
    1203           0 : }
    1204             : 
    1205             : static void dce_v11_0_audio_get_connected_pins(struct amdgpu_device *adev)
    1206             : {
    1207             :         int i;
    1208             :         u32 offset, tmp;
    1209             : 
    1210           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
    1211           0 :                 offset = adev->mode_info.audio.pin[i].offset;
    1212           0 :                 tmp = RREG32_AUDIO_ENDPT(offset,
    1213             :                                          ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
    1214           0 :                 if (((tmp &
    1215           0 :                 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY_MASK) >>
    1216             :                 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY__SHIFT) == 1)
    1217           0 :                         adev->mode_info.audio.pin[i].connected = false;
    1218             :                 else
    1219           0 :                         adev->mode_info.audio.pin[i].connected = true;
    1220             :         }
    1221             : }
    1222             : 
    1223           0 : static struct amdgpu_audio_pin *dce_v11_0_audio_get_pin(struct amdgpu_device *adev)
    1224             : {
    1225             :         int i;
    1226             : 
    1227             :         dce_v11_0_audio_get_connected_pins(adev);
    1228             : 
    1229           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
    1230           0 :                 if (adev->mode_info.audio.pin[i].connected)
    1231           0 :                         return &adev->mode_info.audio.pin[i];
    1232             :         }
    1233           0 :         DRM_ERROR("No connected audio pins found!\n");
    1234           0 :         return NULL;
    1235             : }
    1236             : 
    1237           0 : static void dce_v11_0_afmt_audio_select_pin(struct drm_encoder *encoder)
    1238             : {
    1239           0 :         struct amdgpu_device *adev = drm_to_adev(encoder->dev);
    1240           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1241           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1242             :         u32 tmp;
    1243             : 
    1244           0 :         if (!dig || !dig->afmt || !dig->afmt->pin)
    1245             :                 return;
    1246             : 
    1247           0 :         tmp = RREG32(mmAFMT_AUDIO_SRC_CONTROL + dig->afmt->offset);
    1248           0 :         tmp = REG_SET_FIELD(tmp, AFMT_AUDIO_SRC_CONTROL, AFMT_AUDIO_SRC_SELECT, dig->afmt->pin->id);
    1249           0 :         WREG32(mmAFMT_AUDIO_SRC_CONTROL + dig->afmt->offset, tmp);
    1250             : }
    1251             : 
    1252           0 : static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
    1253             :                                                 struct drm_display_mode *mode)
    1254             : {
    1255           0 :         struct drm_device *dev = encoder->dev;
    1256           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1257           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1258           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1259             :         struct drm_connector *connector;
    1260             :         struct drm_connector_list_iter iter;
    1261           0 :         struct amdgpu_connector *amdgpu_connector = NULL;
    1262             :         u32 tmp;
    1263           0 :         int interlace = 0;
    1264             : 
    1265           0 :         if (!dig || !dig->afmt || !dig->afmt->pin)
    1266           0 :                 return;
    1267             : 
    1268           0 :         drm_connector_list_iter_begin(dev, &iter);
    1269           0 :         drm_for_each_connector_iter(connector, &iter) {
    1270           0 :                 if (connector->encoder == encoder) {
    1271             :                         amdgpu_connector = to_amdgpu_connector(connector);
    1272             :                         break;
    1273             :                 }
    1274             :         }
    1275           0 :         drm_connector_list_iter_end(&iter);
    1276             : 
    1277           0 :         if (!amdgpu_connector) {
    1278           0 :                 DRM_ERROR("Couldn't find encoder's connector\n");
    1279             :                 return;
    1280             :         }
    1281             : 
    1282           0 :         if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    1283           0 :                 interlace = 1;
    1284           0 :         if (connector->latency_present[interlace]) {
    1285           0 :                 tmp = REG_SET_FIELD(0, AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
    1286             :                                     VIDEO_LIPSYNC, connector->video_latency[interlace]);
    1287           0 :                 tmp = REG_SET_FIELD(0, AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
    1288             :                                     AUDIO_LIPSYNC, connector->audio_latency[interlace]);
    1289             :         } else {
    1290             :                 tmp = REG_SET_FIELD(0, AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
    1291             :                                     VIDEO_LIPSYNC, 0);
    1292             :                 tmp = REG_SET_FIELD(0, AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
    1293             :                                     AUDIO_LIPSYNC, 0);
    1294             :         }
    1295           0 :         WREG32_AUDIO_ENDPT(dig->afmt->pin->offset,
    1296             :                            ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp);
    1297             : }
    1298             : 
    1299           0 : static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
    1300             : {
    1301           0 :         struct drm_device *dev = encoder->dev;
    1302           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1303           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1304           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1305             :         struct drm_connector *connector;
    1306             :         struct drm_connector_list_iter iter;
    1307           0 :         struct amdgpu_connector *amdgpu_connector = NULL;
    1308             :         u32 tmp;
    1309           0 :         u8 *sadb = NULL;
    1310             :         int sad_count;
    1311             : 
    1312           0 :         if (!dig || !dig->afmt || !dig->afmt->pin)
    1313           0 :                 return;
    1314             : 
    1315           0 :         drm_connector_list_iter_begin(dev, &iter);
    1316           0 :         drm_for_each_connector_iter(connector, &iter) {
    1317           0 :                 if (connector->encoder == encoder) {
    1318             :                         amdgpu_connector = to_amdgpu_connector(connector);
    1319             :                         break;
    1320             :                 }
    1321             :         }
    1322           0 :         drm_connector_list_iter_end(&iter);
    1323             : 
    1324           0 :         if (!amdgpu_connector) {
    1325           0 :                 DRM_ERROR("Couldn't find encoder's connector\n");
    1326           0 :                 return;
    1327             :         }
    1328             : 
    1329           0 :         sad_count = drm_edid_to_speaker_allocation(amdgpu_connector_edid(connector), &sadb);
    1330           0 :         if (sad_count < 0) {
    1331           0 :                 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
    1332           0 :                 sad_count = 0;
    1333             :         }
    1334             : 
    1335             :         /* program the speaker allocation */
    1336           0 :         tmp = RREG32_AUDIO_ENDPT(dig->afmt->pin->offset,
    1337             :                                  ixAZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
    1338           0 :         tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
    1339             :                             DP_CONNECTION, 0);
    1340             :         /* set HDMI mode */
    1341           0 :         tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
    1342             :                             HDMI_CONNECTION, 1);
    1343           0 :         if (sad_count)
    1344           0 :                 tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
    1345             :                                     SPEAKER_ALLOCATION, sadb[0]);
    1346             :         else
    1347           0 :                 tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
    1348             :                                     SPEAKER_ALLOCATION, 5); /* stereo */
    1349           0 :         WREG32_AUDIO_ENDPT(dig->afmt->pin->offset,
    1350             :                            ixAZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp);
    1351             : 
    1352           0 :         kfree(sadb);
    1353             : }
    1354             : 
    1355           0 : static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
    1356             : {
    1357           0 :         struct drm_device *dev = encoder->dev;
    1358           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1359           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1360           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1361             :         struct drm_connector *connector;
    1362             :         struct drm_connector_list_iter iter;
    1363           0 :         struct amdgpu_connector *amdgpu_connector = NULL;
    1364             :         struct cea_sad *sads;
    1365             :         int i, sad_count;
    1366             : 
    1367             :         static const u16 eld_reg_to_type[][2] = {
    1368             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, HDMI_AUDIO_CODING_TYPE_PCM },
    1369             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1, HDMI_AUDIO_CODING_TYPE_AC3 },
    1370             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2, HDMI_AUDIO_CODING_TYPE_MPEG1 },
    1371             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3, HDMI_AUDIO_CODING_TYPE_MP3 },
    1372             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4, HDMI_AUDIO_CODING_TYPE_MPEG2 },
    1373             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5, HDMI_AUDIO_CODING_TYPE_AAC_LC },
    1374             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6, HDMI_AUDIO_CODING_TYPE_DTS },
    1375             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7, HDMI_AUDIO_CODING_TYPE_ATRAC },
    1376             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9, HDMI_AUDIO_CODING_TYPE_EAC3 },
    1377             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10, HDMI_AUDIO_CODING_TYPE_DTS_HD },
    1378             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11, HDMI_AUDIO_CODING_TYPE_MLP },
    1379             :                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
    1380             :         };
    1381             : 
    1382           0 :         if (!dig || !dig->afmt || !dig->afmt->pin)
    1383           0 :                 return;
    1384             : 
    1385           0 :         drm_connector_list_iter_begin(dev, &iter);
    1386           0 :         drm_for_each_connector_iter(connector, &iter) {
    1387           0 :                 if (connector->encoder == encoder) {
    1388             :                         amdgpu_connector = to_amdgpu_connector(connector);
    1389             :                         break;
    1390             :                 }
    1391             :         }
    1392           0 :         drm_connector_list_iter_end(&iter);
    1393             : 
    1394           0 :         if (!amdgpu_connector) {
    1395           0 :                 DRM_ERROR("Couldn't find encoder's connector\n");
    1396           0 :                 return;
    1397             :         }
    1398             : 
    1399           0 :         sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads);
    1400           0 :         if (sad_count < 0)
    1401           0 :                 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
    1402           0 :         if (sad_count <= 0)
    1403             :                 return;
    1404           0 :         BUG_ON(!sads);
    1405             : 
    1406           0 :         for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) {
    1407             :                 u32 tmp = 0;
    1408             :                 u8 stereo_freqs = 0;
    1409             :                 int max_channels = -1;
    1410             :                 int j;
    1411             : 
    1412           0 :                 for (j = 0; j < sad_count; j++) {
    1413           0 :                         struct cea_sad *sad = &sads[j];
    1414             : 
    1415           0 :                         if (sad->format == eld_reg_to_type[i][1]) {
    1416           0 :                                 if (sad->channels > max_channels) {
    1417           0 :                                         tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
    1418             :                                                             MAX_CHANNELS, sad->channels);
    1419           0 :                                         tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
    1420             :                                                             DESCRIPTOR_BYTE_2, sad->byte2);
    1421           0 :                                         tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
    1422             :                                                             SUPPORTED_FREQUENCIES, sad->freq);
    1423           0 :                                         max_channels = sad->channels;
    1424             :                                 }
    1425             : 
    1426           0 :                                 if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM)
    1427           0 :                                         stereo_freqs |= sad->freq;
    1428             :                                 else
    1429             :                                         break;
    1430             :                         }
    1431             :                 }
    1432             : 
    1433           0 :                 tmp = REG_SET_FIELD(tmp, AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
    1434             :                                     SUPPORTED_FREQUENCIES_STEREO, stereo_freqs);
    1435           0 :                 WREG32_AUDIO_ENDPT(dig->afmt->pin->offset, eld_reg_to_type[i][0], tmp);
    1436             :         }
    1437             : 
    1438           0 :         kfree(sads);
    1439             : }
    1440             : 
    1441             : static void dce_v11_0_audio_enable(struct amdgpu_device *adev,
    1442             :                                   struct amdgpu_audio_pin *pin,
    1443             :                                   bool enable)
    1444             : {
    1445           0 :         if (!pin)
    1446             :                 return;
    1447             : 
    1448           0 :         WREG32_AUDIO_ENDPT(pin->offset, ixAZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
    1449             :                            enable ? AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__AUDIO_ENABLED_MASK : 0);
    1450             : }
    1451             : 
    1452             : static const u32 pin_offsets[] =
    1453             : {
    1454             :         AUD0_REGISTER_OFFSET,
    1455             :         AUD1_REGISTER_OFFSET,
    1456             :         AUD2_REGISTER_OFFSET,
    1457             :         AUD3_REGISTER_OFFSET,
    1458             :         AUD4_REGISTER_OFFSET,
    1459             :         AUD5_REGISTER_OFFSET,
    1460             :         AUD6_REGISTER_OFFSET,
    1461             :         AUD7_REGISTER_OFFSET,
    1462             : };
    1463             : 
    1464           0 : static int dce_v11_0_audio_init(struct amdgpu_device *adev)
    1465             : {
    1466             :         int i;
    1467             : 
    1468           0 :         if (!amdgpu_audio)
    1469             :                 return 0;
    1470             : 
    1471           0 :         adev->mode_info.audio.enabled = true;
    1472             : 
    1473           0 :         switch (adev->asic_type) {
    1474             :         case CHIP_CARRIZO:
    1475             :         case CHIP_STONEY:
    1476           0 :                 adev->mode_info.audio.num_pins = 7;
    1477           0 :                 break;
    1478             :         case CHIP_POLARIS10:
    1479             :         case CHIP_VEGAM:
    1480           0 :                 adev->mode_info.audio.num_pins = 8;
    1481           0 :                 break;
    1482             :         case CHIP_POLARIS11:
    1483             :         case CHIP_POLARIS12:
    1484           0 :                 adev->mode_info.audio.num_pins = 6;
    1485           0 :                 break;
    1486             :         default:
    1487             :                 return -EINVAL;
    1488             :         }
    1489             : 
    1490           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
    1491           0 :                 adev->mode_info.audio.pin[i].channels = -1;
    1492           0 :                 adev->mode_info.audio.pin[i].rate = -1;
    1493           0 :                 adev->mode_info.audio.pin[i].bits_per_sample = -1;
    1494           0 :                 adev->mode_info.audio.pin[i].status_bits = 0;
    1495           0 :                 adev->mode_info.audio.pin[i].category_code = 0;
    1496           0 :                 adev->mode_info.audio.pin[i].connected = false;
    1497           0 :                 adev->mode_info.audio.pin[i].offset = pin_offsets[i];
    1498           0 :                 adev->mode_info.audio.pin[i].id = i;
    1499             :                 /* disable audio.  it will be set up later */
    1500             :                 /* XXX remove once we switch to ip funcs */
    1501           0 :                 dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
    1502             :         }
    1503             : 
    1504             :         return 0;
    1505             : }
    1506             : 
    1507           0 : static void dce_v11_0_audio_fini(struct amdgpu_device *adev)
    1508             : {
    1509             :         int i;
    1510             : 
    1511           0 :         if (!amdgpu_audio)
    1512             :                 return;
    1513             : 
    1514           0 :         if (!adev->mode_info.audio.enabled)
    1515             :                 return;
    1516             : 
    1517           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++)
    1518           0 :                 dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
    1519             : 
    1520           0 :         adev->mode_info.audio.enabled = false;
    1521             : }
    1522             : 
    1523             : /*
    1524             :  * update the N and CTS parameters for a given pixel clock rate
    1525             :  */
    1526           0 : static void dce_v11_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock)
    1527             : {
    1528           0 :         struct drm_device *dev = encoder->dev;
    1529           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1530           0 :         struct amdgpu_afmt_acr acr = amdgpu_afmt_acr(clock);
    1531           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1532           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1533             :         u32 tmp;
    1534             : 
    1535           0 :         tmp = RREG32(mmHDMI_ACR_32_0 + dig->afmt->offset);
    1536           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_32_0, HDMI_ACR_CTS_32, acr.cts_32khz);
    1537           0 :         WREG32(mmHDMI_ACR_32_0 + dig->afmt->offset, tmp);
    1538           0 :         tmp = RREG32(mmHDMI_ACR_32_1 + dig->afmt->offset);
    1539           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_32_1, HDMI_ACR_N_32, acr.n_32khz);
    1540           0 :         WREG32(mmHDMI_ACR_32_1 + dig->afmt->offset, tmp);
    1541             : 
    1542           0 :         tmp = RREG32(mmHDMI_ACR_44_0 + dig->afmt->offset);
    1543           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_44_0, HDMI_ACR_CTS_44, acr.cts_44_1khz);
    1544           0 :         WREG32(mmHDMI_ACR_44_0 + dig->afmt->offset, tmp);
    1545           0 :         tmp = RREG32(mmHDMI_ACR_44_1 + dig->afmt->offset);
    1546           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_44_1, HDMI_ACR_N_44, acr.n_44_1khz);
    1547           0 :         WREG32(mmHDMI_ACR_44_1 + dig->afmt->offset, tmp);
    1548             : 
    1549           0 :         tmp = RREG32(mmHDMI_ACR_48_0 + dig->afmt->offset);
    1550           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_48_0, HDMI_ACR_CTS_48, acr.cts_48khz);
    1551           0 :         WREG32(mmHDMI_ACR_48_0 + dig->afmt->offset, tmp);
    1552           0 :         tmp = RREG32(mmHDMI_ACR_48_1 + dig->afmt->offset);
    1553           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_48_1, HDMI_ACR_N_48, acr.n_48khz);
    1554           0 :         WREG32(mmHDMI_ACR_48_1 + dig->afmt->offset, tmp);
    1555             : 
    1556           0 : }
    1557             : 
    1558             : /*
    1559             :  * build a HDMI Video Info Frame
    1560             :  */
    1561           0 : static void dce_v11_0_afmt_update_avi_infoframe(struct drm_encoder *encoder,
    1562             :                                                void *buffer, size_t size)
    1563             : {
    1564           0 :         struct drm_device *dev = encoder->dev;
    1565           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1566           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1567           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1568           0 :         uint8_t *frame = buffer + 3;
    1569           0 :         uint8_t *header = buffer;
    1570             : 
    1571           0 :         WREG32(mmAFMT_AVI_INFO0 + dig->afmt->offset,
    1572             :                 frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
    1573           0 :         WREG32(mmAFMT_AVI_INFO1 + dig->afmt->offset,
    1574             :                 frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24));
    1575           0 :         WREG32(mmAFMT_AVI_INFO2 + dig->afmt->offset,
    1576             :                 frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24));
    1577           0 :         WREG32(mmAFMT_AVI_INFO3 + dig->afmt->offset,
    1578             :                 frame[0xC] | (frame[0xD] << 8) | (header[1] << 24));
    1579           0 : }
    1580             : 
    1581           0 : static void dce_v11_0_audio_set_dto(struct drm_encoder *encoder, u32 clock)
    1582             : {
    1583           0 :         struct drm_device *dev = encoder->dev;
    1584           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1585           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1586           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1587           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
    1588           0 :         u32 dto_phase = 24 * 1000;
    1589           0 :         u32 dto_modulo = clock;
    1590             :         u32 tmp;
    1591             : 
    1592           0 :         if (!dig || !dig->afmt)
    1593             :                 return;
    1594             : 
    1595             :         /* XXX two dtos; generally use dto0 for hdmi */
    1596             :         /* Express [24MHz / target pixel clock] as an exact rational
    1597             :          * number (coefficient of two integer numbers.  DCCG_AUDIO_DTOx_PHASE
    1598             :          * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
    1599             :          */
    1600           0 :         tmp = RREG32(mmDCCG_AUDIO_DTO_SOURCE);
    1601           0 :         tmp = REG_SET_FIELD(tmp, DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL,
    1602             :                             amdgpu_crtc->crtc_id);
    1603           0 :         WREG32(mmDCCG_AUDIO_DTO_SOURCE, tmp);
    1604           0 :         WREG32(mmDCCG_AUDIO_DTO0_PHASE, dto_phase);
    1605           0 :         WREG32(mmDCCG_AUDIO_DTO0_MODULE, dto_modulo);
    1606             : }
    1607             : 
    1608             : /*
    1609             :  * update the info frames with the data from the current display mode
    1610             :  */
    1611           0 : static void dce_v11_0_afmt_setmode(struct drm_encoder *encoder,
    1612             :                                   struct drm_display_mode *mode)
    1613             : {
    1614           0 :         struct drm_device *dev = encoder->dev;
    1615           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1616           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1617           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1618           0 :         struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
    1619             :         u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
    1620             :         struct hdmi_avi_infoframe frame;
    1621             :         ssize_t err;
    1622             :         u32 tmp;
    1623           0 :         int bpc = 8;
    1624             : 
    1625           0 :         if (!dig || !dig->afmt)
    1626           0 :                 return;
    1627             : 
    1628             :         /* Silent, r600_hdmi_enable will raise WARN for us */
    1629           0 :         if (!dig->afmt->enabled)
    1630             :                 return;
    1631             : 
    1632             :         /* hdmi deep color mode general control packets setup, if bpc > 8 */
    1633           0 :         if (encoder->crtc) {
    1634           0 :                 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
    1635           0 :                 bpc = amdgpu_crtc->bpc;
    1636             :         }
    1637             : 
    1638             :         /* disable audio prior to setting up hw */
    1639           0 :         dig->afmt->pin = dce_v11_0_audio_get_pin(adev);
    1640           0 :         dce_v11_0_audio_enable(adev, dig->afmt->pin, false);
    1641             : 
    1642           0 :         dce_v11_0_audio_set_dto(encoder, mode->clock);
    1643             : 
    1644           0 :         tmp = RREG32(mmHDMI_VBI_PACKET_CONTROL + dig->afmt->offset);
    1645           0 :         tmp = REG_SET_FIELD(tmp, HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, 1);
    1646           0 :         WREG32(mmHDMI_VBI_PACKET_CONTROL + dig->afmt->offset, tmp); /* send null packets when required */
    1647             : 
    1648           0 :         WREG32(mmAFMT_AUDIO_CRC_CONTROL + dig->afmt->offset, 0x1000);
    1649             : 
    1650           0 :         tmp = RREG32(mmHDMI_CONTROL + dig->afmt->offset);
    1651           0 :         switch (bpc) {
    1652             :         case 0:
    1653             :         case 6:
    1654             :         case 8:
    1655             :         case 16:
    1656             :         default:
    1657           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, 0);
    1658           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
    1659           0 :                 DRM_DEBUG("%s: Disabling hdmi deep color for %d bpc.\n",
    1660             :                           connector->name, bpc);
    1661           0 :                 break;
    1662             :         case 10:
    1663           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, 1);
    1664           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 1);
    1665           0 :                 DRM_DEBUG("%s: Enabling hdmi deep color 30 for 10 bpc.\n",
    1666             :                           connector->name);
    1667           0 :                 break;
    1668             :         case 12:
    1669           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, 1);
    1670           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 2);
    1671           0 :                 DRM_DEBUG("%s: Enabling hdmi deep color 36 for 12 bpc.\n",
    1672             :                           connector->name);
    1673           0 :                 break;
    1674             :         }
    1675           0 :         WREG32(mmHDMI_CONTROL + dig->afmt->offset, tmp);
    1676             : 
    1677           0 :         tmp = RREG32(mmHDMI_VBI_PACKET_CONTROL + dig->afmt->offset);
    1678           0 :         tmp = REG_SET_FIELD(tmp, HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, 1); /* send null packets when required */
    1679           0 :         tmp = REG_SET_FIELD(tmp, HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, 1); /* send general control packets */
    1680           0 :         tmp = REG_SET_FIELD(tmp, HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, 1); /* send general control packets every frame */
    1681           0 :         WREG32(mmHDMI_VBI_PACKET_CONTROL + dig->afmt->offset, tmp);
    1682             : 
    1683           0 :         tmp = RREG32(mmHDMI_INFOFRAME_CONTROL0 + dig->afmt->offset);
    1684             :         /* enable audio info frames (frames won't be set until audio is enabled) */
    1685           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
    1686             :         /* required for audio info values to be updated */
    1687           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_CONT, 1);
    1688           0 :         WREG32(mmHDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, tmp);
    1689             : 
    1690           0 :         tmp = RREG32(mmAFMT_INFOFRAME_CONTROL0 + dig->afmt->offset);
    1691             :         /* required for audio info values to be updated */
    1692           0 :         tmp = REG_SET_FIELD(tmp, AFMT_INFOFRAME_CONTROL0, AFMT_AUDIO_INFO_UPDATE, 1);
    1693           0 :         WREG32(mmAFMT_INFOFRAME_CONTROL0 + dig->afmt->offset, tmp);
    1694             : 
    1695           0 :         tmp = RREG32(mmHDMI_INFOFRAME_CONTROL1 + dig->afmt->offset);
    1696             :         /* anything other than 0 */
    1697           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, 2);
    1698           0 :         WREG32(mmHDMI_INFOFRAME_CONTROL1 + dig->afmt->offset, tmp);
    1699             : 
    1700           0 :         WREG32(mmHDMI_GC + dig->afmt->offset, 0); /* unset HDMI_GC_AVMUTE */
    1701             : 
    1702           0 :         tmp = RREG32(mmHDMI_AUDIO_PACKET_CONTROL + dig->afmt->offset);
    1703             :         /* set the default audio delay */
    1704           0 :         tmp = REG_SET_FIELD(tmp, HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, 1);
    1705             :         /* should be suffient for all audio modes and small enough for all hblanks */
    1706           0 :         tmp = REG_SET_FIELD(tmp, HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_PACKETS_PER_LINE, 3);
    1707           0 :         WREG32(mmHDMI_AUDIO_PACKET_CONTROL + dig->afmt->offset, tmp);
    1708             : 
    1709           0 :         tmp = RREG32(mmAFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset);
    1710             :         /* allow 60958 channel status fields to be updated */
    1711           0 :         tmp = REG_SET_FIELD(tmp, AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, 1);
    1712           0 :         WREG32(mmAFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, tmp);
    1713             : 
    1714           0 :         tmp = RREG32(mmHDMI_ACR_PACKET_CONTROL + dig->afmt->offset);
    1715           0 :         if (bpc > 8)
    1716             :                 /* clear SW CTS value */
    1717           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, 0);
    1718             :         else
    1719             :                 /* select SW CTS value */
    1720           0 :                 tmp = REG_SET_FIELD(tmp, HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, 1);
    1721             :         /* allow hw to sent ACR packets when required */
    1722           0 :         tmp = REG_SET_FIELD(tmp, HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, 1);
    1723           0 :         WREG32(mmHDMI_ACR_PACKET_CONTROL + dig->afmt->offset, tmp);
    1724             : 
    1725           0 :         dce_v11_0_afmt_update_ACR(encoder, mode->clock);
    1726             : 
    1727           0 :         tmp = RREG32(mmAFMT_60958_0 + dig->afmt->offset);
    1728           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_0, AFMT_60958_CS_CHANNEL_NUMBER_L, 1);
    1729           0 :         WREG32(mmAFMT_60958_0 + dig->afmt->offset, tmp);
    1730             : 
    1731           0 :         tmp = RREG32(mmAFMT_60958_1 + dig->afmt->offset);
    1732           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_1, AFMT_60958_CS_CHANNEL_NUMBER_R, 2);
    1733           0 :         WREG32(mmAFMT_60958_1 + dig->afmt->offset, tmp);
    1734             : 
    1735           0 :         tmp = RREG32(mmAFMT_60958_2 + dig->afmt->offset);
    1736           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_2, 3);
    1737           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_3, 4);
    1738           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_4, 5);
    1739           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_5, 6);
    1740           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_6, 7);
    1741           0 :         tmp = REG_SET_FIELD(tmp, AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_7, 8);
    1742           0 :         WREG32(mmAFMT_60958_2 + dig->afmt->offset, tmp);
    1743             : 
    1744           0 :         dce_v11_0_audio_write_speaker_allocation(encoder);
    1745             : 
    1746           0 :         WREG32(mmAFMT_AUDIO_PACKET_CONTROL2 + dig->afmt->offset,
    1747             :                (0xff << AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_CHANNEL_ENABLE__SHIFT));
    1748             : 
    1749           0 :         dce_v11_0_afmt_audio_select_pin(encoder);
    1750           0 :         dce_v11_0_audio_write_sad_regs(encoder);
    1751           0 :         dce_v11_0_audio_write_latency_fields(encoder, mode);
    1752             : 
    1753           0 :         err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode);
    1754           0 :         if (err < 0) {
    1755           0 :                 DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
    1756           0 :                 return;
    1757             :         }
    1758             : 
    1759           0 :         err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
    1760           0 :         if (err < 0) {
    1761           0 :                 DRM_ERROR("failed to pack AVI infoframe: %zd\n", err);
    1762           0 :                 return;
    1763             :         }
    1764             : 
    1765           0 :         dce_v11_0_afmt_update_avi_infoframe(encoder, buffer, sizeof(buffer));
    1766             : 
    1767           0 :         tmp = RREG32(mmHDMI_INFOFRAME_CONTROL0 + dig->afmt->offset);
    1768             :         /* enable AVI info frames */
    1769           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL0, HDMI_AVI_INFO_SEND, 1);
    1770             :         /* required for audio info values to be updated */
    1771           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL0, HDMI_AVI_INFO_CONT, 1);
    1772           0 :         WREG32(mmHDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, tmp);
    1773             : 
    1774           0 :         tmp = RREG32(mmHDMI_INFOFRAME_CONTROL1 + dig->afmt->offset);
    1775           0 :         tmp = REG_SET_FIELD(tmp, HDMI_INFOFRAME_CONTROL1, HDMI_AVI_INFO_LINE, 2);
    1776           0 :         WREG32(mmHDMI_INFOFRAME_CONTROL1 + dig->afmt->offset, tmp);
    1777             : 
    1778           0 :         tmp = RREG32(mmAFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset);
    1779             :         /* send audio packets */
    1780           0 :         tmp = REG_SET_FIELD(tmp, AFMT_AUDIO_PACKET_CONTROL, AFMT_AUDIO_SAMPLE_SEND, 1);
    1781           0 :         WREG32(mmAFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, tmp);
    1782             : 
    1783           0 :         WREG32(mmAFMT_RAMP_CONTROL0 + dig->afmt->offset, 0x00FFFFFF);
    1784           0 :         WREG32(mmAFMT_RAMP_CONTROL1 + dig->afmt->offset, 0x007FFFFF);
    1785           0 :         WREG32(mmAFMT_RAMP_CONTROL2 + dig->afmt->offset, 0x00000001);
    1786           0 :         WREG32(mmAFMT_RAMP_CONTROL3 + dig->afmt->offset, 0x00000001);
    1787             : 
    1788             :         /* enable audio after to setting up hw */
    1789           0 :         dce_v11_0_audio_enable(adev, dig->afmt->pin, true);
    1790             : }
    1791             : 
    1792           0 : static void dce_v11_0_afmt_enable(struct drm_encoder *encoder, bool enable)
    1793             : {
    1794           0 :         struct drm_device *dev = encoder->dev;
    1795           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1796           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    1797           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    1798             : 
    1799           0 :         if (!dig || !dig->afmt)
    1800             :                 return;
    1801             : 
    1802             :         /* Silent, r600_hdmi_enable will raise WARN for us */
    1803           0 :         if (enable && dig->afmt->enabled)
    1804             :                 return;
    1805           0 :         if (!enable && !dig->afmt->enabled)
    1806             :                 return;
    1807             : 
    1808           0 :         if (!enable && dig->afmt->pin) {
    1809           0 :                 dce_v11_0_audio_enable(adev, dig->afmt->pin, false);
    1810           0 :                 dig->afmt->pin = NULL;
    1811             :         }
    1812             : 
    1813           0 :         dig->afmt->enabled = enable;
    1814             : 
    1815           0 :         DRM_DEBUG("%sabling AFMT interface @ 0x%04X for encoder 0x%x\n",
    1816             :                   enable ? "En" : "Dis", dig->afmt->offset, amdgpu_encoder->encoder_id);
    1817             : }
    1818             : 
    1819           0 : static int dce_v11_0_afmt_init(struct amdgpu_device *adev)
    1820             : {
    1821             :         int i;
    1822             : 
    1823           0 :         for (i = 0; i < adev->mode_info.num_dig; i++)
    1824           0 :                 adev->mode_info.afmt[i] = NULL;
    1825             : 
    1826             :         /* DCE11 has audio blocks tied to DIG encoders */
    1827           0 :         for (i = 0; i < adev->mode_info.num_dig; i++) {
    1828           0 :                 adev->mode_info.afmt[i] = kzalloc(sizeof(struct amdgpu_afmt), GFP_KERNEL);
    1829           0 :                 if (adev->mode_info.afmt[i]) {
    1830           0 :                         adev->mode_info.afmt[i]->offset = dig_offsets[i];
    1831           0 :                         adev->mode_info.afmt[i]->id = i;
    1832             :                 } else {
    1833             :                         int j;
    1834           0 :                         for (j = 0; j < i; j++) {
    1835           0 :                                 kfree(adev->mode_info.afmt[j]);
    1836           0 :                                 adev->mode_info.afmt[j] = NULL;
    1837             :                         }
    1838             :                         return -ENOMEM;
    1839             :                 }
    1840             :         }
    1841             :         return 0;
    1842             : }
    1843             : 
    1844             : static void dce_v11_0_afmt_fini(struct amdgpu_device *adev)
    1845             : {
    1846             :         int i;
    1847             : 
    1848           0 :         for (i = 0; i < adev->mode_info.num_dig; i++) {
    1849           0 :                 kfree(adev->mode_info.afmt[i]);
    1850           0 :                 adev->mode_info.afmt[i] = NULL;
    1851             :         }
    1852             : }
    1853             : 
    1854             : static const u32 vga_control_regs[6] =
    1855             : {
    1856             :         mmD1VGA_CONTROL,
    1857             :         mmD2VGA_CONTROL,
    1858             :         mmD3VGA_CONTROL,
    1859             :         mmD4VGA_CONTROL,
    1860             :         mmD5VGA_CONTROL,
    1861             :         mmD6VGA_CONTROL,
    1862             : };
    1863             : 
    1864           0 : static void dce_v11_0_vga_enable(struct drm_crtc *crtc, bool enable)
    1865             : {
    1866           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    1867           0 :         struct drm_device *dev = crtc->dev;
    1868           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1869             :         u32 vga_control;
    1870             : 
    1871           0 :         vga_control = RREG32(vga_control_regs[amdgpu_crtc->crtc_id]) & ~1;
    1872           0 :         if (enable)
    1873           0 :                 WREG32(vga_control_regs[amdgpu_crtc->crtc_id], vga_control | 1);
    1874             :         else
    1875           0 :                 WREG32(vga_control_regs[amdgpu_crtc->crtc_id], vga_control);
    1876           0 : }
    1877             : 
    1878           0 : static void dce_v11_0_grph_enable(struct drm_crtc *crtc, bool enable)
    1879             : {
    1880           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    1881           0 :         struct drm_device *dev = crtc->dev;
    1882           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1883             : 
    1884           0 :         if (enable)
    1885           0 :                 WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 1);
    1886             :         else
    1887           0 :                 WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 0);
    1888           0 : }
    1889             : 
    1890           0 : static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
    1891             :                                      struct drm_framebuffer *fb,
    1892             :                                      int x, int y, int atomic)
    1893             : {
    1894           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    1895           0 :         struct drm_device *dev = crtc->dev;
    1896           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    1897             :         struct drm_framebuffer *target_fb;
    1898             :         struct drm_gem_object *obj;
    1899             :         struct amdgpu_bo *abo;
    1900             :         uint64_t fb_location, tiling_flags;
    1901             :         uint32_t fb_format, fb_pitch_pixels;
    1902           0 :         u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE);
    1903             :         u32 pipe_config;
    1904             :         u32 tmp, viewport_w, viewport_h;
    1905             :         int r;
    1906           0 :         bool bypass_lut = false;
    1907             : 
    1908             :         /* no fb bound */
    1909           0 :         if (!atomic && !crtc->primary->fb) {
    1910           0 :                 DRM_DEBUG_KMS("No FB bound\n");
    1911           0 :                 return 0;
    1912             :         }
    1913             : 
    1914           0 :         if (atomic)
    1915             :                 target_fb = fb;
    1916             :         else
    1917           0 :                 target_fb = crtc->primary->fb;
    1918             : 
    1919             :         /* If atomic, assume fb object is pinned & idle & fenced and
    1920             :          * just update base pointers
    1921             :          */
    1922           0 :         obj = target_fb->obj[0];
    1923           0 :         abo = gem_to_amdgpu_bo(obj);
    1924           0 :         r = amdgpu_bo_reserve(abo, false);
    1925           0 :         if (unlikely(r != 0))
    1926             :                 return r;
    1927             : 
    1928           0 :         if (!atomic) {
    1929           0 :                 r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM);
    1930           0 :                 if (unlikely(r != 0)) {
    1931           0 :                         amdgpu_bo_unreserve(abo);
    1932           0 :                         return -EINVAL;
    1933             :                 }
    1934             :         }
    1935           0 :         fb_location = amdgpu_bo_gpu_offset(abo);
    1936             : 
    1937           0 :         amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
    1938           0 :         amdgpu_bo_unreserve(abo);
    1939             : 
    1940           0 :         pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
    1941             : 
    1942           0 :         switch (target_fb->format->format) {
    1943             :         case DRM_FORMAT_C8:
    1944             :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 0);
    1945             :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0);
    1946             :                 break;
    1947             :         case DRM_FORMAT_XRGB4444:
    1948             :         case DRM_FORMAT_ARGB4444:
    1949           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 1);
    1950           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 2);
    1951             : #ifdef __BIG_ENDIAN
    1952             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1953             :                                         ENDIAN_8IN16);
    1954             : #endif
    1955           0 :                 break;
    1956             :         case DRM_FORMAT_XRGB1555:
    1957             :         case DRM_FORMAT_ARGB1555:
    1958           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 1);
    1959           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0);
    1960             : #ifdef __BIG_ENDIAN
    1961             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1962             :                                         ENDIAN_8IN16);
    1963             : #endif
    1964           0 :                 break;
    1965             :         case DRM_FORMAT_BGRX5551:
    1966             :         case DRM_FORMAT_BGRA5551:
    1967           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 1);
    1968           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 5);
    1969             : #ifdef __BIG_ENDIAN
    1970             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1971             :                                         ENDIAN_8IN16);
    1972             : #endif
    1973           0 :                 break;
    1974             :         case DRM_FORMAT_RGB565:
    1975           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 1);
    1976           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 1);
    1977             : #ifdef __BIG_ENDIAN
    1978             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1979             :                                         ENDIAN_8IN16);
    1980             : #endif
    1981           0 :                 break;
    1982             :         case DRM_FORMAT_XRGB8888:
    1983             :         case DRM_FORMAT_ARGB8888:
    1984           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2);
    1985           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0);
    1986             : #ifdef __BIG_ENDIAN
    1987             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1988             :                                         ENDIAN_8IN32);
    1989             : #endif
    1990           0 :                 break;
    1991             :         case DRM_FORMAT_XRGB2101010:
    1992             :         case DRM_FORMAT_ARGB2101010:
    1993           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2);
    1994           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 1);
    1995             : #ifdef __BIG_ENDIAN
    1996             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    1997             :                                         ENDIAN_8IN32);
    1998             : #endif
    1999             :                 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */
    2000           0 :                 bypass_lut = true;
    2001           0 :                 break;
    2002             :         case DRM_FORMAT_BGRX1010102:
    2003             :         case DRM_FORMAT_BGRA1010102:
    2004           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2);
    2005           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 4);
    2006             : #ifdef __BIG_ENDIAN
    2007             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    2008             :                                         ENDIAN_8IN32);
    2009             : #endif
    2010             :                 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */
    2011           0 :                 bypass_lut = true;
    2012           0 :                 break;
    2013             :         case DRM_FORMAT_XBGR8888:
    2014             :         case DRM_FORMAT_ABGR8888:
    2015           0 :                 fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2);
    2016           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0);
    2017           0 :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_RED_CROSSBAR, 2);
    2018           0 :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_BLUE_CROSSBAR, 2);
    2019             : #ifdef __BIG_ENDIAN
    2020             :                 fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP,
    2021             :                                         ENDIAN_8IN32);
    2022             : #endif
    2023           0 :                 break;
    2024             :         default:
    2025           0 :                 DRM_ERROR("Unsupported screen format %p4cc\n",
    2026             :                           &target_fb->format->format);
    2027           0 :                 return -EINVAL;
    2028             :         }
    2029             : 
    2030           0 :         if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_2D_TILED_THIN1) {
    2031             :                 unsigned bankw, bankh, mtaspect, tile_split, num_banks;
    2032             : 
    2033           0 :                 bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
    2034           0 :                 bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
    2035           0 :                 mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
    2036           0 :                 tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
    2037           0 :                 num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
    2038             : 
    2039           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_NUM_BANKS, num_banks);
    2040           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
    2041             :                                           ARRAY_2D_TILED_THIN1);
    2042           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_TILE_SPLIT,
    2043             :                                           tile_split);
    2044           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_BANK_WIDTH, bankw);
    2045           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_BANK_HEIGHT, bankh);
    2046           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_MACRO_TILE_ASPECT,
    2047             :                                           mtaspect);
    2048           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_MICRO_TILE_MODE,
    2049             :                                           ADDR_SURF_MICRO_TILING_DISPLAY);
    2050           0 :         } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_1D_TILED_THIN1) {
    2051           0 :                 fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
    2052             :                                           ARRAY_1D_TILED_THIN1);
    2053             :         }
    2054             : 
    2055           0 :         fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_PIPE_CONFIG,
    2056             :                                   pipe_config);
    2057             : 
    2058           0 :         dce_v11_0_vga_enable(crtc, false);
    2059             : 
    2060             :         /* Make sure surface address is updated at vertical blank rather than
    2061             :          * horizontal blank
    2062             :          */
    2063           0 :         tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
    2064           0 :         tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
    2065             :                             GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
    2066           0 :         WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2067             : 
    2068           0 :         WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
    2069             :                upper_32_bits(fb_location));
    2070           0 :         WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
    2071             :                upper_32_bits(fb_location));
    2072           0 :         WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
    2073             :                (u32)fb_location & GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS_MASK);
    2074           0 :         WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
    2075             :                (u32) fb_location & GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS_MASK);
    2076           0 :         WREG32(mmGRPH_CONTROL + amdgpu_crtc->crtc_offset, fb_format);
    2077           0 :         WREG32(mmGRPH_SWAP_CNTL + amdgpu_crtc->crtc_offset, fb_swap);
    2078             : 
    2079             :         /*
    2080             :          * The LUT only has 256 slots for indexing by a 8 bpc fb. Bypass the LUT
    2081             :          * for > 8 bpc scanout to avoid truncation of fb indices to 8 msb's, to
    2082             :          * retain the full precision throughout the pipeline.
    2083             :          */
    2084           0 :         tmp = RREG32(mmGRPH_LUT_10BIT_BYPASS + amdgpu_crtc->crtc_offset);
    2085           0 :         if (bypass_lut)
    2086           0 :                 tmp = REG_SET_FIELD(tmp, GRPH_LUT_10BIT_BYPASS, GRPH_LUT_10BIT_BYPASS_EN, 1);
    2087             :         else
    2088           0 :                 tmp = REG_SET_FIELD(tmp, GRPH_LUT_10BIT_BYPASS, GRPH_LUT_10BIT_BYPASS_EN, 0);
    2089           0 :         WREG32(mmGRPH_LUT_10BIT_BYPASS + amdgpu_crtc->crtc_offset, tmp);
    2090             : 
    2091           0 :         if (bypass_lut)
    2092           0 :                 DRM_DEBUG_KMS("Bypassing hardware LUT due to 10 bit fb scanout.\n");
    2093             : 
    2094           0 :         WREG32(mmGRPH_SURFACE_OFFSET_X + amdgpu_crtc->crtc_offset, 0);
    2095           0 :         WREG32(mmGRPH_SURFACE_OFFSET_Y + amdgpu_crtc->crtc_offset, 0);
    2096           0 :         WREG32(mmGRPH_X_START + amdgpu_crtc->crtc_offset, 0);
    2097           0 :         WREG32(mmGRPH_Y_START + amdgpu_crtc->crtc_offset, 0);
    2098           0 :         WREG32(mmGRPH_X_END + amdgpu_crtc->crtc_offset, target_fb->width);
    2099           0 :         WREG32(mmGRPH_Y_END + amdgpu_crtc->crtc_offset, target_fb->height);
    2100             : 
    2101           0 :         fb_pitch_pixels = target_fb->pitches[0] / target_fb->format->cpp[0];
    2102           0 :         WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, fb_pitch_pixels);
    2103             : 
    2104           0 :         dce_v11_0_grph_enable(crtc, true);
    2105             : 
    2106           0 :         WREG32(mmLB_DESKTOP_HEIGHT + amdgpu_crtc->crtc_offset,
    2107             :                target_fb->height);
    2108             : 
    2109           0 :         x &= ~3;
    2110           0 :         y &= ~1;
    2111           0 :         WREG32(mmVIEWPORT_START + amdgpu_crtc->crtc_offset,
    2112             :                (x << 16) | y);
    2113           0 :         viewport_w = crtc->mode.hdisplay;
    2114           0 :         viewport_h = (crtc->mode.vdisplay + 1) & ~1;
    2115           0 :         WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
    2116             :                (viewport_w << 16) | viewport_h);
    2117             : 
    2118             :         /* set pageflip to happen anywhere in vblank interval */
    2119           0 :         WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);
    2120             : 
    2121           0 :         if (!atomic && fb && fb != crtc->primary->fb) {
    2122           0 :                 abo = gem_to_amdgpu_bo(fb->obj[0]);
    2123           0 :                 r = amdgpu_bo_reserve(abo, true);
    2124           0 :                 if (unlikely(r != 0))
    2125             :                         return r;
    2126           0 :                 amdgpu_bo_unpin(abo);
    2127             :                 amdgpu_bo_unreserve(abo);
    2128             :         }
    2129             : 
    2130             :         /* Bytes per pixel may have changed */
    2131           0 :         dce_v11_0_bandwidth_update(adev);
    2132             : 
    2133           0 :         return 0;
    2134             : }
    2135             : 
    2136           0 : static void dce_v11_0_set_interleave(struct drm_crtc *crtc,
    2137             :                                      struct drm_display_mode *mode)
    2138             : {
    2139           0 :         struct drm_device *dev = crtc->dev;
    2140           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2141           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2142             :         u32 tmp;
    2143             : 
    2144           0 :         tmp = RREG32(mmLB_DATA_FORMAT + amdgpu_crtc->crtc_offset);
    2145           0 :         if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    2146           0 :                 tmp = REG_SET_FIELD(tmp, LB_DATA_FORMAT, INTERLEAVE_EN, 1);
    2147             :         else
    2148           0 :                 tmp = REG_SET_FIELD(tmp, LB_DATA_FORMAT, INTERLEAVE_EN, 0);
    2149           0 :         WREG32(mmLB_DATA_FORMAT + amdgpu_crtc->crtc_offset, tmp);
    2150           0 : }
    2151             : 
    2152           0 : static void dce_v11_0_crtc_load_lut(struct drm_crtc *crtc)
    2153             : {
    2154           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2155           0 :         struct drm_device *dev = crtc->dev;
    2156           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2157             :         u16 *r, *g, *b;
    2158             :         int i;
    2159             :         u32 tmp;
    2160             : 
    2161           0 :         DRM_DEBUG_KMS("%d\n", amdgpu_crtc->crtc_id);
    2162             : 
    2163           0 :         tmp = RREG32(mmINPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset);
    2164           0 :         tmp = REG_SET_FIELD(tmp, INPUT_CSC_CONTROL, INPUT_CSC_GRPH_MODE, 0);
    2165           0 :         WREG32(mmINPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2166             : 
    2167           0 :         tmp = RREG32(mmPRESCALE_GRPH_CONTROL + amdgpu_crtc->crtc_offset);
    2168           0 :         tmp = REG_SET_FIELD(tmp, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_BYPASS, 1);
    2169           0 :         WREG32(mmPRESCALE_GRPH_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2170             : 
    2171           0 :         tmp = RREG32(mmINPUT_GAMMA_CONTROL + amdgpu_crtc->crtc_offset);
    2172           0 :         tmp = REG_SET_FIELD(tmp, INPUT_GAMMA_CONTROL, GRPH_INPUT_GAMMA_MODE, 0);
    2173           0 :         WREG32(mmINPUT_GAMMA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2174             : 
    2175           0 :         WREG32(mmDC_LUT_CONTROL + amdgpu_crtc->crtc_offset, 0);
    2176             : 
    2177           0 :         WREG32(mmDC_LUT_BLACK_OFFSET_BLUE + amdgpu_crtc->crtc_offset, 0);
    2178           0 :         WREG32(mmDC_LUT_BLACK_OFFSET_GREEN + amdgpu_crtc->crtc_offset, 0);
    2179           0 :         WREG32(mmDC_LUT_BLACK_OFFSET_RED + amdgpu_crtc->crtc_offset, 0);
    2180             : 
    2181           0 :         WREG32(mmDC_LUT_WHITE_OFFSET_BLUE + amdgpu_crtc->crtc_offset, 0xffff);
    2182           0 :         WREG32(mmDC_LUT_WHITE_OFFSET_GREEN + amdgpu_crtc->crtc_offset, 0xffff);
    2183           0 :         WREG32(mmDC_LUT_WHITE_OFFSET_RED + amdgpu_crtc->crtc_offset, 0xffff);
    2184             : 
    2185           0 :         WREG32(mmDC_LUT_RW_MODE + amdgpu_crtc->crtc_offset, 0);
    2186           0 :         WREG32(mmDC_LUT_WRITE_EN_MASK + amdgpu_crtc->crtc_offset, 0x00000007);
    2187             : 
    2188           0 :         WREG32(mmDC_LUT_RW_INDEX + amdgpu_crtc->crtc_offset, 0);
    2189           0 :         r = crtc->gamma_store;
    2190           0 :         g = r + crtc->gamma_size;
    2191           0 :         b = g + crtc->gamma_size;
    2192           0 :         for (i = 0; i < 256; i++) {
    2193           0 :                 WREG32(mmDC_LUT_30_COLOR + amdgpu_crtc->crtc_offset,
    2194             :                        ((*r++ & 0xffc0) << 14) |
    2195             :                        ((*g++ & 0xffc0) << 4) |
    2196             :                        (*b++ >> 6));
    2197             :         }
    2198             : 
    2199           0 :         tmp = RREG32(mmDEGAMMA_CONTROL + amdgpu_crtc->crtc_offset);
    2200           0 :         tmp = REG_SET_FIELD(tmp, DEGAMMA_CONTROL, GRPH_DEGAMMA_MODE, 0);
    2201           0 :         tmp = REG_SET_FIELD(tmp, DEGAMMA_CONTROL, CURSOR_DEGAMMA_MODE, 0);
    2202           0 :         tmp = REG_SET_FIELD(tmp, DEGAMMA_CONTROL, CURSOR2_DEGAMMA_MODE, 0);
    2203           0 :         WREG32(mmDEGAMMA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2204             : 
    2205           0 :         tmp = RREG32(mmGAMUT_REMAP_CONTROL + amdgpu_crtc->crtc_offset);
    2206           0 :         tmp = REG_SET_FIELD(tmp, GAMUT_REMAP_CONTROL, GRPH_GAMUT_REMAP_MODE, 0);
    2207           0 :         WREG32(mmGAMUT_REMAP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2208             : 
    2209           0 :         tmp = RREG32(mmREGAMMA_CONTROL + amdgpu_crtc->crtc_offset);
    2210           0 :         tmp = REG_SET_FIELD(tmp, REGAMMA_CONTROL, GRPH_REGAMMA_MODE, 0);
    2211           0 :         WREG32(mmREGAMMA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2212             : 
    2213           0 :         tmp = RREG32(mmOUTPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset);
    2214           0 :         tmp = REG_SET_FIELD(tmp, OUTPUT_CSC_CONTROL, OUTPUT_CSC_GRPH_MODE, 0);
    2215           0 :         WREG32(mmOUTPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2216             : 
    2217             :         /* XXX match this to the depth of the crtc fmt block, move to modeset? */
    2218           0 :         WREG32(mmDENORM_CONTROL + amdgpu_crtc->crtc_offset, 0);
    2219             :         /* XXX this only needs to be programmed once per crtc at startup,
    2220             :          * not sure where the best place for it is
    2221             :          */
    2222           0 :         tmp = RREG32(mmALPHA_CONTROL + amdgpu_crtc->crtc_offset);
    2223           0 :         tmp = REG_SET_FIELD(tmp, ALPHA_CONTROL, CURSOR_ALPHA_BLND_ENA, 1);
    2224           0 :         WREG32(mmALPHA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2225           0 : }
    2226             : 
    2227           0 : static int dce_v11_0_pick_dig_encoder(struct drm_encoder *encoder)
    2228             : {
    2229           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    2230           0 :         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    2231             : 
    2232           0 :         switch (amdgpu_encoder->encoder_id) {
    2233             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
    2234           0 :                 if (dig->linkb)
    2235             :                         return 1;
    2236             :                 else
    2237           0 :                         return 0;
    2238             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
    2239           0 :                 if (dig->linkb)
    2240             :                         return 3;
    2241             :                 else
    2242           0 :                         return 2;
    2243             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
    2244           0 :                 if (dig->linkb)
    2245             :                         return 5;
    2246             :                 else
    2247           0 :                         return 4;
    2248             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
    2249             :                 return 6;
    2250             :         default:
    2251           0 :                 DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_id);
    2252           0 :                 return 0;
    2253             :         }
    2254             : }
    2255             : 
    2256             : /**
    2257             :  * dce_v11_0_pick_pll - Allocate a PPLL for use by the crtc.
    2258             :  *
    2259             :  * @crtc: drm crtc
    2260             :  *
    2261             :  * Returns the PPLL (Pixel PLL) to be used by the crtc.  For DP monitors
    2262             :  * a single PPLL can be used for all DP crtcs/encoders.  For non-DP
    2263             :  * monitors a dedicated PPLL must be used.  If a particular board has
    2264             :  * an external DP PLL, return ATOM_PPLL_INVALID to skip PLL programming
    2265             :  * as there is no need to program the PLL itself.  If we are not able to
    2266             :  * allocate a PLL, return ATOM_PPLL_INVALID to skip PLL programming to
    2267             :  * avoid messing up an existing monitor.
    2268             :  *
    2269             :  * Asic specific PLL information
    2270             :  *
    2271             :  * DCE 10.x
    2272             :  * Tonga
    2273             :  * - PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP)
    2274             :  * CI
    2275             :  * - PPLL0, PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) and DAC
    2276             :  *
    2277             :  */
    2278           0 : static u32 dce_v11_0_pick_pll(struct drm_crtc *crtc)
    2279             : {
    2280           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2281           0 :         struct drm_device *dev = crtc->dev;
    2282           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2283             :         u32 pll_in_use;
    2284             :         int pll;
    2285             : 
    2286           0 :         if ((adev->asic_type == CHIP_POLARIS10) ||
    2287             :             (adev->asic_type == CHIP_POLARIS11) ||
    2288           0 :             (adev->asic_type == CHIP_POLARIS12) ||
    2289             :             (adev->asic_type == CHIP_VEGAM)) {
    2290           0 :                 struct amdgpu_encoder *amdgpu_encoder =
    2291           0 :                         to_amdgpu_encoder(amdgpu_crtc->encoder);
    2292           0 :                 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    2293             : 
    2294           0 :                 if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder)))
    2295             :                         return ATOM_DP_DTO;
    2296             : 
    2297           0 :                 switch (amdgpu_encoder->encoder_id) {
    2298             :                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
    2299           0 :                         if (dig->linkb)
    2300             :                                 return ATOM_COMBOPHY_PLL1;
    2301             :                         else
    2302           0 :                                 return ATOM_COMBOPHY_PLL0;
    2303             :                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
    2304           0 :                         if (dig->linkb)
    2305             :                                 return ATOM_COMBOPHY_PLL3;
    2306             :                         else
    2307           0 :                                 return ATOM_COMBOPHY_PLL2;
    2308             :                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
    2309           0 :                         if (dig->linkb)
    2310             :                                 return ATOM_COMBOPHY_PLL5;
    2311             :                         else
    2312           0 :                                 return ATOM_COMBOPHY_PLL4;
    2313             :                 default:
    2314           0 :                         DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_id);
    2315           0 :                         return ATOM_PPLL_INVALID;
    2316             :                 }
    2317             :         }
    2318             : 
    2319           0 :         if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder))) {
    2320           0 :                 if (adev->clock.dp_extclk)
    2321             :                         /* skip PPLL programming if using ext clock */
    2322             :                         return ATOM_PPLL_INVALID;
    2323             :                 else {
    2324             :                         /* use the same PPLL for all DP monitors */
    2325           0 :                         pll = amdgpu_pll_get_shared_dp_ppll(crtc);
    2326           0 :                         if (pll != ATOM_PPLL_INVALID)
    2327           0 :                                 return pll;
    2328             :                 }
    2329             :         } else {
    2330             :                 /* use the same PPLL for all monitors with the same clock */
    2331           0 :                 pll = amdgpu_pll_get_shared_nondp_ppll(crtc);
    2332           0 :                 if (pll != ATOM_PPLL_INVALID)
    2333           0 :                         return pll;
    2334             :         }
    2335             : 
    2336             :         /* XXX need to determine what plls are available on each DCE11 part */
    2337           0 :         pll_in_use = amdgpu_pll_get_use_mask(crtc);
    2338           0 :         if (adev->flags & AMD_IS_APU) {
    2339           0 :                 if (!(pll_in_use & (1 << ATOM_PPLL1)))
    2340             :                         return ATOM_PPLL1;
    2341           0 :                 if (!(pll_in_use & (1 << ATOM_PPLL0)))
    2342             :                         return ATOM_PPLL0;
    2343           0 :                 DRM_ERROR("unable to allocate a PPLL\n");
    2344           0 :                 return ATOM_PPLL_INVALID;
    2345             :         } else {
    2346           0 :                 if (!(pll_in_use & (1 << ATOM_PPLL2)))
    2347             :                         return ATOM_PPLL2;
    2348           0 :                 if (!(pll_in_use & (1 << ATOM_PPLL1)))
    2349             :                         return ATOM_PPLL1;
    2350           0 :                 if (!(pll_in_use & (1 << ATOM_PPLL0)))
    2351             :                         return ATOM_PPLL0;
    2352           0 :                 DRM_ERROR("unable to allocate a PPLL\n");
    2353           0 :                 return ATOM_PPLL_INVALID;
    2354             :         }
    2355             :         return ATOM_PPLL_INVALID;
    2356             : }
    2357             : 
    2358           0 : static void dce_v11_0_lock_cursor(struct drm_crtc *crtc, bool lock)
    2359             : {
    2360           0 :         struct amdgpu_device *adev = drm_to_adev(crtc->dev);
    2361           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2362             :         uint32_t cur_lock;
    2363             : 
    2364           0 :         cur_lock = RREG32(mmCUR_UPDATE + amdgpu_crtc->crtc_offset);
    2365           0 :         if (lock)
    2366           0 :                 cur_lock = REG_SET_FIELD(cur_lock, CUR_UPDATE, CURSOR_UPDATE_LOCK, 1);
    2367             :         else
    2368           0 :                 cur_lock = REG_SET_FIELD(cur_lock, CUR_UPDATE, CURSOR_UPDATE_LOCK, 0);
    2369           0 :         WREG32(mmCUR_UPDATE + amdgpu_crtc->crtc_offset, cur_lock);
    2370           0 : }
    2371             : 
    2372           0 : static void dce_v11_0_hide_cursor(struct drm_crtc *crtc)
    2373             : {
    2374           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2375           0 :         struct amdgpu_device *adev = drm_to_adev(crtc->dev);
    2376             :         u32 tmp;
    2377             : 
    2378           0 :         tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
    2379           0 :         tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0);
    2380           0 :         WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2381           0 : }
    2382             : 
    2383           0 : static void dce_v11_0_show_cursor(struct drm_crtc *crtc)
    2384             : {
    2385           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2386           0 :         struct amdgpu_device *adev = drm_to_adev(crtc->dev);
    2387             :         u32 tmp;
    2388             : 
    2389           0 :         WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
    2390             :                upper_32_bits(amdgpu_crtc->cursor_addr));
    2391           0 :         WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
    2392             :                lower_32_bits(amdgpu_crtc->cursor_addr));
    2393             : 
    2394           0 :         tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
    2395           0 :         tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);
    2396           0 :         tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2);
    2397           0 :         WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
    2398           0 : }
    2399             : 
    2400           0 : static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,
    2401             :                                         int x, int y)
    2402             : {
    2403           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2404           0 :         struct amdgpu_device *adev = drm_to_adev(crtc->dev);
    2405           0 :         int xorigin = 0, yorigin = 0;
    2406             : 
    2407           0 :         amdgpu_crtc->cursor_x = x;
    2408           0 :         amdgpu_crtc->cursor_y = y;
    2409             : 
    2410             :         /* avivo cursor are offset into the total surface */
    2411           0 :         x += crtc->x;
    2412           0 :         y += crtc->y;
    2413           0 :         DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y);
    2414             : 
    2415           0 :         if (x < 0) {
    2416           0 :                 xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1);
    2417           0 :                 x = 0;
    2418             :         }
    2419           0 :         if (y < 0) {
    2420           0 :                 yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1);
    2421           0 :                 y = 0;
    2422             :         }
    2423             : 
    2424           0 :         WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
    2425           0 :         WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
    2426           0 :         WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
    2427             :                ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
    2428             : 
    2429           0 :         return 0;
    2430             : }
    2431             : 
    2432           0 : static int dce_v11_0_crtc_cursor_move(struct drm_crtc *crtc,
    2433             :                                       int x, int y)
    2434             : {
    2435             :         int ret;
    2436             : 
    2437           0 :         dce_v11_0_lock_cursor(crtc, true);
    2438           0 :         ret = dce_v11_0_cursor_move_locked(crtc, x, y);
    2439           0 :         dce_v11_0_lock_cursor(crtc, false);
    2440             : 
    2441           0 :         return ret;
    2442             : }
    2443             : 
    2444           0 : static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
    2445             :                                       struct drm_file *file_priv,
    2446             :                                       uint32_t handle,
    2447             :                                       uint32_t width,
    2448             :                                       uint32_t height,
    2449             :                                       int32_t hot_x,
    2450             :                                       int32_t hot_y)
    2451             : {
    2452           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2453             :         struct drm_gem_object *obj;
    2454             :         struct amdgpu_bo *aobj;
    2455             :         int ret;
    2456             : 
    2457           0 :         if (!handle) {
    2458             :                 /* turn off cursor */
    2459           0 :                 dce_v11_0_hide_cursor(crtc);
    2460           0 :                 obj = NULL;
    2461           0 :                 goto unpin;
    2462             :         }
    2463             : 
    2464           0 :         if ((width > amdgpu_crtc->max_cursor_width) ||
    2465           0 :             (height > amdgpu_crtc->max_cursor_height)) {
    2466           0 :                 DRM_ERROR("bad cursor width or height %d x %d\n", width, height);
    2467           0 :                 return -EINVAL;
    2468             :         }
    2469             : 
    2470           0 :         obj = drm_gem_object_lookup(file_priv, handle);
    2471           0 :         if (!obj) {
    2472           0 :                 DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, amdgpu_crtc->crtc_id);
    2473           0 :                 return -ENOENT;
    2474             :         }
    2475             : 
    2476           0 :         aobj = gem_to_amdgpu_bo(obj);
    2477           0 :         ret = amdgpu_bo_reserve(aobj, false);
    2478           0 :         if (ret != 0) {
    2479           0 :                 drm_gem_object_put(obj);
    2480           0 :                 return ret;
    2481             :         }
    2482             : 
    2483           0 :         ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM);
    2484           0 :         amdgpu_bo_unreserve(aobj);
    2485           0 :         if (ret) {
    2486           0 :                 DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
    2487           0 :                 drm_gem_object_put(obj);
    2488           0 :                 return ret;
    2489             :         }
    2490           0 :         amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
    2491             : 
    2492           0 :         dce_v11_0_lock_cursor(crtc, true);
    2493             : 
    2494           0 :         if (width != amdgpu_crtc->cursor_width ||
    2495           0 :             height != amdgpu_crtc->cursor_height ||
    2496           0 :             hot_x != amdgpu_crtc->cursor_hot_x ||
    2497           0 :             hot_y != amdgpu_crtc->cursor_hot_y) {
    2498             :                 int x, y;
    2499             : 
    2500           0 :                 x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
    2501           0 :                 y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
    2502             : 
    2503           0 :                 dce_v11_0_cursor_move_locked(crtc, x, y);
    2504             : 
    2505           0 :                 amdgpu_crtc->cursor_width = width;
    2506           0 :                 amdgpu_crtc->cursor_height = height;
    2507           0 :                 amdgpu_crtc->cursor_hot_x = hot_x;
    2508           0 :                 amdgpu_crtc->cursor_hot_y = hot_y;
    2509             :         }
    2510             : 
    2511           0 :         dce_v11_0_show_cursor(crtc);
    2512           0 :         dce_v11_0_lock_cursor(crtc, false);
    2513             : 
    2514             : unpin:
    2515           0 :         if (amdgpu_crtc->cursor_bo) {
    2516           0 :                 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
    2517           0 :                 ret = amdgpu_bo_reserve(aobj, true);
    2518           0 :                 if (likely(ret == 0)) {
    2519           0 :                         amdgpu_bo_unpin(aobj);
    2520             :                         amdgpu_bo_unreserve(aobj);
    2521             :                 }
    2522           0 :                 drm_gem_object_put(amdgpu_crtc->cursor_bo);
    2523             :         }
    2524             : 
    2525           0 :         amdgpu_crtc->cursor_bo = obj;
    2526           0 :         return 0;
    2527             : }
    2528             : 
    2529           0 : static void dce_v11_0_cursor_reset(struct drm_crtc *crtc)
    2530             : {
    2531           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2532             : 
    2533           0 :         if (amdgpu_crtc->cursor_bo) {
    2534           0 :                 dce_v11_0_lock_cursor(crtc, true);
    2535             : 
    2536           0 :                 dce_v11_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,
    2537             :                                              amdgpu_crtc->cursor_y);
    2538             : 
    2539           0 :                 dce_v11_0_show_cursor(crtc);
    2540             : 
    2541           0 :                 dce_v11_0_lock_cursor(crtc, false);
    2542             :         }
    2543           0 : }
    2544             : 
    2545           0 : static int dce_v11_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
    2546             :                                     u16 *blue, uint32_t size,
    2547             :                                     struct drm_modeset_acquire_ctx *ctx)
    2548             : {
    2549           0 :         dce_v11_0_crtc_load_lut(crtc);
    2550             : 
    2551           0 :         return 0;
    2552             : }
    2553             : 
    2554           0 : static void dce_v11_0_crtc_destroy(struct drm_crtc *crtc)
    2555             : {
    2556           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2557             : 
    2558           0 :         drm_crtc_cleanup(crtc);
    2559           0 :         kfree(amdgpu_crtc);
    2560           0 : }
    2561             : 
    2562             : static const struct drm_crtc_funcs dce_v11_0_crtc_funcs = {
    2563             :         .cursor_set2 = dce_v11_0_crtc_cursor_set2,
    2564             :         .cursor_move = dce_v11_0_crtc_cursor_move,
    2565             :         .gamma_set = dce_v11_0_crtc_gamma_set,
    2566             :         .set_config = amdgpu_display_crtc_set_config,
    2567             :         .destroy = dce_v11_0_crtc_destroy,
    2568             :         .page_flip_target = amdgpu_display_crtc_page_flip_target,
    2569             :         .get_vblank_counter = amdgpu_get_vblank_counter_kms,
    2570             :         .enable_vblank = amdgpu_enable_vblank_kms,
    2571             :         .disable_vblank = amdgpu_disable_vblank_kms,
    2572             :         .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
    2573             : };
    2574             : 
    2575           0 : static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode)
    2576             : {
    2577           0 :         struct drm_device *dev = crtc->dev;
    2578           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2579           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2580             :         unsigned type;
    2581             : 
    2582           0 :         switch (mode) {
    2583             :         case DRM_MODE_DPMS_ON:
    2584           0 :                 amdgpu_crtc->enabled = true;
    2585           0 :                 amdgpu_atombios_crtc_enable(crtc, ATOM_ENABLE);
    2586           0 :                 dce_v11_0_vga_enable(crtc, true);
    2587           0 :                 amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE);
    2588           0 :                 dce_v11_0_vga_enable(crtc, false);
    2589             :                 /* Make sure VBLANK and PFLIP interrupts are still enabled */
    2590           0 :                 type = amdgpu_display_crtc_idx_to_irq_type(adev,
    2591             :                                                 amdgpu_crtc->crtc_id);
    2592           0 :                 amdgpu_irq_update(adev, &adev->crtc_irq, type);
    2593           0 :                 amdgpu_irq_update(adev, &adev->pageflip_irq, type);
    2594           0 :                 drm_crtc_vblank_on(crtc);
    2595           0 :                 dce_v11_0_crtc_load_lut(crtc);
    2596           0 :                 break;
    2597             :         case DRM_MODE_DPMS_STANDBY:
    2598             :         case DRM_MODE_DPMS_SUSPEND:
    2599             :         case DRM_MODE_DPMS_OFF:
    2600           0 :                 drm_crtc_vblank_off(crtc);
    2601           0 :                 if (amdgpu_crtc->enabled) {
    2602           0 :                         dce_v11_0_vga_enable(crtc, true);
    2603           0 :                         amdgpu_atombios_crtc_blank(crtc, ATOM_ENABLE);
    2604           0 :                         dce_v11_0_vga_enable(crtc, false);
    2605             :                 }
    2606           0 :                 amdgpu_atombios_crtc_enable(crtc, ATOM_DISABLE);
    2607           0 :                 amdgpu_crtc->enabled = false;
    2608           0 :                 break;
    2609             :         }
    2610             :         /* adjust pm to dpms */
    2611           0 :         amdgpu_dpm_compute_clocks(adev);
    2612           0 : }
    2613             : 
    2614           0 : static void dce_v11_0_crtc_prepare(struct drm_crtc *crtc)
    2615             : {
    2616             :         /* disable crtc pair power gating before programming */
    2617           0 :         amdgpu_atombios_crtc_powergate(crtc, ATOM_DISABLE);
    2618           0 :         amdgpu_atombios_crtc_lock(crtc, ATOM_ENABLE);
    2619           0 :         dce_v11_0_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
    2620           0 : }
    2621             : 
    2622           0 : static void dce_v11_0_crtc_commit(struct drm_crtc *crtc)
    2623             : {
    2624           0 :         dce_v11_0_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
    2625           0 :         amdgpu_atombios_crtc_lock(crtc, ATOM_DISABLE);
    2626           0 : }
    2627             : 
    2628           0 : static void dce_v11_0_crtc_disable(struct drm_crtc *crtc)
    2629             : {
    2630           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2631           0 :         struct drm_device *dev = crtc->dev;
    2632           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2633             :         struct amdgpu_atom_ss ss;
    2634             :         int i;
    2635             : 
    2636           0 :         dce_v11_0_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
    2637           0 :         if (crtc->primary->fb) {
    2638             :                 int r;
    2639             :                 struct amdgpu_bo *abo;
    2640             : 
    2641           0 :                 abo = gem_to_amdgpu_bo(crtc->primary->fb->obj[0]);
    2642           0 :                 r = amdgpu_bo_reserve(abo, true);
    2643           0 :                 if (unlikely(r))
    2644           0 :                         DRM_ERROR("failed to reserve abo before unpin\n");
    2645             :                 else {
    2646           0 :                         amdgpu_bo_unpin(abo);
    2647             :                         amdgpu_bo_unreserve(abo);
    2648             :                 }
    2649             :         }
    2650             :         /* disable the GRPH */
    2651           0 :         dce_v11_0_grph_enable(crtc, false);
    2652             : 
    2653           0 :         amdgpu_atombios_crtc_powergate(crtc, ATOM_ENABLE);
    2654             : 
    2655           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
    2656           0 :                 if (adev->mode_info.crtcs[i] &&
    2657           0 :                     adev->mode_info.crtcs[i]->enabled &&
    2658           0 :                     i != amdgpu_crtc->crtc_id &&
    2659           0 :                     amdgpu_crtc->pll_id == adev->mode_info.crtcs[i]->pll_id) {
    2660             :                         /* one other crtc is using this pll don't turn
    2661             :                          * off the pll
    2662             :                          */
    2663             :                         goto done;
    2664             :                 }
    2665             :         }
    2666             : 
    2667           0 :         switch (amdgpu_crtc->pll_id) {
    2668             :         case ATOM_PPLL0:
    2669             :         case ATOM_PPLL1:
    2670             :         case ATOM_PPLL2:
    2671             :                 /* disable the ppll */
    2672           0 :                 amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id, amdgpu_crtc->pll_id,
    2673             :                                                  0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
    2674           0 :                 break;
    2675             :         case ATOM_COMBOPHY_PLL0:
    2676             :         case ATOM_COMBOPHY_PLL1:
    2677             :         case ATOM_COMBOPHY_PLL2:
    2678             :         case ATOM_COMBOPHY_PLL3:
    2679             :         case ATOM_COMBOPHY_PLL4:
    2680             :         case ATOM_COMBOPHY_PLL5:
    2681             :                 /* disable the ppll */
    2682           0 :                 amdgpu_atombios_crtc_program_pll(crtc, ATOM_CRTC_INVALID, amdgpu_crtc->pll_id,
    2683             :                                                  0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
    2684           0 :                 break;
    2685             :         default:
    2686             :                 break;
    2687             :         }
    2688             : done:
    2689           0 :         amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
    2690           0 :         amdgpu_crtc->adjusted_clock = 0;
    2691           0 :         amdgpu_crtc->encoder = NULL;
    2692           0 :         amdgpu_crtc->connector = NULL;
    2693           0 : }
    2694             : 
    2695           0 : static int dce_v11_0_crtc_mode_set(struct drm_crtc *crtc,
    2696             :                                   struct drm_display_mode *mode,
    2697             :                                   struct drm_display_mode *adjusted_mode,
    2698             :                                   int x, int y, struct drm_framebuffer *old_fb)
    2699             : {
    2700           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2701           0 :         struct drm_device *dev = crtc->dev;
    2702           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    2703             : 
    2704           0 :         if (!amdgpu_crtc->adjusted_clock)
    2705             :                 return -EINVAL;
    2706             : 
    2707           0 :         if ((adev->asic_type == CHIP_POLARIS10) ||
    2708             :             (adev->asic_type == CHIP_POLARIS11) ||
    2709           0 :             (adev->asic_type == CHIP_POLARIS12) ||
    2710             :             (adev->asic_type == CHIP_VEGAM)) {
    2711           0 :                 struct amdgpu_encoder *amdgpu_encoder =
    2712           0 :                         to_amdgpu_encoder(amdgpu_crtc->encoder);
    2713           0 :                 int encoder_mode =
    2714             :                         amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder);
    2715             : 
    2716             :                 /* SetPixelClock calculates the plls and ss values now */
    2717           0 :                 amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id,
    2718           0 :                                                  amdgpu_crtc->pll_id,
    2719             :                                                  encoder_mode, amdgpu_encoder->encoder_id,
    2720           0 :                                                  adjusted_mode->clock, 0, 0, 0, 0,
    2721           0 :                                                  amdgpu_crtc->bpc, amdgpu_crtc->ss_enabled, &amdgpu_crtc->ss);
    2722             :         } else {
    2723           0 :                 amdgpu_atombios_crtc_set_pll(crtc, adjusted_mode);
    2724             :         }
    2725           0 :         amdgpu_atombios_crtc_set_dtd_timing(crtc, adjusted_mode);
    2726           0 :         dce_v11_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
    2727           0 :         amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
    2728           0 :         amdgpu_atombios_crtc_scaler_setup(crtc);
    2729           0 :         dce_v11_0_cursor_reset(crtc);
    2730             :         /* update the hw version fpr dpm */
    2731           0 :         amdgpu_crtc->hw_mode = *adjusted_mode;
    2732             : 
    2733           0 :         return 0;
    2734             : }
    2735             : 
    2736           0 : static bool dce_v11_0_crtc_mode_fixup(struct drm_crtc *crtc,
    2737             :                                      const struct drm_display_mode *mode,
    2738             :                                      struct drm_display_mode *adjusted_mode)
    2739             : {
    2740           0 :         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
    2741           0 :         struct drm_device *dev = crtc->dev;
    2742             :         struct drm_encoder *encoder;
    2743             : 
    2744             :         /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */
    2745           0 :         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    2746           0 :                 if (encoder->crtc == crtc) {
    2747           0 :                         amdgpu_crtc->encoder = encoder;
    2748           0 :                         amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder);
    2749           0 :                         break;
    2750             :                 }
    2751             :         }
    2752           0 :         if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) {
    2753           0 :                 amdgpu_crtc->encoder = NULL;
    2754           0 :                 amdgpu_crtc->connector = NULL;
    2755           0 :                 return false;
    2756             :         }
    2757           0 :         if (!amdgpu_display_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
    2758             :                 return false;
    2759           0 :         if (amdgpu_atombios_crtc_prepare_pll(crtc, adjusted_mode))
    2760             :                 return false;
    2761             :         /* pick pll */
    2762           0 :         amdgpu_crtc->pll_id = dce_v11_0_pick_pll(crtc);
    2763             :         /* if we can't get a PPLL for a non-DP encoder, fail */
    2764           0 :         if ((amdgpu_crtc->pll_id == ATOM_PPLL_INVALID) &&
    2765           0 :             !ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder)))
    2766             :                 return false;
    2767             : 
    2768             :         return true;
    2769             : }
    2770             : 
    2771           0 : static int dce_v11_0_crtc_set_base(struct drm_crtc *crtc, int x, int y,
    2772             :                                   struct drm_framebuffer *old_fb)
    2773             : {
    2774           0 :         return dce_v11_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
    2775             : }
    2776             : 
    2777           0 : static int dce_v11_0_crtc_set_base_atomic(struct drm_crtc *crtc,
    2778             :                                          struct drm_framebuffer *fb,
    2779             :                                          int x, int y, enum mode_set_atomic state)
    2780             : {
    2781           0 :         return dce_v11_0_crtc_do_set_base(crtc, fb, x, y, 1);
    2782             : }
    2783             : 
    2784             : static const struct drm_crtc_helper_funcs dce_v11_0_crtc_helper_funcs = {
    2785             :         .dpms = dce_v11_0_crtc_dpms,
    2786             :         .mode_fixup = dce_v11_0_crtc_mode_fixup,
    2787             :         .mode_set = dce_v11_0_crtc_mode_set,
    2788             :         .mode_set_base = dce_v11_0_crtc_set_base,
    2789             :         .mode_set_base_atomic = dce_v11_0_crtc_set_base_atomic,
    2790             :         .prepare = dce_v11_0_crtc_prepare,
    2791             :         .commit = dce_v11_0_crtc_commit,
    2792             :         .disable = dce_v11_0_crtc_disable,
    2793             :         .get_scanout_position = amdgpu_crtc_get_scanout_position,
    2794             : };
    2795             : 
    2796           0 : static int dce_v11_0_crtc_init(struct amdgpu_device *adev, int index)
    2797             : {
    2798             :         struct amdgpu_crtc *amdgpu_crtc;
    2799             : 
    2800           0 :         amdgpu_crtc = kzalloc(sizeof(struct amdgpu_crtc) +
    2801             :                               (AMDGPUFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
    2802           0 :         if (amdgpu_crtc == NULL)
    2803             :                 return -ENOMEM;
    2804             : 
    2805           0 :         drm_crtc_init(adev_to_drm(adev), &amdgpu_crtc->base, &dce_v11_0_crtc_funcs);
    2806             : 
    2807           0 :         drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256);
    2808           0 :         amdgpu_crtc->crtc_id = index;
    2809           0 :         adev->mode_info.crtcs[index] = amdgpu_crtc;
    2810             : 
    2811           0 :         amdgpu_crtc->max_cursor_width = 128;
    2812           0 :         amdgpu_crtc->max_cursor_height = 128;
    2813           0 :         adev_to_drm(adev)->mode_config.cursor_width = amdgpu_crtc->max_cursor_width;
    2814           0 :         adev_to_drm(adev)->mode_config.cursor_height = amdgpu_crtc->max_cursor_height;
    2815             : 
    2816           0 :         switch (amdgpu_crtc->crtc_id) {
    2817             :         case 0:
    2818             :         default:
    2819           0 :                 amdgpu_crtc->crtc_offset = CRTC0_REGISTER_OFFSET;
    2820           0 :                 break;
    2821             :         case 1:
    2822           0 :                 amdgpu_crtc->crtc_offset = CRTC1_REGISTER_OFFSET;
    2823           0 :                 break;
    2824             :         case 2:
    2825           0 :                 amdgpu_crtc->crtc_offset = CRTC2_REGISTER_OFFSET;
    2826           0 :                 break;
    2827             :         case 3:
    2828           0 :                 amdgpu_crtc->crtc_offset = CRTC3_REGISTER_OFFSET;
    2829           0 :                 break;
    2830             :         case 4:
    2831           0 :                 amdgpu_crtc->crtc_offset = CRTC4_REGISTER_OFFSET;
    2832           0 :                 break;
    2833             :         case 5:
    2834           0 :                 amdgpu_crtc->crtc_offset = CRTC5_REGISTER_OFFSET;
    2835           0 :                 break;
    2836             :         }
    2837             : 
    2838           0 :         amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
    2839           0 :         amdgpu_crtc->adjusted_clock = 0;
    2840           0 :         amdgpu_crtc->encoder = NULL;
    2841           0 :         amdgpu_crtc->connector = NULL;
    2842           0 :         drm_crtc_helper_add(&amdgpu_crtc->base, &dce_v11_0_crtc_helper_funcs);
    2843             : 
    2844           0 :         return 0;
    2845             : }
    2846             : 
    2847           0 : static int dce_v11_0_early_init(void *handle)
    2848             : {
    2849           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    2850             : 
    2851           0 :         adev->audio_endpt_rreg = &dce_v11_0_audio_endpt_rreg;
    2852           0 :         adev->audio_endpt_wreg = &dce_v11_0_audio_endpt_wreg;
    2853             : 
    2854           0 :         dce_v11_0_set_display_funcs(adev);
    2855             : 
    2856           0 :         adev->mode_info.num_crtc = dce_v11_0_get_num_crtc(adev);
    2857             : 
    2858           0 :         switch (adev->asic_type) {
    2859             :         case CHIP_CARRIZO:
    2860           0 :                 adev->mode_info.num_hpd = 6;
    2861           0 :                 adev->mode_info.num_dig = 9;
    2862           0 :                 break;
    2863             :         case CHIP_STONEY:
    2864           0 :                 adev->mode_info.num_hpd = 6;
    2865           0 :                 adev->mode_info.num_dig = 9;
    2866           0 :                 break;
    2867             :         case CHIP_POLARIS10:
    2868             :         case CHIP_VEGAM:
    2869           0 :                 adev->mode_info.num_hpd = 6;
    2870           0 :                 adev->mode_info.num_dig = 6;
    2871           0 :                 break;
    2872             :         case CHIP_POLARIS11:
    2873             :         case CHIP_POLARIS12:
    2874           0 :                 adev->mode_info.num_hpd = 5;
    2875           0 :                 adev->mode_info.num_dig = 5;
    2876           0 :                 break;
    2877             :         default:
    2878             :                 /* FIXME: not supported yet */
    2879             :                 return -EINVAL;
    2880             :         }
    2881             : 
    2882           0 :         dce_v11_0_set_irq_funcs(adev);
    2883             : 
    2884           0 :         return 0;
    2885             : }
    2886             : 
    2887           0 : static int dce_v11_0_sw_init(void *handle)
    2888             : {
    2889             :         int r, i;
    2890           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    2891             : 
    2892           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
    2893           0 :                 r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq);
    2894           0 :                 if (r)
    2895             :                         return r;
    2896             :         }
    2897             : 
    2898           0 :         for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP; i < 20; i += 2) {
    2899           0 :                 r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq);
    2900           0 :                 if (r)
    2901             :                         return r;
    2902             :         }
    2903             : 
    2904             :         /* HPD hotplug */
    2905           0 :         r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq);
    2906           0 :         if (r)
    2907             :                 return r;
    2908             : 
    2909           0 :         adev_to_drm(adev)->mode_config.funcs = &amdgpu_mode_funcs;
    2910             : 
    2911           0 :         adev_to_drm(adev)->mode_config.async_page_flip = true;
    2912             : 
    2913           0 :         adev_to_drm(adev)->mode_config.max_width = 16384;
    2914           0 :         adev_to_drm(adev)->mode_config.max_height = 16384;
    2915             : 
    2916           0 :         adev_to_drm(adev)->mode_config.preferred_depth = 24;
    2917           0 :         adev_to_drm(adev)->mode_config.prefer_shadow = 1;
    2918             : 
    2919           0 :         adev_to_drm(adev)->mode_config.fb_modifiers_not_supported = true;
    2920             : 
    2921           0 :         adev_to_drm(adev)->mode_config.fb_base = adev->gmc.aper_base;
    2922             : 
    2923           0 :         r = amdgpu_display_modeset_create_props(adev);
    2924           0 :         if (r)
    2925             :                 return r;
    2926             : 
    2927           0 :         adev_to_drm(adev)->mode_config.max_width = 16384;
    2928           0 :         adev_to_drm(adev)->mode_config.max_height = 16384;
    2929             : 
    2930             : 
    2931             :         /* allocate crtcs */
    2932           0 :         for (i = 0; i < adev->mode_info.num_crtc; i++) {
    2933           0 :                 r = dce_v11_0_crtc_init(adev, i);
    2934           0 :                 if (r)
    2935             :                         return r;
    2936             :         }
    2937             : 
    2938           0 :         if (amdgpu_atombios_get_connector_info_from_object_table(adev))
    2939           0 :                 amdgpu_display_print_display_setup(adev_to_drm(adev));
    2940             :         else
    2941             :                 return -EINVAL;
    2942             : 
    2943             :         /* setup afmt */
    2944           0 :         r = dce_v11_0_afmt_init(adev);
    2945           0 :         if (r)
    2946             :                 return r;
    2947             : 
    2948           0 :         r = dce_v11_0_audio_init(adev);
    2949           0 :         if (r)
    2950             :                 return r;
    2951             : 
    2952           0 :         drm_kms_helper_poll_init(adev_to_drm(adev));
    2953             : 
    2954           0 :         adev->mode_info.mode_config_initialized = true;
    2955           0 :         return 0;
    2956             : }
    2957             : 
    2958           0 : static int dce_v11_0_sw_fini(void *handle)
    2959             : {
    2960           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    2961             : 
    2962           0 :         kfree(adev->mode_info.bios_hardcoded_edid);
    2963             : 
    2964           0 :         drm_kms_helper_poll_fini(adev_to_drm(adev));
    2965             : 
    2966           0 :         dce_v11_0_audio_fini(adev);
    2967             : 
    2968           0 :         dce_v11_0_afmt_fini(adev);
    2969             : 
    2970           0 :         drm_mode_config_cleanup(adev_to_drm(adev));
    2971           0 :         adev->mode_info.mode_config_initialized = false;
    2972             : 
    2973           0 :         return 0;
    2974             : }
    2975             : 
    2976           0 : static int dce_v11_0_hw_init(void *handle)
    2977             : {
    2978             :         int i;
    2979           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    2980             : 
    2981           0 :         dce_v11_0_init_golden_registers(adev);
    2982             : 
    2983             :         /* disable vga render */
    2984           0 :         dce_v11_0_set_vga_render_state(adev, false);
    2985             :         /* init dig PHYs, disp eng pll */
    2986           0 :         amdgpu_atombios_crtc_powergate_init(adev);
    2987           0 :         amdgpu_atombios_encoder_init_dig(adev);
    2988           0 :         if ((adev->asic_type == CHIP_POLARIS10) ||
    2989             :             (adev->asic_type == CHIP_POLARIS11) ||
    2990           0 :             (adev->asic_type == CHIP_POLARIS12) ||
    2991             :             (adev->asic_type == CHIP_VEGAM)) {
    2992           0 :                 amdgpu_atombios_crtc_set_dce_clock(adev, adev->clock.default_dispclk,
    2993             :                                                    DCE_CLOCK_TYPE_DISPCLK, ATOM_GCK_DFS);
    2994           0 :                 amdgpu_atombios_crtc_set_dce_clock(adev, 0,
    2995             :                                                    DCE_CLOCK_TYPE_DPREFCLK, ATOM_GCK_DFS);
    2996             :         } else {
    2997           0 :                 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
    2998             :         }
    2999             : 
    3000             :         /* initialize hpd */
    3001           0 :         dce_v11_0_hpd_init(adev);
    3002             : 
    3003           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
    3004           0 :                 dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
    3005             :         }
    3006             : 
    3007           0 :         dce_v11_0_pageflip_interrupt_init(adev);
    3008             : 
    3009           0 :         return 0;
    3010             : }
    3011             : 
    3012           0 : static int dce_v11_0_hw_fini(void *handle)
    3013             : {
    3014             :         int i;
    3015           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    3016             : 
    3017           0 :         dce_v11_0_hpd_fini(adev);
    3018             : 
    3019           0 :         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
    3020           0 :                 dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
    3021             :         }
    3022             : 
    3023           0 :         dce_v11_0_pageflip_interrupt_fini(adev);
    3024             : 
    3025           0 :         return 0;
    3026             : }
    3027             : 
    3028           0 : static int dce_v11_0_suspend(void *handle)
    3029             : {
    3030           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    3031             :         int r;
    3032             : 
    3033           0 :         r = amdgpu_display_suspend_helper(adev);
    3034           0 :         if (r)
    3035             :                 return r;
    3036             : 
    3037           0 :         adev->mode_info.bl_level =
    3038           0 :                 amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
    3039             : 
    3040           0 :         return dce_v11_0_hw_fini(handle);
    3041             : }
    3042             : 
    3043           0 : static int dce_v11_0_resume(void *handle)
    3044             : {
    3045           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    3046             :         int ret;
    3047             : 
    3048           0 :         amdgpu_atombios_encoder_set_backlight_level_to_reg(adev,
    3049           0 :                                                            adev->mode_info.bl_level);
    3050             : 
    3051           0 :         ret = dce_v11_0_hw_init(handle);
    3052             : 
    3053             :         /* turn on the BL */
    3054           0 :         if (adev->mode_info.bl_encoder) {
    3055           0 :                 u8 bl_level = amdgpu_display_backlight_get_level(adev,
    3056             :                                                                   adev->mode_info.bl_encoder);
    3057           0 :                 amdgpu_display_backlight_set_level(adev, adev->mode_info.bl_encoder,
    3058             :                                                     bl_level);
    3059             :         }
    3060           0 :         if (ret)
    3061             :                 return ret;
    3062             : 
    3063           0 :         return amdgpu_display_resume_helper(adev);
    3064             : }
    3065             : 
    3066           0 : static bool dce_v11_0_is_idle(void *handle)
    3067             : {
    3068           0 :         return true;
    3069             : }
    3070             : 
    3071           0 : static int dce_v11_0_wait_for_idle(void *handle)
    3072             : {
    3073           0 :         return 0;
    3074             : }
    3075             : 
    3076           0 : static int dce_v11_0_soft_reset(void *handle)
    3077             : {
    3078           0 :         u32 srbm_soft_reset = 0, tmp;
    3079           0 :         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    3080             : 
    3081           0 :         if (dce_v11_0_is_display_hung(adev))
    3082           0 :                 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
    3083             : 
    3084           0 :         if (srbm_soft_reset) {
    3085           0 :                 tmp = RREG32(mmSRBM_SOFT_RESET);
    3086           0 :                 tmp |= srbm_soft_reset;
    3087           0 :                 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
    3088           0 :                 WREG32(mmSRBM_SOFT_RESET, tmp);
    3089           0 :                 tmp = RREG32(mmSRBM_SOFT_RESET);
    3090             : 
    3091           0 :                 udelay(50);
    3092             : 
    3093           0 :                 tmp &= ~srbm_soft_reset;
    3094           0 :                 WREG32(mmSRBM_SOFT_RESET, tmp);
    3095           0 :                 tmp = RREG32(mmSRBM_SOFT_RESET);
    3096             : 
    3097             :                 /* Wait a little for things to settle down */
    3098             :                 udelay(50);
    3099             :         }
    3100           0 :         return 0;
    3101             : }
    3102             : 
    3103           0 : static void dce_v11_0_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev,
    3104             :                                                      int crtc,
    3105             :                                                      enum amdgpu_interrupt_state state)
    3106             : {
    3107             :         u32 lb_interrupt_mask;
    3108             : 
    3109           0 :         if (crtc >= adev->mode_info.num_crtc) {
    3110           0 :                 DRM_DEBUG("invalid crtc %d\n", crtc);
    3111           0 :                 return;
    3112             :         }
    3113             : 
    3114           0 :         switch (state) {
    3115             :         case AMDGPU_IRQ_STATE_DISABLE:
    3116           0 :                 lb_interrupt_mask = RREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc]);
    3117           0 :                 lb_interrupt_mask = REG_SET_FIELD(lb_interrupt_mask, LB_INTERRUPT_MASK,
    3118             :                                                   VBLANK_INTERRUPT_MASK, 0);
    3119           0 :                 WREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc], lb_interrupt_mask);
    3120           0 :                 break;
    3121             :         case AMDGPU_IRQ_STATE_ENABLE:
    3122           0 :                 lb_interrupt_mask = RREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc]);
    3123           0 :                 lb_interrupt_mask = REG_SET_FIELD(lb_interrupt_mask, LB_INTERRUPT_MASK,
    3124             :                                                   VBLANK_INTERRUPT_MASK, 1);
    3125           0 :                 WREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc], lb_interrupt_mask);
    3126           0 :                 break;
    3127             :         default:
    3128             :                 break;
    3129             :         }
    3130             : }
    3131             : 
    3132           0 : static void dce_v11_0_set_crtc_vline_interrupt_state(struct amdgpu_device *adev,
    3133             :                                                     int crtc,
    3134             :                                                     enum amdgpu_interrupt_state state)
    3135             : {
    3136             :         u32 lb_interrupt_mask;
    3137             : 
    3138           0 :         if (crtc >= adev->mode_info.num_crtc) {
    3139           0 :                 DRM_DEBUG("invalid crtc %d\n", crtc);
    3140           0 :                 return;
    3141             :         }
    3142             : 
    3143           0 :         switch (state) {
    3144             :         case AMDGPU_IRQ_STATE_DISABLE:
    3145           0 :                 lb_interrupt_mask = RREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc]);
    3146           0 :                 lb_interrupt_mask = REG_SET_FIELD(lb_interrupt_mask, LB_INTERRUPT_MASK,
    3147             :                                                   VLINE_INTERRUPT_MASK, 0);
    3148           0 :                 WREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc], lb_interrupt_mask);
    3149           0 :                 break;
    3150             :         case AMDGPU_IRQ_STATE_ENABLE:
    3151           0 :                 lb_interrupt_mask = RREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc]);
    3152           0 :                 lb_interrupt_mask = REG_SET_FIELD(lb_interrupt_mask, LB_INTERRUPT_MASK,
    3153             :                                                   VLINE_INTERRUPT_MASK, 1);
    3154           0 :                 WREG32(mmLB_INTERRUPT_MASK + crtc_offsets[crtc], lb_interrupt_mask);
    3155           0 :                 break;
    3156             :         default:
    3157             :                 break;
    3158             :         }
    3159             : }
    3160             : 
    3161           0 : static int dce_v11_0_set_hpd_irq_state(struct amdgpu_device *adev,
    3162             :                                         struct amdgpu_irq_src *source,
    3163             :                                         unsigned hpd,
    3164             :                                         enum amdgpu_interrupt_state state)
    3165             : {
    3166             :         u32 tmp;
    3167             : 
    3168           0 :         if (hpd >= adev->mode_info.num_hpd) {
    3169           0 :                 DRM_DEBUG("invalid hdp %d\n", hpd);
    3170           0 :                 return 0;
    3171             :         }
    3172             : 
    3173           0 :         switch (state) {
    3174             :         case AMDGPU_IRQ_STATE_DISABLE:
    3175           0 :                 tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);
    3176           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
    3177           0 :                 WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);
    3178           0 :                 break;
    3179             :         case AMDGPU_IRQ_STATE_ENABLE:
    3180           0 :                 tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);
    3181           0 :                 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 1);
    3182           0 :                 WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);
    3183           0 :                 break;
    3184             :         default:
    3185             :                 break;
    3186             :         }
    3187             : 
    3188             :         return 0;
    3189             : }
    3190             : 
    3191           0 : static int dce_v11_0_set_crtc_irq_state(struct amdgpu_device *adev,
    3192             :                                         struct amdgpu_irq_src *source,
    3193             :                                         unsigned type,
    3194             :                                         enum amdgpu_interrupt_state state)
    3195             : {
    3196           0 :         switch (type) {
    3197             :         case AMDGPU_CRTC_IRQ_VBLANK1:
    3198           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 0, state);
    3199           0 :                 break;
    3200             :         case AMDGPU_CRTC_IRQ_VBLANK2:
    3201           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 1, state);
    3202           0 :                 break;
    3203             :         case AMDGPU_CRTC_IRQ_VBLANK3:
    3204           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 2, state);
    3205           0 :                 break;
    3206             :         case AMDGPU_CRTC_IRQ_VBLANK4:
    3207           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 3, state);
    3208           0 :                 break;
    3209             :         case AMDGPU_CRTC_IRQ_VBLANK5:
    3210           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 4, state);
    3211           0 :                 break;
    3212             :         case AMDGPU_CRTC_IRQ_VBLANK6:
    3213           0 :                 dce_v11_0_set_crtc_vblank_interrupt_state(adev, 5, state);
    3214           0 :                 break;
    3215             :         case AMDGPU_CRTC_IRQ_VLINE1:
    3216           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 0, state);
    3217           0 :                 break;
    3218             :         case AMDGPU_CRTC_IRQ_VLINE2:
    3219           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 1, state);
    3220           0 :                 break;
    3221             :         case AMDGPU_CRTC_IRQ_VLINE3:
    3222           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 2, state);
    3223           0 :                 break;
    3224             :         case AMDGPU_CRTC_IRQ_VLINE4:
    3225           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 3, state);
    3226           0 :                 break;
    3227             :         case AMDGPU_CRTC_IRQ_VLINE5:
    3228           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 4, state);
    3229           0 :                 break;
    3230             :          case AMDGPU_CRTC_IRQ_VLINE6:
    3231           0 :                 dce_v11_0_set_crtc_vline_interrupt_state(adev, 5, state);
    3232           0 :                 break;
    3233             :         default:
    3234             :                 break;
    3235             :         }
    3236           0 :         return 0;
    3237             : }
    3238             : 
    3239           0 : static int dce_v11_0_set_pageflip_irq_state(struct amdgpu_device *adev,
    3240             :                                             struct amdgpu_irq_src *src,
    3241             :                                             unsigned type,
    3242             :                                             enum amdgpu_interrupt_state state)
    3243             : {
    3244             :         u32 reg;
    3245             : 
    3246           0 :         if (type >= adev->mode_info.num_crtc) {
    3247           0 :                 DRM_ERROR("invalid pageflip crtc %d\n", type);
    3248           0 :                 return -EINVAL;
    3249             :         }
    3250             : 
    3251           0 :         reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
    3252           0 :         if (state == AMDGPU_IRQ_STATE_DISABLE)
    3253           0 :                 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
    3254             :                        reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
    3255             :         else
    3256           0 :                 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
    3257             :                        reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
    3258             : 
    3259             :         return 0;
    3260             : }
    3261             : 
    3262           0 : static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
    3263             :                                   struct amdgpu_irq_src *source,
    3264             :                                   struct amdgpu_iv_entry *entry)
    3265             : {
    3266             :         unsigned long flags;
    3267             :         unsigned crtc_id;
    3268             :         struct amdgpu_crtc *amdgpu_crtc;
    3269             :         struct amdgpu_flip_work *works;
    3270             : 
    3271           0 :         crtc_id = (entry->src_id - 8) >> 1;
    3272           0 :         amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
    3273             : 
    3274           0 :         if (crtc_id >= adev->mode_info.num_crtc) {
    3275           0 :                 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
    3276           0 :                 return -EINVAL;
    3277             :         }
    3278             : 
    3279           0 :         if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
    3280             :             GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
    3281           0 :                 WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
    3282             :                        GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
    3283             : 
    3284             :         /* IRQ could occur when in initial stage */
    3285           0 :         if(amdgpu_crtc == NULL)
    3286             :                 return 0;
    3287             : 
    3288           0 :         spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags);
    3289           0 :         works = amdgpu_crtc->pflip_works;
    3290           0 :         if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED){
    3291           0 :                 DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
    3292             :                                                  "AMDGPU_FLIP_SUBMITTED(%d)\n",
    3293             :                                                  amdgpu_crtc->pflip_status,
    3294             :                                                  AMDGPU_FLIP_SUBMITTED);
    3295           0 :                 spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
    3296           0 :                 return 0;
    3297             :         }
    3298             : 
    3299             :         /* page flip completed. clean up */
    3300           0 :         amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
    3301           0 :         amdgpu_crtc->pflip_works = NULL;
    3302             : 
    3303             :         /* wakeup usersapce */
    3304           0 :         if(works->event)
    3305           0 :                 drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
    3306             : 
    3307           0 :         spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
    3308             : 
    3309           0 :         drm_crtc_vblank_put(&amdgpu_crtc->base);
    3310           0 :         schedule_work(&works->unpin_work);
    3311             : 
    3312           0 :         return 0;
    3313             : }
    3314             : 
    3315           0 : static void dce_v11_0_hpd_int_ack(struct amdgpu_device *adev,
    3316             :                                   int hpd)
    3317             : {
    3318             :         u32 tmp;
    3319             : 
    3320           0 :         if (hpd >= adev->mode_info.num_hpd) {
    3321           0 :                 DRM_DEBUG("invalid hdp %d\n", hpd);
    3322           0 :                 return;
    3323             :         }
    3324             : 
    3325           0 :         tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);
    3326           0 :         tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_ACK, 1);
    3327           0 :         WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);
    3328             : }
    3329             : 
    3330           0 : static void dce_v11_0_crtc_vblank_int_ack(struct amdgpu_device *adev,
    3331             :                                           int crtc)
    3332             : {
    3333             :         u32 tmp;
    3334             : 
    3335           0 :         if (crtc < 0 || crtc >= adev->mode_info.num_crtc) {
    3336           0 :                 DRM_DEBUG("invalid crtc %d\n", crtc);
    3337           0 :                 return;
    3338             :         }
    3339             : 
    3340           0 :         tmp = RREG32(mmLB_VBLANK_STATUS + crtc_offsets[crtc]);
    3341           0 :         tmp = REG_SET_FIELD(tmp, LB_VBLANK_STATUS, VBLANK_ACK, 1);
    3342           0 :         WREG32(mmLB_VBLANK_STATUS + crtc_offsets[crtc], tmp);
    3343             : }
    3344             : 
    3345           0 : static void dce_v11_0_crtc_vline_int_ack(struct amdgpu_device *adev,
    3346             :                                          int crtc)
    3347             : {
    3348             :         u32 tmp;
    3349             : 
    3350           0 :         if (crtc < 0 || crtc >= adev->mode_info.num_crtc) {
    3351           0 :                 DRM_DEBUG("invalid crtc %d\n", crtc);
    3352           0 :                 return;
    3353             :         }
    3354             : 
    3355           0 :         tmp = RREG32(mmLB_VLINE_STATUS + crtc_offsets[crtc]);
    3356           0 :         tmp = REG_SET_FIELD(tmp, LB_VLINE_STATUS, VLINE_ACK, 1);
    3357           0 :         WREG32(mmLB_VLINE_STATUS + crtc_offsets[crtc], tmp);
    3358             : }
    3359             : 
    3360           0 : static int dce_v11_0_crtc_irq(struct amdgpu_device *adev,
    3361             :                                 struct amdgpu_irq_src *source,
    3362             :                                 struct amdgpu_iv_entry *entry)
    3363             : {
    3364           0 :         unsigned crtc = entry->src_id - 1;
    3365           0 :         uint32_t disp_int = RREG32(interrupt_status_offsets[crtc].reg);
    3366           0 :         unsigned int irq_type = amdgpu_display_crtc_idx_to_irq_type(adev,
    3367             :                                                                     crtc);
    3368             : 
    3369           0 :         switch (entry->src_data[0]) {
    3370             :         case 0: /* vblank */
    3371           0 :                 if (disp_int & interrupt_status_offsets[crtc].vblank)
    3372           0 :                         dce_v11_0_crtc_vblank_int_ack(adev, crtc);
    3373             :                 else
    3374           0 :                         DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
    3375             : 
    3376           0 :                 if (amdgpu_irq_enabled(adev, source, irq_type)) {
    3377           0 :                         drm_handle_vblank(adev_to_drm(adev), crtc);
    3378             :                 }
    3379           0 :                 DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
    3380             : 
    3381           0 :                 break;
    3382             :         case 1: /* vline */
    3383           0 :                 if (disp_int & interrupt_status_offsets[crtc].vline)
    3384           0 :                         dce_v11_0_crtc_vline_int_ack(adev, crtc);
    3385             :                 else
    3386           0 :                         DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
    3387             : 
    3388           0 :                 DRM_DEBUG("IH: D%d vline\n", crtc + 1);
    3389             : 
    3390           0 :                 break;
    3391             :         default:
    3392           0 :                 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data[0]);
    3393           0 :                 break;
    3394             :         }
    3395             : 
    3396           0 :         return 0;
    3397             : }
    3398             : 
    3399           0 : static int dce_v11_0_hpd_irq(struct amdgpu_device *adev,
    3400             :                              struct amdgpu_irq_src *source,
    3401             :                              struct amdgpu_iv_entry *entry)
    3402             : {
    3403             :         uint32_t disp_int, mask;
    3404             :         unsigned hpd;
    3405             : 
    3406           0 :         if (entry->src_data[0] >= adev->mode_info.num_hpd) {
    3407           0 :                 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data[0]);
    3408           0 :                 return 0;
    3409             :         }
    3410             : 
    3411           0 :         hpd = entry->src_data[0];
    3412           0 :         disp_int = RREG32(interrupt_status_offsets[hpd].reg);
    3413           0 :         mask = interrupt_status_offsets[hpd].hpd;
    3414             : 
    3415           0 :         if (disp_int & mask) {
    3416           0 :                 dce_v11_0_hpd_int_ack(adev, hpd);
    3417           0 :                 schedule_work(&adev->hotplug_work);
    3418           0 :                 DRM_DEBUG("IH: HPD%d\n", hpd + 1);
    3419             :         }
    3420             : 
    3421             :         return 0;
    3422             : }
    3423             : 
    3424           0 : static int dce_v11_0_set_clockgating_state(void *handle,
    3425             :                                           enum amd_clockgating_state state)
    3426             : {
    3427           0 :         return 0;
    3428             : }
    3429             : 
    3430           0 : static int dce_v11_0_set_powergating_state(void *handle,
    3431             :                                           enum amd_powergating_state state)
    3432             : {
    3433           0 :         return 0;
    3434             : }
    3435             : 
    3436             : static const struct amd_ip_funcs dce_v11_0_ip_funcs = {
    3437             :         .name = "dce_v11_0",
    3438             :         .early_init = dce_v11_0_early_init,
    3439             :         .late_init = NULL,
    3440             :         .sw_init = dce_v11_0_sw_init,
    3441             :         .sw_fini = dce_v11_0_sw_fini,
    3442             :         .hw_init = dce_v11_0_hw_init,
    3443             :         .hw_fini = dce_v11_0_hw_fini,
    3444             :         .suspend = dce_v11_0_suspend,
    3445             :         .resume = dce_v11_0_resume,
    3446             :         .is_idle = dce_v11_0_is_idle,
    3447             :         .wait_for_idle = dce_v11_0_wait_for_idle,
    3448             :         .soft_reset = dce_v11_0_soft_reset,
    3449             :         .set_clockgating_state = dce_v11_0_set_clockgating_state,
    3450             :         .set_powergating_state = dce_v11_0_set_powergating_state,
    3451             : };
    3452             : 
    3453             : static void
    3454           0 : dce_v11_0_encoder_mode_set(struct drm_encoder *encoder,
    3455             :                           struct drm_display_mode *mode,
    3456             :                           struct drm_display_mode *adjusted_mode)
    3457             : {
    3458           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    3459             : 
    3460           0 :         amdgpu_encoder->pixel_clock = adjusted_mode->clock;
    3461             : 
    3462             :         /* need to call this here rather than in prepare() since we need some crtc info */
    3463           0 :         amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
    3464             : 
    3465             :         /* set scaler clears this on some chips */
    3466           0 :         dce_v11_0_set_interleave(encoder->crtc, mode);
    3467             : 
    3468           0 :         if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
    3469           0 :                 dce_v11_0_afmt_enable(encoder, true);
    3470           0 :                 dce_v11_0_afmt_setmode(encoder, adjusted_mode);
    3471             :         }
    3472           0 : }
    3473             : 
    3474           0 : static void dce_v11_0_encoder_prepare(struct drm_encoder *encoder)
    3475             : {
    3476           0 :         struct amdgpu_device *adev = drm_to_adev(encoder->dev);
    3477           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    3478           0 :         struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
    3479             : 
    3480           0 :         if ((amdgpu_encoder->active_device &
    3481           0 :              (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
    3482           0 :             (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) !=
    3483             :              ENCODER_OBJECT_ID_NONE)) {
    3484           0 :                 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
    3485           0 :                 if (dig) {
    3486           0 :                         dig->dig_encoder = dce_v11_0_pick_dig_encoder(encoder);
    3487           0 :                         if (amdgpu_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT)
    3488           0 :                                 dig->afmt = adev->mode_info.afmt[dig->dig_encoder];
    3489             :                 }
    3490             :         }
    3491             : 
    3492           0 :         amdgpu_atombios_scratch_regs_lock(adev, true);
    3493             : 
    3494           0 :         if (connector) {
    3495           0 :                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
    3496             : 
    3497             :                 /* select the clock/data port if it uses a router */
    3498           0 :                 if (amdgpu_connector->router.cd_valid)
    3499           0 :                         amdgpu_i2c_router_select_cd_port(amdgpu_connector);
    3500             : 
    3501             :                 /* turn eDP panel on for mode set */
    3502           0 :                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
    3503           0 :                         amdgpu_atombios_encoder_set_edp_panel_power(connector,
    3504             :                                                              ATOM_TRANSMITTER_ACTION_POWER_ON);
    3505             :         }
    3506             : 
    3507             :         /* this is needed for the pll/ss setup to work correctly in some cases */
    3508           0 :         amdgpu_atombios_encoder_set_crtc_source(encoder);
    3509             :         /* set up the FMT blocks */
    3510           0 :         dce_v11_0_program_fmt(encoder);
    3511           0 : }
    3512             : 
    3513           0 : static void dce_v11_0_encoder_commit(struct drm_encoder *encoder)
    3514             : {
    3515           0 :         struct drm_device *dev = encoder->dev;
    3516           0 :         struct amdgpu_device *adev = drm_to_adev(dev);
    3517             : 
    3518             :         /* need to call this here as we need the crtc set up */
    3519           0 :         amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_ON);
    3520           0 :         amdgpu_atombios_scratch_regs_lock(adev, false);
    3521           0 : }
    3522             : 
    3523           0 : static void dce_v11_0_encoder_disable(struct drm_encoder *encoder)
    3524             : {
    3525           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    3526             :         struct amdgpu_encoder_atom_dig *dig;
    3527             : 
    3528           0 :         amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
    3529             : 
    3530           0 :         if (amdgpu_atombios_encoder_is_digital(encoder)) {
    3531           0 :                 if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
    3532           0 :                         dce_v11_0_afmt_enable(encoder, false);
    3533           0 :                 dig = amdgpu_encoder->enc_priv;
    3534           0 :                 dig->dig_encoder = -1;
    3535             :         }
    3536           0 :         amdgpu_encoder->active_device = 0;
    3537           0 : }
    3538             : 
    3539             : /* these are handled by the primary encoders */
    3540           0 : static void dce_v11_0_ext_prepare(struct drm_encoder *encoder)
    3541             : {
    3542             : 
    3543           0 : }
    3544             : 
    3545           0 : static void dce_v11_0_ext_commit(struct drm_encoder *encoder)
    3546             : {
    3547             : 
    3548           0 : }
    3549             : 
    3550             : static void
    3551           0 : dce_v11_0_ext_mode_set(struct drm_encoder *encoder,
    3552             :                       struct drm_display_mode *mode,
    3553             :                       struct drm_display_mode *adjusted_mode)
    3554             : {
    3555             : 
    3556           0 : }
    3557             : 
    3558           0 : static void dce_v11_0_ext_disable(struct drm_encoder *encoder)
    3559             : {
    3560             : 
    3561           0 : }
    3562             : 
    3563             : static void
    3564           0 : dce_v11_0_ext_dpms(struct drm_encoder *encoder, int mode)
    3565             : {
    3566             : 
    3567           0 : }
    3568             : 
    3569             : static const struct drm_encoder_helper_funcs dce_v11_0_ext_helper_funcs = {
    3570             :         .dpms = dce_v11_0_ext_dpms,
    3571             :         .prepare = dce_v11_0_ext_prepare,
    3572             :         .mode_set = dce_v11_0_ext_mode_set,
    3573             :         .commit = dce_v11_0_ext_commit,
    3574             :         .disable = dce_v11_0_ext_disable,
    3575             :         /* no detect for TMDS/LVDS yet */
    3576             : };
    3577             : 
    3578             : static const struct drm_encoder_helper_funcs dce_v11_0_dig_helper_funcs = {
    3579             :         .dpms = amdgpu_atombios_encoder_dpms,
    3580             :         .mode_fixup = amdgpu_atombios_encoder_mode_fixup,
    3581             :         .prepare = dce_v11_0_encoder_prepare,
    3582             :         .mode_set = dce_v11_0_encoder_mode_set,
    3583             :         .commit = dce_v11_0_encoder_commit,
    3584             :         .disable = dce_v11_0_encoder_disable,
    3585             :         .detect = amdgpu_atombios_encoder_dig_detect,
    3586             : };
    3587             : 
    3588             : static const struct drm_encoder_helper_funcs dce_v11_0_dac_helper_funcs = {
    3589             :         .dpms = amdgpu_atombios_encoder_dpms,
    3590             :         .mode_fixup = amdgpu_atombios_encoder_mode_fixup,
    3591             :         .prepare = dce_v11_0_encoder_prepare,
    3592             :         .mode_set = dce_v11_0_encoder_mode_set,
    3593             :         .commit = dce_v11_0_encoder_commit,
    3594             :         .detect = amdgpu_atombios_encoder_dac_detect,
    3595             : };
    3596             : 
    3597           0 : static void dce_v11_0_encoder_destroy(struct drm_encoder *encoder)
    3598             : {
    3599           0 :         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
    3600           0 :         if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
    3601           0 :                 amdgpu_atombios_encoder_fini_backlight(amdgpu_encoder);
    3602           0 :         kfree(amdgpu_encoder->enc_priv);
    3603           0 :         drm_encoder_cleanup(encoder);
    3604           0 :         kfree(amdgpu_encoder);
    3605           0 : }
    3606             : 
    3607             : static const struct drm_encoder_funcs dce_v11_0_encoder_funcs = {
    3608             :         .destroy = dce_v11_0_encoder_destroy,
    3609             : };
    3610             : 
    3611           0 : static void dce_v11_0_encoder_add(struct amdgpu_device *adev,
    3612             :                                  uint32_t encoder_enum,
    3613             :                                  uint32_t supported_device,
    3614             :                                  u16 caps)
    3615             : {
    3616           0 :         struct drm_device *dev = adev_to_drm(adev);
    3617             :         struct drm_encoder *encoder;
    3618             :         struct amdgpu_encoder *amdgpu_encoder;
    3619             : 
    3620             :         /* see if we already added it */
    3621           0 :         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    3622           0 :                 amdgpu_encoder = to_amdgpu_encoder(encoder);
    3623           0 :                 if (amdgpu_encoder->encoder_enum == encoder_enum) {
    3624           0 :                         amdgpu_encoder->devices |= supported_device;
    3625           0 :                         return;
    3626             :                 }
    3627             : 
    3628             :         }
    3629             : 
    3630             :         /* add a new one */
    3631           0 :         amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL);
    3632           0 :         if (!amdgpu_encoder)
    3633             :                 return;
    3634             : 
    3635           0 :         encoder = &amdgpu_encoder->base;
    3636           0 :         switch (adev->mode_info.num_crtc) {
    3637             :         case 1:
    3638           0 :                 encoder->possible_crtcs = 0x1;
    3639           0 :                 break;
    3640             :         case 2:
    3641             :         default:
    3642           0 :                 encoder->possible_crtcs = 0x3;
    3643           0 :                 break;
    3644             :         case 3:
    3645           0 :                 encoder->possible_crtcs = 0x7;
    3646           0 :                 break;
    3647             :         case 4:
    3648           0 :                 encoder->possible_crtcs = 0xf;
    3649           0 :                 break;
    3650             :         case 5:
    3651           0 :                 encoder->possible_crtcs = 0x1f;
    3652           0 :                 break;
    3653             :         case 6:
    3654           0 :                 encoder->possible_crtcs = 0x3f;
    3655           0 :                 break;
    3656             :         }
    3657             : 
    3658           0 :         amdgpu_encoder->enc_priv = NULL;
    3659             : 
    3660           0 :         amdgpu_encoder->encoder_enum = encoder_enum;
    3661           0 :         amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
    3662           0 :         amdgpu_encoder->devices = supported_device;
    3663           0 :         amdgpu_encoder->rmx_type = RMX_OFF;
    3664           0 :         amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
    3665           0 :         amdgpu_encoder->is_ext_encoder = false;
    3666           0 :         amdgpu_encoder->caps = caps;
    3667             : 
    3668             :         switch (amdgpu_encoder->encoder_id) {
    3669             :         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
    3670             :         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
    3671           0 :                 drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3672             :                                  DRM_MODE_ENCODER_DAC, NULL);
    3673           0 :                 drm_encoder_helper_add(encoder, &dce_v11_0_dac_helper_funcs);
    3674             :                 break;
    3675             :         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
    3676             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
    3677             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
    3678             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
    3679             :         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
    3680           0 :                 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
    3681           0 :                         amdgpu_encoder->rmx_type = RMX_FULL;
    3682           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3683             :                                          DRM_MODE_ENCODER_LVDS, NULL);
    3684           0 :                         amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_lcd_info(amdgpu_encoder);
    3685           0 :                 } else if (amdgpu_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) {
    3686           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3687             :                                          DRM_MODE_ENCODER_DAC, NULL);
    3688           0 :                         amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_dig_info(amdgpu_encoder);
    3689             :                 } else {
    3690           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3691             :                                          DRM_MODE_ENCODER_TMDS, NULL);
    3692           0 :                         amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_dig_info(amdgpu_encoder);
    3693             :                 }
    3694           0 :                 drm_encoder_helper_add(encoder, &dce_v11_0_dig_helper_funcs);
    3695             :                 break;
    3696             :         case ENCODER_OBJECT_ID_SI170B:
    3697             :         case ENCODER_OBJECT_ID_CH7303:
    3698             :         case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
    3699             :         case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
    3700             :         case ENCODER_OBJECT_ID_TITFP513:
    3701             :         case ENCODER_OBJECT_ID_VT1623:
    3702             :         case ENCODER_OBJECT_ID_HDMI_SI1930:
    3703             :         case ENCODER_OBJECT_ID_TRAVIS:
    3704             :         case ENCODER_OBJECT_ID_NUTMEG:
    3705             :                 /* these are handled by the primary encoders */
    3706           0 :                 amdgpu_encoder->is_ext_encoder = true;
    3707           0 :                 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
    3708           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3709             :                                          DRM_MODE_ENCODER_LVDS, NULL);
    3710           0 :                 else if (amdgpu_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT))
    3711           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3712             :                                          DRM_MODE_ENCODER_DAC, NULL);
    3713             :                 else
    3714           0 :                         drm_encoder_init(dev, encoder, &dce_v11_0_encoder_funcs,
    3715             :                                          DRM_MODE_ENCODER_TMDS, NULL);
    3716           0 :                 drm_encoder_helper_add(encoder, &dce_v11_0_ext_helper_funcs);
    3717             :                 break;
    3718             :         }
    3719             : }
    3720             : 
    3721             : static const struct amdgpu_display_funcs dce_v11_0_display_funcs = {
    3722             :         .bandwidth_update = &dce_v11_0_bandwidth_update,
    3723             :         .vblank_get_counter = &dce_v11_0_vblank_get_counter,
    3724             :         .backlight_set_level = &amdgpu_atombios_encoder_set_backlight_level,
    3725             :         .backlight_get_level = &amdgpu_atombios_encoder_get_backlight_level,
    3726             :         .hpd_sense = &dce_v11_0_hpd_sense,
    3727             :         .hpd_set_polarity = &dce_v11_0_hpd_set_polarity,
    3728             :         .hpd_get_gpio_reg = &dce_v11_0_hpd_get_gpio_reg,
    3729             :         .page_flip = &dce_v11_0_page_flip,
    3730             :         .page_flip_get_scanoutpos = &dce_v11_0_crtc_get_scanoutpos,
    3731             :         .add_encoder = &dce_v11_0_encoder_add,
    3732             :         .add_connector = &amdgpu_connector_add,
    3733             : };
    3734             : 
    3735             : static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev)
    3736             : {
    3737           0 :         adev->mode_info.funcs = &dce_v11_0_display_funcs;
    3738             : }
    3739             : 
    3740             : static const struct amdgpu_irq_src_funcs dce_v11_0_crtc_irq_funcs = {
    3741             :         .set = dce_v11_0_set_crtc_irq_state,
    3742             :         .process = dce_v11_0_crtc_irq,
    3743             : };
    3744             : 
    3745             : static const struct amdgpu_irq_src_funcs dce_v11_0_pageflip_irq_funcs = {
    3746             :         .set = dce_v11_0_set_pageflip_irq_state,
    3747             :         .process = dce_v11_0_pageflip_irq,
    3748             : };
    3749             : 
    3750             : static const struct amdgpu_irq_src_funcs dce_v11_0_hpd_irq_funcs = {
    3751             :         .set = dce_v11_0_set_hpd_irq_state,
    3752             :         .process = dce_v11_0_hpd_irq,
    3753             : };
    3754             : 
    3755             : static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev)
    3756             : {
    3757           0 :         if (adev->mode_info.num_crtc > 0)
    3758           0 :                 adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_VLINE1 + adev->mode_info.num_crtc;
    3759             :         else
    3760           0 :                 adev->crtc_irq.num_types = 0;
    3761           0 :         adev->crtc_irq.funcs = &dce_v11_0_crtc_irq_funcs;
    3762             : 
    3763           0 :         adev->pageflip_irq.num_types = adev->mode_info.num_crtc;
    3764           0 :         adev->pageflip_irq.funcs = &dce_v11_0_pageflip_irq_funcs;
    3765             : 
    3766           0 :         adev->hpd_irq.num_types = adev->mode_info.num_hpd;
    3767           0 :         adev->hpd_irq.funcs = &dce_v11_0_hpd_irq_funcs;
    3768             : }
    3769             : 
    3770             : const struct amdgpu_ip_block_version dce_v11_0_ip_block =
    3771             : {
    3772             :         .type = AMD_IP_BLOCK_TYPE_DCE,
    3773             :         .major = 11,
    3774             :         .minor = 0,
    3775             :         .rev = 0,
    3776             :         .funcs = &dce_v11_0_ip_funcs,
    3777             : };
    3778             : 
    3779             : const struct amdgpu_ip_block_version dce_v11_2_ip_block =
    3780             : {
    3781             :         .type = AMD_IP_BLOCK_TYPE_DCE,
    3782             :         .major = 11,
    3783             :         .minor = 2,
    3784             :         .rev = 0,
    3785             :         .funcs = &dce_v11_0_ip_funcs,
    3786             : };

Generated by: LCOV version 1.14