linux/drivers/gpu/drm/amd/amdgpu/si.c
<<
>>
Prefs
   1/*
   2 * Copyright 2015 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 <linux/firmware.h>
  25#include <linux/slab.h>
  26#include <linux/module.h>
  27#include <linux/pci.h>
  28
  29#include "amdgpu.h"
  30#include "amdgpu_atombios.h"
  31#include "amdgpu_ih.h"
  32#include "amdgpu_uvd.h"
  33#include "amdgpu_vce.h"
  34#include "atom.h"
  35#include "amd_pcie.h"
  36#include "si_dpm.h"
  37#include "sid.h"
  38#include "si_ih.h"
  39#include "gfx_v6_0.h"
  40#include "gmc_v6_0.h"
  41#include "si_dma.h"
  42#include "dce_v6_0.h"
  43#include "si.h"
  44#include "dce_virtual.h"
  45#include "gca/gfx_6_0_d.h"
  46#include "oss/oss_1_0_d.h"
  47#include "gmc/gmc_6_0_d.h"
  48#include "dce/dce_6_0_d.h"
  49#include "uvd/uvd_4_0_d.h"
  50#include "bif/bif_3_0_d.h"
  51#include "bif/bif_3_0_sh_mask.h"
  52
  53static const u32 tahiti_golden_registers[] =
  54{
  55        mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
  56        mmCB_HW_CONTROL, 0x00010000, 0x00018208,
  57        mmDB_DEBUG, 0xffffffff, 0x00000000,
  58        mmDB_DEBUG2, 0xf00fffff, 0x00000400,
  59        mmDB_DEBUG3, 0x0002021c, 0x00020200,
  60        mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
  61        0x340c, 0x000000c0, 0x00800040,
  62        0x360c, 0x000000c0, 0x00800040,
  63        mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
  64        mmFBC_MISC, 0x00200000, 0x50100000,
  65        mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
  66        mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
  67        mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
  68        mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
  69        mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
  70        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
  71        mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
  72        mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
  73        0x000c, 0xffffffff, 0x0040,
  74        0x000d, 0x00000040, 0x00004040,
  75        mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
  76        mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
  77        mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
  78        mmSX_DEBUG_1, 0x0000007f, 0x00000020,
  79        mmTA_CNTL_AUX, 0x00010000, 0x00010000,
  80        mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
  81        mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
  82        mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
  83        mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
  84        mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
  85        mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
  86        mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
  87        mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
  88        mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  89        mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  90        mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  91};
  92
  93static const u32 tahiti_golden_registers2[] =
  94{
  95        mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
  96};
  97
  98static const u32 tahiti_golden_rlc_registers[] =
  99{
 100        mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
 101        mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 102        0x311f, 0xffffffff, 0x10104040,
 103        0x3122, 0xffffffff, 0x0100000a,
 104        mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 105        mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 106        mmUVD_CGC_GATE, 0x00000008, 0x00000000,
 107};
 108
 109static const u32 pitcairn_golden_registers[] =
 110{
 111        mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 112        mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 113        mmDB_DEBUG, 0xffffffff, 0x00000000,
 114        mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 115        mmDB_DEBUG3, 0x0002021c, 0x00020200,
 116        mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 117        0x340c, 0x000300c0, 0x00800040,
 118        0x360c, 0x000300c0, 0x00800040,
 119        mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 120        mmFBC_MISC, 0x00200000, 0x50100000,
 121        mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 122        mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 123        mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 124        mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 125        mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 126        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 127        mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 128        mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
 129        0x000c, 0xffffffff, 0x0040,
 130        0x000d, 0x00000040, 0x00004040,
 131        mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 132        mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 133        mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 134        mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
 135        mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 136        mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
 137        mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 138        mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 139        mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 140        mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 141        mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 142        mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 143};
 144
 145static const u32 pitcairn_golden_rlc_registers[] =
 146{
 147        mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
 148        mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
 149        0x311f, 0xffffffff, 0x10102020,
 150        0x3122, 0xffffffff, 0x01000020,
 151        mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 152        mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
 153};
 154
 155static const u32 verde_pg_init[] =
 156{
 157        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
 158        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
 159        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 160        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 161        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 162        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 163        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 164        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
 165        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
 166        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 167        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 168        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 169        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 170        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 171        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
 172        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
 173        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 174        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 175        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 176        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 177        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 178        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
 179        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
 180        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 181        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 182        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 183        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 184        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 185        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
 186        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
 187        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 188        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 189        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 190        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 191        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 192        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
 193        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
 194        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 195        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 196        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 197        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 198        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 199        mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 200        mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
 201        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
 202        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
 203        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 204        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 205        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
 206        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
 207        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 208        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 209        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
 210        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
 211        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
 212        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
 213        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
 214        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
 215        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
 216        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
 217        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
 218        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
 219        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
 220        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
 221        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
 222        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
 223        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
 224        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
 225        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
 226        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
 227        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
 228        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
 229        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
 230        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
 231        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
 232        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
 233        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
 234        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
 235        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
 236        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
 237        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
 238        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
 239        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
 240        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
 241        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
 242        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
 243        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
 244        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
 245        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
 246        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
 247        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
 248        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
 249        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
 250        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
 251        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
 252        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
 253        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
 254        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
 255        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
 256        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
 257        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
 258        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
 259        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
 260        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
 261        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
 262        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
 263        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
 264        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
 265        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
 266        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
 267        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
 268        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
 269        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
 270        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
 271        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
 272        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
 273        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
 274        mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
 275        mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
 276        mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
 277        mmGMCON_MISC2, 0xfc00, 0x2000,
 278        mmGMCON_MISC3, 0xffffffff, 0xfc0,
 279        mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
 280};
 281
 282static const u32 verde_golden_rlc_registers[] =
 283{
 284        mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 285        mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
 286        0x311f, 0xffffffff, 0x10808020,
 287        0x3122, 0xffffffff, 0x00800008,
 288        mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
 289        mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
 290};
 291
 292static const u32 verde_golden_registers[] =
 293{
 294        mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 295        mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 296        mmDB_DEBUG, 0xffffffff, 0x00000000,
 297        mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 298        mmDB_DEBUG3, 0x0002021c, 0x00020200,
 299        mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 300        0x340c, 0x000300c0, 0x00800040,
 301        0x360c, 0x000300c0, 0x00800040,
 302        mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 303        mmFBC_MISC, 0x00200000, 0x50100000,
 304        mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 305        mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 306        mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 307        mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 308        mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 309        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 310        mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 311        mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
 312        0x000c, 0xffffffff, 0x0040,
 313        0x000d, 0x00000040, 0x00004040,
 314        mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 315        mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
 316        mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
 317        mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 318        mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 319        mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
 320        mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 321        mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
 322        mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 323        mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 324        mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 325        mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 326        mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 327        mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 328};
 329
 330static const u32 oland_golden_registers[] =
 331{
 332        mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 333        mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 334        mmDB_DEBUG, 0xffffffff, 0x00000000,
 335        mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 336        mmDB_DEBUG3, 0x0002021c, 0x00020200,
 337        mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 338        0x340c, 0x000300c0, 0x00800040,
 339        0x360c, 0x000300c0, 0x00800040,
 340        mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 341        mmFBC_MISC, 0x00200000, 0x50100000,
 342        mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 343        mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 344        mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 345        mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 346        mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 347        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 348        mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 349        mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
 350        0x000c, 0xffffffff, 0x0040,
 351        0x000d, 0x00000040, 0x00004040,
 352        mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 353        mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 354        mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 355        mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
 356        mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 357        mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 358        mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 359        mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 360        mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 361        mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 362        mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 363        mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 364
 365};
 366
 367static const u32 oland_golden_rlc_registers[] =
 368{
 369        mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 370        mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 371        0x311f, 0xffffffff, 0x10104040,
 372        0x3122, 0xffffffff, 0x0100000a,
 373        mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 374        mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 375};
 376
 377static const u32 hainan_golden_registers[] =
 378{
 379        0x17bc, 0x00000030, 0x00000011,
 380        mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 381        mmDB_DEBUG, 0xffffffff, 0x00000000,
 382        mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 383        mmDB_DEBUG3, 0x0002021c, 0x00020200,
 384        0x031e, 0x00000080, 0x00000000,
 385        0x3430, 0xff000fff, 0x00000100,
 386        0x340c, 0x000300c0, 0x00800040,
 387        0x3630, 0xff000fff, 0x00000100,
 388        0x360c, 0x000300c0, 0x00800040,
 389        0x16ec, 0x000000f0, 0x00000070,
 390        0x16f0, 0x00200000, 0x50100000,
 391        0x1c0c, 0x31000311, 0x00000011,
 392        mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 393        mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 394        mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 395        mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 396        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 397        mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 398        mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
 399        0x000c, 0xffffffff, 0x0040,
 400        0x000d, 0x00000040, 0x00004040,
 401        mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
 402        mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 403        mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 404        mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
 405        mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 406        mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 407        mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 408        mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 409        mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 410        mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 411        mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 412        mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 413};
 414
 415static const u32 hainan_golden_registers2[] =
 416{
 417        mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
 418};
 419
 420static const u32 tahiti_mgcg_cgcg_init[] =
 421{
 422        mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 423        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 424        mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 425        mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 426        mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 427        mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 428        mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 429        mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 430        mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 431        mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 432        mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 433        mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 434        mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 435        mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 436        mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 437        mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 438        mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 439        mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 440        mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 441        mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 442        mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 443        mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 444        mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 445        mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 446        mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 447        mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 448        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 449        0x2458, 0xffffffff, 0x00010000,
 450        0x2459, 0xffffffff, 0x00030002,
 451        0x245a, 0xffffffff, 0x00040007,
 452        0x245b, 0xffffffff, 0x00060005,
 453        0x245c, 0xffffffff, 0x00090008,
 454        0x245d, 0xffffffff, 0x00020001,
 455        0x245e, 0xffffffff, 0x00040003,
 456        0x245f, 0xffffffff, 0x00000007,
 457        0x2460, 0xffffffff, 0x00060005,
 458        0x2461, 0xffffffff, 0x00090008,
 459        0x2462, 0xffffffff, 0x00030002,
 460        0x2463, 0xffffffff, 0x00050004,
 461        0x2464, 0xffffffff, 0x00000008,
 462        0x2465, 0xffffffff, 0x00070006,
 463        0x2466, 0xffffffff, 0x000a0009,
 464        0x2467, 0xffffffff, 0x00040003,
 465        0x2468, 0xffffffff, 0x00060005,
 466        0x2469, 0xffffffff, 0x00000009,
 467        0x246a, 0xffffffff, 0x00080007,
 468        0x246b, 0xffffffff, 0x000b000a,
 469        0x246c, 0xffffffff, 0x00050004,
 470        0x246d, 0xffffffff, 0x00070006,
 471        0x246e, 0xffffffff, 0x0008000b,
 472        0x246f, 0xffffffff, 0x000a0009,
 473        0x2470, 0xffffffff, 0x000d000c,
 474        0x2471, 0xffffffff, 0x00060005,
 475        0x2472, 0xffffffff, 0x00080007,
 476        0x2473, 0xffffffff, 0x0000000b,
 477        0x2474, 0xffffffff, 0x000a0009,
 478        0x2475, 0xffffffff, 0x000d000c,
 479        0x2476, 0xffffffff, 0x00070006,
 480        0x2477, 0xffffffff, 0x00090008,
 481        0x2478, 0xffffffff, 0x0000000c,
 482        0x2479, 0xffffffff, 0x000b000a,
 483        0x247a, 0xffffffff, 0x000e000d,
 484        0x247b, 0xffffffff, 0x00080007,
 485        0x247c, 0xffffffff, 0x000a0009,
 486        0x247d, 0xffffffff, 0x0000000d,
 487        0x247e, 0xffffffff, 0x000c000b,
 488        0x247f, 0xffffffff, 0x000f000e,
 489        0x2480, 0xffffffff, 0x00090008,
 490        0x2481, 0xffffffff, 0x000b000a,
 491        0x2482, 0xffffffff, 0x000c000f,
 492        0x2483, 0xffffffff, 0x000e000d,
 493        0x2484, 0xffffffff, 0x00110010,
 494        0x2485, 0xffffffff, 0x000a0009,
 495        0x2486, 0xffffffff, 0x000c000b,
 496        0x2487, 0xffffffff, 0x0000000f,
 497        0x2488, 0xffffffff, 0x000e000d,
 498        0x2489, 0xffffffff, 0x00110010,
 499        0x248a, 0xffffffff, 0x000b000a,
 500        0x248b, 0xffffffff, 0x000d000c,
 501        0x248c, 0xffffffff, 0x00000010,
 502        0x248d, 0xffffffff, 0x000f000e,
 503        0x248e, 0xffffffff, 0x00120011,
 504        0x248f, 0xffffffff, 0x000c000b,
 505        0x2490, 0xffffffff, 0x000e000d,
 506        0x2491, 0xffffffff, 0x00000011,
 507        0x2492, 0xffffffff, 0x0010000f,
 508        0x2493, 0xffffffff, 0x00130012,
 509        0x2494, 0xffffffff, 0x000d000c,
 510        0x2495, 0xffffffff, 0x000f000e,
 511        0x2496, 0xffffffff, 0x00100013,
 512        0x2497, 0xffffffff, 0x00120011,
 513        0x2498, 0xffffffff, 0x00150014,
 514        0x2499, 0xffffffff, 0x000e000d,
 515        0x249a, 0xffffffff, 0x0010000f,
 516        0x249b, 0xffffffff, 0x00000013,
 517        0x249c, 0xffffffff, 0x00120011,
 518        0x249d, 0xffffffff, 0x00150014,
 519        0x249e, 0xffffffff, 0x000f000e,
 520        0x249f, 0xffffffff, 0x00110010,
 521        0x24a0, 0xffffffff, 0x00000014,
 522        0x24a1, 0xffffffff, 0x00130012,
 523        0x24a2, 0xffffffff, 0x00160015,
 524        0x24a3, 0xffffffff, 0x0010000f,
 525        0x24a4, 0xffffffff, 0x00120011,
 526        0x24a5, 0xffffffff, 0x00000015,
 527        0x24a6, 0xffffffff, 0x00140013,
 528        0x24a7, 0xffffffff, 0x00170016,
 529        mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 530        mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 531        mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 532        mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 533        0x000c, 0xffffffff, 0x0000001c,
 534        0x000d, 0x000f0000, 0x000f0000,
 535        0x0583, 0xffffffff, 0x00000100,
 536        mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 537        mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 538        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 539        mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 540        mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 541        mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 542        0x157a, 0x00000001, 0x00000001,
 543        mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 544        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 545        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 546        0x3430, 0xfffffff0, 0x00000100,
 547        0x3630, 0xfffffff0, 0x00000100,
 548};
 549static const u32 pitcairn_mgcg_cgcg_init[] =
 550{
 551        mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 552        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 553        mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 554        mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 555        mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 556        mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 557        mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 558        mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 559        mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 560        mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 561        mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 562        mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 563        mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 564        mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 565        mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 566        mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 567        mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 568        mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 569        mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 570        mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 571        mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 572        mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 573        mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 574        mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 575        mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 576        mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 577        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 578        0x2458, 0xffffffff, 0x00010000,
 579        0x2459, 0xffffffff, 0x00030002,
 580        0x245a, 0xffffffff, 0x00040007,
 581        0x245b, 0xffffffff, 0x00060005,
 582        0x245c, 0xffffffff, 0x00090008,
 583        0x245d, 0xffffffff, 0x00020001,
 584        0x245e, 0xffffffff, 0x00040003,
 585        0x245f, 0xffffffff, 0x00000007,
 586        0x2460, 0xffffffff, 0x00060005,
 587        0x2461, 0xffffffff, 0x00090008,
 588        0x2462, 0xffffffff, 0x00030002,
 589        0x2463, 0xffffffff, 0x00050004,
 590        0x2464, 0xffffffff, 0x00000008,
 591        0x2465, 0xffffffff, 0x00070006,
 592        0x2466, 0xffffffff, 0x000a0009,
 593        0x2467, 0xffffffff, 0x00040003,
 594        0x2468, 0xffffffff, 0x00060005,
 595        0x2469, 0xffffffff, 0x00000009,
 596        0x246a, 0xffffffff, 0x00080007,
 597        0x246b, 0xffffffff, 0x000b000a,
 598        0x246c, 0xffffffff, 0x00050004,
 599        0x246d, 0xffffffff, 0x00070006,
 600        0x246e, 0xffffffff, 0x0008000b,
 601        0x246f, 0xffffffff, 0x000a0009,
 602        0x2470, 0xffffffff, 0x000d000c,
 603        0x2480, 0xffffffff, 0x00090008,
 604        0x2481, 0xffffffff, 0x000b000a,
 605        0x2482, 0xffffffff, 0x000c000f,
 606        0x2483, 0xffffffff, 0x000e000d,
 607        0x2484, 0xffffffff, 0x00110010,
 608        0x2485, 0xffffffff, 0x000a0009,
 609        0x2486, 0xffffffff, 0x000c000b,
 610        0x2487, 0xffffffff, 0x0000000f,
 611        0x2488, 0xffffffff, 0x000e000d,
 612        0x2489, 0xffffffff, 0x00110010,
 613        0x248a, 0xffffffff, 0x000b000a,
 614        0x248b, 0xffffffff, 0x000d000c,
 615        0x248c, 0xffffffff, 0x00000010,
 616        0x248d, 0xffffffff, 0x000f000e,
 617        0x248e, 0xffffffff, 0x00120011,
 618        0x248f, 0xffffffff, 0x000c000b,
 619        0x2490, 0xffffffff, 0x000e000d,
 620        0x2491, 0xffffffff, 0x00000011,
 621        0x2492, 0xffffffff, 0x0010000f,
 622        0x2493, 0xffffffff, 0x00130012,
 623        0x2494, 0xffffffff, 0x000d000c,
 624        0x2495, 0xffffffff, 0x000f000e,
 625        0x2496, 0xffffffff, 0x00100013,
 626        0x2497, 0xffffffff, 0x00120011,
 627        0x2498, 0xffffffff, 0x00150014,
 628        mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 629        mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 630        mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 631        mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 632        0x000c, 0xffffffff, 0x0000001c,
 633        0x000d, 0x000f0000, 0x000f0000,
 634        0x0583, 0xffffffff, 0x00000100,
 635        mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 636        mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 637        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 638        mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 639        0x157a, 0x00000001, 0x00000001,
 640        mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 641        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 642        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 643        0x3430, 0xfffffff0, 0x00000100,
 644        0x3630, 0xfffffff0, 0x00000100,
 645};
 646
 647static const u32 verde_mgcg_cgcg_init[] =
 648{
 649        mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 650        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 651        mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 652        mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 653        mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 654        mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 655        mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 656        mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 657        mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 658        mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 659        mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 660        mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 661        mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 662        mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 663        mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 664        mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 665        mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 666        mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 667        mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 668        mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 669        mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 670        mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 671        mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 672        mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 673        mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 674        mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 675        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 676        0x2458, 0xffffffff, 0x00010000,
 677        0x2459, 0xffffffff, 0x00030002,
 678        0x245a, 0xffffffff, 0x00040007,
 679        0x245b, 0xffffffff, 0x00060005,
 680        0x245c, 0xffffffff, 0x00090008,
 681        0x245d, 0xffffffff, 0x00020001,
 682        0x245e, 0xffffffff, 0x00040003,
 683        0x245f, 0xffffffff, 0x00000007,
 684        0x2460, 0xffffffff, 0x00060005,
 685        0x2461, 0xffffffff, 0x00090008,
 686        0x2462, 0xffffffff, 0x00030002,
 687        0x2463, 0xffffffff, 0x00050004,
 688        0x2464, 0xffffffff, 0x00000008,
 689        0x2465, 0xffffffff, 0x00070006,
 690        0x2466, 0xffffffff, 0x000a0009,
 691        0x2467, 0xffffffff, 0x00040003,
 692        0x2468, 0xffffffff, 0x00060005,
 693        0x2469, 0xffffffff, 0x00000009,
 694        0x246a, 0xffffffff, 0x00080007,
 695        0x246b, 0xffffffff, 0x000b000a,
 696        0x246c, 0xffffffff, 0x00050004,
 697        0x246d, 0xffffffff, 0x00070006,
 698        0x246e, 0xffffffff, 0x0008000b,
 699        0x246f, 0xffffffff, 0x000a0009,
 700        0x2470, 0xffffffff, 0x000d000c,
 701        0x2480, 0xffffffff, 0x00090008,
 702        0x2481, 0xffffffff, 0x000b000a,
 703        0x2482, 0xffffffff, 0x000c000f,
 704        0x2483, 0xffffffff, 0x000e000d,
 705        0x2484, 0xffffffff, 0x00110010,
 706        0x2485, 0xffffffff, 0x000a0009,
 707        0x2486, 0xffffffff, 0x000c000b,
 708        0x2487, 0xffffffff, 0x0000000f,
 709        0x2488, 0xffffffff, 0x000e000d,
 710        0x2489, 0xffffffff, 0x00110010,
 711        0x248a, 0xffffffff, 0x000b000a,
 712        0x248b, 0xffffffff, 0x000d000c,
 713        0x248c, 0xffffffff, 0x00000010,
 714        0x248d, 0xffffffff, 0x000f000e,
 715        0x248e, 0xffffffff, 0x00120011,
 716        0x248f, 0xffffffff, 0x000c000b,
 717        0x2490, 0xffffffff, 0x000e000d,
 718        0x2491, 0xffffffff, 0x00000011,
 719        0x2492, 0xffffffff, 0x0010000f,
 720        0x2493, 0xffffffff, 0x00130012,
 721        0x2494, 0xffffffff, 0x000d000c,
 722        0x2495, 0xffffffff, 0x000f000e,
 723        0x2496, 0xffffffff, 0x00100013,
 724        0x2497, 0xffffffff, 0x00120011,
 725        0x2498, 0xffffffff, 0x00150014,
 726        mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 727        mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 728        mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 729        mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 730        0x000c, 0xffffffff, 0x0000001c,
 731        0x000d, 0x000f0000, 0x000f0000,
 732        0x0583, 0xffffffff, 0x00000100,
 733        mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 734        mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 735        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 736        mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 737        mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 738        mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 739        0x157a, 0x00000001, 0x00000001,
 740        mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 741        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 742        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 743        0x3430, 0xfffffff0, 0x00000100,
 744        0x3630, 0xfffffff0, 0x00000100,
 745};
 746
 747static const u32 oland_mgcg_cgcg_init[] =
 748{
 749        mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 750        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 751        mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 752        mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 753        mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 754        mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 755        mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 756        mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 757        mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 758        mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 759        mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 760        mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 761        mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 762        mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 763        mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 764        mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 765        mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 766        mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 767        mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 768        mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 769        mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 770        mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 771        mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 772        mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 773        mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 774        mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 775        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 776        0x2458, 0xffffffff, 0x00010000,
 777        0x2459, 0xffffffff, 0x00030002,
 778        0x245a, 0xffffffff, 0x00040007,
 779        0x245b, 0xffffffff, 0x00060005,
 780        0x245c, 0xffffffff, 0x00090008,
 781        0x245d, 0xffffffff, 0x00020001,
 782        0x245e, 0xffffffff, 0x00040003,
 783        0x245f, 0xffffffff, 0x00000007,
 784        0x2460, 0xffffffff, 0x00060005,
 785        0x2461, 0xffffffff, 0x00090008,
 786        0x2462, 0xffffffff, 0x00030002,
 787        0x2463, 0xffffffff, 0x00050004,
 788        0x2464, 0xffffffff, 0x00000008,
 789        0x2465, 0xffffffff, 0x00070006,
 790        0x2466, 0xffffffff, 0x000a0009,
 791        0x2467, 0xffffffff, 0x00040003,
 792        0x2468, 0xffffffff, 0x00060005,
 793        0x2469, 0xffffffff, 0x00000009,
 794        0x246a, 0xffffffff, 0x00080007,
 795        0x246b, 0xffffffff, 0x000b000a,
 796        0x246c, 0xffffffff, 0x00050004,
 797        0x246d, 0xffffffff, 0x00070006,
 798        0x246e, 0xffffffff, 0x0008000b,
 799        0x246f, 0xffffffff, 0x000a0009,
 800        0x2470, 0xffffffff, 0x000d000c,
 801        0x2471, 0xffffffff, 0x00060005,
 802        0x2472, 0xffffffff, 0x00080007,
 803        0x2473, 0xffffffff, 0x0000000b,
 804        0x2474, 0xffffffff, 0x000a0009,
 805        0x2475, 0xffffffff, 0x000d000c,
 806        mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 807        mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 808        mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 809        mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 810        0x000c, 0xffffffff, 0x0000001c,
 811        0x000d, 0x000f0000, 0x000f0000,
 812        0x0583, 0xffffffff, 0x00000100,
 813        mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 814        mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 815        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 816        mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 817        mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 818        mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 819        0x157a, 0x00000001, 0x00000001,
 820        mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 821        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 822        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 823        0x3430, 0xfffffff0, 0x00000100,
 824        0x3630, 0xfffffff0, 0x00000100,
 825};
 826
 827static const u32 hainan_mgcg_cgcg_init[] =
 828{
 829        mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 830        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 831        mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 832        mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 833        mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 834        mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 835        mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 836        mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 837        mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 838        mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 839        mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 840        mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 841        mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 842        mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 843        mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 844        mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 845        mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 846        mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 847        mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 848        mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 849        mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 850        mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 851        mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 852        mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 853        mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 854        mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 855        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 856        0x2458, 0xffffffff, 0x00010000,
 857        0x2459, 0xffffffff, 0x00030002,
 858        0x245a, 0xffffffff, 0x00040007,
 859        0x245b, 0xffffffff, 0x00060005,
 860        0x245c, 0xffffffff, 0x00090008,
 861        0x245d, 0xffffffff, 0x00020001,
 862        0x245e, 0xffffffff, 0x00040003,
 863        0x245f, 0xffffffff, 0x00000007,
 864        0x2460, 0xffffffff, 0x00060005,
 865        0x2461, 0xffffffff, 0x00090008,
 866        0x2462, 0xffffffff, 0x00030002,
 867        0x2463, 0xffffffff, 0x00050004,
 868        0x2464, 0xffffffff, 0x00000008,
 869        0x2465, 0xffffffff, 0x00070006,
 870        0x2466, 0xffffffff, 0x000a0009,
 871        0x2467, 0xffffffff, 0x00040003,
 872        0x2468, 0xffffffff, 0x00060005,
 873        0x2469, 0xffffffff, 0x00000009,
 874        0x246a, 0xffffffff, 0x00080007,
 875        0x246b, 0xffffffff, 0x000b000a,
 876        0x246c, 0xffffffff, 0x00050004,
 877        0x246d, 0xffffffff, 0x00070006,
 878        0x246e, 0xffffffff, 0x0008000b,
 879        0x246f, 0xffffffff, 0x000a0009,
 880        0x2470, 0xffffffff, 0x000d000c,
 881        0x2471, 0xffffffff, 0x00060005,
 882        0x2472, 0xffffffff, 0x00080007,
 883        0x2473, 0xffffffff, 0x0000000b,
 884        0x2474, 0xffffffff, 0x000a0009,
 885        0x2475, 0xffffffff, 0x000d000c,
 886        mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 887        mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 888        mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 889        mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 890        0x000c, 0xffffffff, 0x0000001c,
 891        0x000d, 0x000f0000, 0x000f0000,
 892        0x0583, 0xffffffff, 0x00000100,
 893        0x0409, 0xffffffff, 0x00000100,
 894        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 895        mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 896        mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 897        mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 898        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 899        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 900        0x3430, 0xfffffff0, 0x00000100,
 901        0x3630, 0xfffffff0, 0x00000100,
 902};
 903
 904static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
 905{
 906        unsigned long flags;
 907        u32 r;
 908
 909        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 910        WREG32(AMDGPU_PCIE_INDEX, reg);
 911        (void)RREG32(AMDGPU_PCIE_INDEX);
 912        r = RREG32(AMDGPU_PCIE_DATA);
 913        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 914        return r;
 915}
 916
 917static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 918{
 919        unsigned long flags;
 920
 921        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 922        WREG32(AMDGPU_PCIE_INDEX, reg);
 923        (void)RREG32(AMDGPU_PCIE_INDEX);
 924        WREG32(AMDGPU_PCIE_DATA, v);
 925        (void)RREG32(AMDGPU_PCIE_DATA);
 926        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 927}
 928
 929static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
 930{
 931        unsigned long flags;
 932        u32 r;
 933
 934        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 935        WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
 936        (void)RREG32(PCIE_PORT_INDEX);
 937        r = RREG32(PCIE_PORT_DATA);
 938        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 939        return r;
 940}
 941
 942static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 943{
 944        unsigned long flags;
 945
 946        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 947        WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
 948        (void)RREG32(PCIE_PORT_INDEX);
 949        WREG32(PCIE_PORT_DATA, (v));
 950        (void)RREG32(PCIE_PORT_DATA);
 951        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 952}
 953
 954static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
 955{
 956        unsigned long flags;
 957        u32 r;
 958
 959        spin_lock_irqsave(&adev->smc_idx_lock, flags);
 960        WREG32(SMC_IND_INDEX_0, (reg));
 961        r = RREG32(SMC_IND_DATA_0);
 962        spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
 963        return r;
 964}
 965
 966static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 967{
 968        unsigned long flags;
 969
 970        spin_lock_irqsave(&adev->smc_idx_lock, flags);
 971        WREG32(SMC_IND_INDEX_0, (reg));
 972        WREG32(SMC_IND_DATA_0, (v));
 973        spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
 974}
 975
 976static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
 977        {GRBM_STATUS},
 978        {GB_ADDR_CONFIG},
 979        {MC_ARB_RAMCFG},
 980        {GB_TILE_MODE0},
 981        {GB_TILE_MODE1},
 982        {GB_TILE_MODE2},
 983        {GB_TILE_MODE3},
 984        {GB_TILE_MODE4},
 985        {GB_TILE_MODE5},
 986        {GB_TILE_MODE6},
 987        {GB_TILE_MODE7},
 988        {GB_TILE_MODE8},
 989        {GB_TILE_MODE9},
 990        {GB_TILE_MODE10},
 991        {GB_TILE_MODE11},
 992        {GB_TILE_MODE12},
 993        {GB_TILE_MODE13},
 994        {GB_TILE_MODE14},
 995        {GB_TILE_MODE15},
 996        {GB_TILE_MODE16},
 997        {GB_TILE_MODE17},
 998        {GB_TILE_MODE18},
 999        {GB_TILE_MODE19},
1000        {GB_TILE_MODE20},
1001        {GB_TILE_MODE21},
1002        {GB_TILE_MODE22},
1003        {GB_TILE_MODE23},
1004        {GB_TILE_MODE24},
1005        {GB_TILE_MODE25},
1006        {GB_TILE_MODE26},
1007        {GB_TILE_MODE27},
1008        {GB_TILE_MODE28},
1009        {GB_TILE_MODE29},
1010        {GB_TILE_MODE30},
1011        {GB_TILE_MODE31},
1012        {CC_RB_BACKEND_DISABLE, true},
1013        {GC_USER_RB_BACKEND_DISABLE, true},
1014        {PA_SC_RASTER_CONFIG, true},
1015};
1016
1017static uint32_t si_get_register_value(struct amdgpu_device *adev,
1018                                      bool indexed, u32 se_num,
1019                                      u32 sh_num, u32 reg_offset)
1020{
1021        if (indexed) {
1022                uint32_t val;
1023                unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1024                unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1025
1026                switch (reg_offset) {
1027                case mmCC_RB_BACKEND_DISABLE:
1028                        return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1029                case mmGC_USER_RB_BACKEND_DISABLE:
1030                        return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1031                case mmPA_SC_RASTER_CONFIG:
1032                        return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1033                }
1034
1035                mutex_lock(&adev->grbm_idx_mutex);
1036                if (se_num != 0xffffffff || sh_num != 0xffffffff)
1037                        amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1038
1039                val = RREG32(reg_offset);
1040
1041                if (se_num != 0xffffffff || sh_num != 0xffffffff)
1042                        amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1043                mutex_unlock(&adev->grbm_idx_mutex);
1044                return val;
1045        } else {
1046                unsigned idx;
1047
1048                switch (reg_offset) {
1049                case mmGB_ADDR_CONFIG:
1050                        return adev->gfx.config.gb_addr_config;
1051                case mmMC_ARB_RAMCFG:
1052                        return adev->gfx.config.mc_arb_ramcfg;
1053                case mmGB_TILE_MODE0:
1054                case mmGB_TILE_MODE1:
1055                case mmGB_TILE_MODE2:
1056                case mmGB_TILE_MODE3:
1057                case mmGB_TILE_MODE4:
1058                case mmGB_TILE_MODE5:
1059                case mmGB_TILE_MODE6:
1060                case mmGB_TILE_MODE7:
1061                case mmGB_TILE_MODE8:
1062                case mmGB_TILE_MODE9:
1063                case mmGB_TILE_MODE10:
1064                case mmGB_TILE_MODE11:
1065                case mmGB_TILE_MODE12:
1066                case mmGB_TILE_MODE13:
1067                case mmGB_TILE_MODE14:
1068                case mmGB_TILE_MODE15:
1069                case mmGB_TILE_MODE16:
1070                case mmGB_TILE_MODE17:
1071                case mmGB_TILE_MODE18:
1072                case mmGB_TILE_MODE19:
1073                case mmGB_TILE_MODE20:
1074                case mmGB_TILE_MODE21:
1075                case mmGB_TILE_MODE22:
1076                case mmGB_TILE_MODE23:
1077                case mmGB_TILE_MODE24:
1078                case mmGB_TILE_MODE25:
1079                case mmGB_TILE_MODE26:
1080                case mmGB_TILE_MODE27:
1081                case mmGB_TILE_MODE28:
1082                case mmGB_TILE_MODE29:
1083                case mmGB_TILE_MODE30:
1084                case mmGB_TILE_MODE31:
1085                        idx = (reg_offset - mmGB_TILE_MODE0);
1086                        return adev->gfx.config.tile_mode_array[idx];
1087                default:
1088                        return RREG32(reg_offset);
1089                }
1090        }
1091}
1092static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1093                             u32 sh_num, u32 reg_offset, u32 *value)
1094{
1095        uint32_t i;
1096
1097        *value = 0;
1098        for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1099                bool indexed = si_allowed_read_registers[i].grbm_indexed;
1100
1101                if (reg_offset != si_allowed_read_registers[i].reg_offset)
1102                        continue;
1103
1104                *value = si_get_register_value(adev, indexed, se_num, sh_num,
1105                                               reg_offset);
1106                return 0;
1107        }
1108        return -EINVAL;
1109}
1110
1111static bool si_read_disabled_bios(struct amdgpu_device *adev)
1112{
1113        u32 bus_cntl;
1114        u32 d1vga_control = 0;
1115        u32 d2vga_control = 0;
1116        u32 vga_render_control = 0;
1117        u32 rom_cntl;
1118        bool r;
1119
1120        bus_cntl = RREG32(R600_BUS_CNTL);
1121        if (adev->mode_info.num_crtc) {
1122                d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1123                d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1124                vga_render_control = RREG32(VGA_RENDER_CONTROL);
1125        }
1126        rom_cntl = RREG32(R600_ROM_CNTL);
1127
1128        /* enable the rom */
1129        WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1130        if (adev->mode_info.num_crtc) {
1131                /* Disable VGA mode */
1132                WREG32(AVIVO_D1VGA_CONTROL,
1133                       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1134                                          AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1135                WREG32(AVIVO_D2VGA_CONTROL,
1136                       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1137                                          AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1138                WREG32(VGA_RENDER_CONTROL,
1139                       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1140        }
1141        WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1142
1143        r = amdgpu_read_bios(adev);
1144
1145        /* restore regs */
1146        WREG32(R600_BUS_CNTL, bus_cntl);
1147        if (adev->mode_info.num_crtc) {
1148                WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1149                WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1150                WREG32(VGA_RENDER_CONTROL, vga_render_control);
1151        }
1152        WREG32(R600_ROM_CNTL, rom_cntl);
1153        return r;
1154}
1155
1156#define mmROM_INDEX 0x2A
1157#define mmROM_DATA  0x2B
1158
1159static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1160                                  u8 *bios, u32 length_bytes)
1161{
1162        u32 *dw_ptr;
1163        u32 i, length_dw;
1164
1165        if (bios == NULL)
1166                return false;
1167        if (length_bytes == 0)
1168                return false;
1169        /* APU vbios image is part of sbios image */
1170        if (adev->flags & AMD_IS_APU)
1171                return false;
1172
1173        dw_ptr = (u32 *)bios;
1174        length_dw = ALIGN(length_bytes, 4) / 4;
1175        /* set rom index to 0 */
1176        WREG32(mmROM_INDEX, 0);
1177        for (i = 0; i < length_dw; i++)
1178                dw_ptr[i] = RREG32(mmROM_DATA);
1179
1180        return true;
1181}
1182
1183//xxx: not implemented
1184static int si_asic_reset(struct amdgpu_device *adev)
1185{
1186        return 0;
1187}
1188
1189static enum amd_reset_method
1190si_asic_reset_method(struct amdgpu_device *adev)
1191{
1192        return AMD_RESET_METHOD_LEGACY;
1193}
1194
1195static u32 si_get_config_memsize(struct amdgpu_device *adev)
1196{
1197        return RREG32(mmCONFIG_MEMSIZE);
1198}
1199
1200static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1201{
1202        uint32_t temp;
1203
1204        temp = RREG32(CONFIG_CNTL);
1205        if (state == false) {
1206                temp &= ~(1<<0);
1207                temp |= (1<<1);
1208        } else {
1209                temp &= ~(1<<1);
1210        }
1211        WREG32(CONFIG_CNTL, temp);
1212}
1213
1214static u32 si_get_xclk(struct amdgpu_device *adev)
1215{
1216        u32 reference_clock = adev->clock.spll.reference_freq;
1217        u32 tmp;
1218
1219        tmp = RREG32(CG_CLKPIN_CNTL_2);
1220        if (tmp & MUX_TCLK_TO_XCLK)
1221                return TCLK;
1222
1223        tmp = RREG32(CG_CLKPIN_CNTL);
1224        if (tmp & XTALIN_DIVIDE)
1225                return reference_clock / 4;
1226
1227        return reference_clock;
1228}
1229
1230//xxx:not implemented
1231static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1232{
1233        return 0;
1234}
1235
1236static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1237{
1238        if (is_virtual_machine()) /* passthrough mode */
1239                adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1240}
1241
1242static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1243{
1244        if (!ring || !ring->funcs->emit_wreg) {
1245                WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1246                RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1247        } else {
1248                amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1249        }
1250}
1251
1252static void si_invalidate_hdp(struct amdgpu_device *adev,
1253                              struct amdgpu_ring *ring)
1254{
1255        if (!ring || !ring->funcs->emit_wreg) {
1256                WREG32(mmHDP_DEBUG0, 1);
1257                RREG32(mmHDP_DEBUG0);
1258        } else {
1259                amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1260        }
1261}
1262
1263static bool si_need_full_reset(struct amdgpu_device *adev)
1264{
1265        /* change this when we support soft reset */
1266        return true;
1267}
1268
1269static bool si_need_reset_on_init(struct amdgpu_device *adev)
1270{
1271        return false;
1272}
1273
1274static int si_get_pcie_lanes(struct amdgpu_device *adev)
1275{
1276        u32 link_width_cntl;
1277
1278        if (adev->flags & AMD_IS_APU)
1279                return 0;
1280
1281        link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1282
1283        switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1284        case LC_LINK_WIDTH_X1:
1285                return 1;
1286        case LC_LINK_WIDTH_X2:
1287                return 2;
1288        case LC_LINK_WIDTH_X4:
1289                return 4;
1290        case LC_LINK_WIDTH_X8:
1291                return 8;
1292        case LC_LINK_WIDTH_X0:
1293        case LC_LINK_WIDTH_X16:
1294        default:
1295                return 16;
1296        }
1297}
1298
1299static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1300{
1301        u32 link_width_cntl, mask;
1302
1303        if (adev->flags & AMD_IS_APU)
1304                return;
1305
1306        switch (lanes) {
1307        case 0:
1308                mask = LC_LINK_WIDTH_X0;
1309                break;
1310        case 1:
1311                mask = LC_LINK_WIDTH_X1;
1312                break;
1313        case 2:
1314                mask = LC_LINK_WIDTH_X2;
1315                break;
1316        case 4:
1317                mask = LC_LINK_WIDTH_X4;
1318                break;
1319        case 8:
1320                mask = LC_LINK_WIDTH_X8;
1321                break;
1322        case 16:
1323                mask = LC_LINK_WIDTH_X16;
1324                break;
1325        default:
1326                DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1327                return;
1328        }
1329
1330        link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1331        link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1332        link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1333        link_width_cntl |= (LC_RECONFIG_NOW |
1334                            LC_RECONFIG_ARC_MISSING_ESCAPE);
1335
1336        WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1337}
1338
1339static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1340                              uint64_t *count1)
1341{
1342        uint32_t perfctr = 0;
1343        uint64_t cnt0_of, cnt1_of;
1344        int tmp;
1345
1346        /* This reports 0 on APUs, so return to avoid writing/reading registers
1347         * that may or may not be different from their GPU counterparts
1348         */
1349        if (adev->flags & AMD_IS_APU)
1350                return;
1351
1352        /* Set the 2 events that we wish to watch, defined above */
1353        /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1354        perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1355        perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1356
1357        /* Write to enable desired perf counters */
1358        WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1359        /* Zero out and enable the perf counters
1360         * Write 0x5:
1361         * Bit 0 = Start all counters(1)
1362         * Bit 2 = Global counter reset enable(1)
1363         */
1364        WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1365
1366        msleep(1000);
1367
1368        /* Load the shadow and disable the perf counters
1369         * Write 0x2:
1370         * Bit 0 = Stop counters(0)
1371         * Bit 1 = Load the shadow counters(1)
1372         */
1373        WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1374
1375        /* Read register values to get any >32bit overflow */
1376        tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1377        cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1378        cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1379
1380        /* Get the values and add the overflow */
1381        *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1382        *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1383}
1384
1385static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1386{
1387        uint64_t nak_r, nak_g;
1388
1389        /* Get the number of NAKs received and generated */
1390        nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1391        nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1392
1393        /* Add the total number of NAKs, i.e the number of replays */
1394        return (nak_r + nak_g);
1395}
1396
1397static const struct amdgpu_asic_funcs si_asic_funcs =
1398{
1399        .read_disabled_bios = &si_read_disabled_bios,
1400        .read_bios_from_rom = &si_read_bios_from_rom,
1401        .read_register = &si_read_register,
1402        .reset = &si_asic_reset,
1403        .reset_method = &si_asic_reset_method,
1404        .set_vga_state = &si_vga_set_state,
1405        .get_xclk = &si_get_xclk,
1406        .set_uvd_clocks = &si_set_uvd_clocks,
1407        .set_vce_clocks = NULL,
1408        .get_pcie_lanes = &si_get_pcie_lanes,
1409        .set_pcie_lanes = &si_set_pcie_lanes,
1410        .get_config_memsize = &si_get_config_memsize,
1411        .flush_hdp = &si_flush_hdp,
1412        .invalidate_hdp = &si_invalidate_hdp,
1413        .need_full_reset = &si_need_full_reset,
1414        .get_pcie_usage = &si_get_pcie_usage,
1415        .need_reset_on_init = &si_need_reset_on_init,
1416        .get_pcie_replay_count = &si_get_pcie_replay_count,
1417};
1418
1419static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1420{
1421        return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1422                >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1423}
1424
1425static int si_common_early_init(void *handle)
1426{
1427        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1428
1429        adev->smc_rreg = &si_smc_rreg;
1430        adev->smc_wreg = &si_smc_wreg;
1431        adev->pcie_rreg = &si_pcie_rreg;
1432        adev->pcie_wreg = &si_pcie_wreg;
1433        adev->pciep_rreg = &si_pciep_rreg;
1434        adev->pciep_wreg = &si_pciep_wreg;
1435        adev->uvd_ctx_rreg = NULL;
1436        adev->uvd_ctx_wreg = NULL;
1437        adev->didt_rreg = NULL;
1438        adev->didt_wreg = NULL;
1439
1440        adev->asic_funcs = &si_asic_funcs;
1441
1442        adev->rev_id = si_get_rev_id(adev);
1443        adev->external_rev_id = 0xFF;
1444        switch (adev->asic_type) {
1445        case CHIP_TAHITI:
1446                adev->cg_flags =
1447                        AMD_CG_SUPPORT_GFX_MGCG |
1448                        AMD_CG_SUPPORT_GFX_MGLS |
1449                        /*AMD_CG_SUPPORT_GFX_CGCG |*/
1450                        AMD_CG_SUPPORT_GFX_CGLS |
1451                        AMD_CG_SUPPORT_GFX_CGTS |
1452                        AMD_CG_SUPPORT_GFX_CP_LS |
1453                        AMD_CG_SUPPORT_MC_MGCG |
1454                        AMD_CG_SUPPORT_SDMA_MGCG |
1455                        AMD_CG_SUPPORT_BIF_LS |
1456                        AMD_CG_SUPPORT_VCE_MGCG |
1457                        AMD_CG_SUPPORT_UVD_MGCG |
1458                        AMD_CG_SUPPORT_HDP_LS |
1459                        AMD_CG_SUPPORT_HDP_MGCG;
1460                adev->pg_flags = 0;
1461                adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1462                                        (adev->rev_id == 1) ? 5 : 6;
1463                break;
1464        case CHIP_PITCAIRN:
1465                adev->cg_flags =
1466                        AMD_CG_SUPPORT_GFX_MGCG |
1467                        AMD_CG_SUPPORT_GFX_MGLS |
1468                        /*AMD_CG_SUPPORT_GFX_CGCG |*/
1469                        AMD_CG_SUPPORT_GFX_CGLS |
1470                        AMD_CG_SUPPORT_GFX_CGTS |
1471                        AMD_CG_SUPPORT_GFX_CP_LS |
1472                        AMD_CG_SUPPORT_GFX_RLC_LS |
1473                        AMD_CG_SUPPORT_MC_LS |
1474                        AMD_CG_SUPPORT_MC_MGCG |
1475                        AMD_CG_SUPPORT_SDMA_MGCG |
1476                        AMD_CG_SUPPORT_BIF_LS |
1477                        AMD_CG_SUPPORT_VCE_MGCG |
1478                        AMD_CG_SUPPORT_UVD_MGCG |
1479                        AMD_CG_SUPPORT_HDP_LS |
1480                        AMD_CG_SUPPORT_HDP_MGCG;
1481                adev->pg_flags = 0;
1482                adev->external_rev_id = adev->rev_id + 20;
1483                break;
1484
1485        case CHIP_VERDE:
1486                adev->cg_flags =
1487                        AMD_CG_SUPPORT_GFX_MGCG |
1488                        AMD_CG_SUPPORT_GFX_MGLS |
1489                        AMD_CG_SUPPORT_GFX_CGLS |
1490                        AMD_CG_SUPPORT_GFX_CGTS |
1491                        AMD_CG_SUPPORT_GFX_CGTS_LS |
1492                        AMD_CG_SUPPORT_GFX_CP_LS |
1493                        AMD_CG_SUPPORT_MC_LS |
1494                        AMD_CG_SUPPORT_MC_MGCG |
1495                        AMD_CG_SUPPORT_SDMA_MGCG |
1496                        AMD_CG_SUPPORT_SDMA_LS |
1497                        AMD_CG_SUPPORT_BIF_LS |
1498                        AMD_CG_SUPPORT_VCE_MGCG |
1499                        AMD_CG_SUPPORT_UVD_MGCG |
1500                        AMD_CG_SUPPORT_HDP_LS |
1501                        AMD_CG_SUPPORT_HDP_MGCG;
1502                adev->pg_flags = 0;
1503                //???
1504                adev->external_rev_id = adev->rev_id + 40;
1505                break;
1506        case CHIP_OLAND:
1507                adev->cg_flags =
1508                        AMD_CG_SUPPORT_GFX_MGCG |
1509                        AMD_CG_SUPPORT_GFX_MGLS |
1510                        /*AMD_CG_SUPPORT_GFX_CGCG |*/
1511                        AMD_CG_SUPPORT_GFX_CGLS |
1512                        AMD_CG_SUPPORT_GFX_CGTS |
1513                        AMD_CG_SUPPORT_GFX_CP_LS |
1514                        AMD_CG_SUPPORT_GFX_RLC_LS |
1515                        AMD_CG_SUPPORT_MC_LS |
1516                        AMD_CG_SUPPORT_MC_MGCG |
1517                        AMD_CG_SUPPORT_SDMA_MGCG |
1518                        AMD_CG_SUPPORT_BIF_LS |
1519                        AMD_CG_SUPPORT_UVD_MGCG |
1520                        AMD_CG_SUPPORT_HDP_LS |
1521                        AMD_CG_SUPPORT_HDP_MGCG;
1522                adev->pg_flags = 0;
1523                adev->external_rev_id = 60;
1524                break;
1525        case CHIP_HAINAN:
1526                adev->cg_flags =
1527                        AMD_CG_SUPPORT_GFX_MGCG |
1528                        AMD_CG_SUPPORT_GFX_MGLS |
1529                        /*AMD_CG_SUPPORT_GFX_CGCG |*/
1530                        AMD_CG_SUPPORT_GFX_CGLS |
1531                        AMD_CG_SUPPORT_GFX_CGTS |
1532                        AMD_CG_SUPPORT_GFX_CP_LS |
1533                        AMD_CG_SUPPORT_GFX_RLC_LS |
1534                        AMD_CG_SUPPORT_MC_LS |
1535                        AMD_CG_SUPPORT_MC_MGCG |
1536                        AMD_CG_SUPPORT_SDMA_MGCG |
1537                        AMD_CG_SUPPORT_BIF_LS |
1538                        AMD_CG_SUPPORT_HDP_LS |
1539                        AMD_CG_SUPPORT_HDP_MGCG;
1540                adev->pg_flags = 0;
1541                adev->external_rev_id = 70;
1542                break;
1543
1544        default:
1545                return -EINVAL;
1546        }
1547
1548        return 0;
1549}
1550
1551static int si_common_sw_init(void *handle)
1552{
1553        return 0;
1554}
1555
1556static int si_common_sw_fini(void *handle)
1557{
1558        return 0;
1559}
1560
1561
1562static void si_init_golden_registers(struct amdgpu_device *adev)
1563{
1564        switch (adev->asic_type) {
1565        case CHIP_TAHITI:
1566                amdgpu_device_program_register_sequence(adev,
1567                                                        tahiti_golden_registers,
1568                                                        ARRAY_SIZE(tahiti_golden_registers));
1569                amdgpu_device_program_register_sequence(adev,
1570                                                        tahiti_golden_rlc_registers,
1571                                                        ARRAY_SIZE(tahiti_golden_rlc_registers));
1572                amdgpu_device_program_register_sequence(adev,
1573                                                        tahiti_mgcg_cgcg_init,
1574                                                        ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1575                amdgpu_device_program_register_sequence(adev,
1576                                                        tahiti_golden_registers2,
1577                                                        ARRAY_SIZE(tahiti_golden_registers2));
1578                break;
1579        case CHIP_PITCAIRN:
1580                amdgpu_device_program_register_sequence(adev,
1581                                                        pitcairn_golden_registers,
1582                                                        ARRAY_SIZE(pitcairn_golden_registers));
1583                amdgpu_device_program_register_sequence(adev,
1584                                                        pitcairn_golden_rlc_registers,
1585                                                        ARRAY_SIZE(pitcairn_golden_rlc_registers));
1586                amdgpu_device_program_register_sequence(adev,
1587                                                        pitcairn_mgcg_cgcg_init,
1588                                                        ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1589                break;
1590        case CHIP_VERDE:
1591                amdgpu_device_program_register_sequence(adev,
1592                                                        verde_golden_registers,
1593                                                        ARRAY_SIZE(verde_golden_registers));
1594                amdgpu_device_program_register_sequence(adev,
1595                                                        verde_golden_rlc_registers,
1596                                                        ARRAY_SIZE(verde_golden_rlc_registers));
1597                amdgpu_device_program_register_sequence(adev,
1598                                                        verde_mgcg_cgcg_init,
1599                                                        ARRAY_SIZE(verde_mgcg_cgcg_init));
1600                amdgpu_device_program_register_sequence(adev,
1601                                                        verde_pg_init,
1602                                                        ARRAY_SIZE(verde_pg_init));
1603                break;
1604        case CHIP_OLAND:
1605                amdgpu_device_program_register_sequence(adev,
1606                                                        oland_golden_registers,
1607                                                        ARRAY_SIZE(oland_golden_registers));
1608                amdgpu_device_program_register_sequence(adev,
1609                                                        oland_golden_rlc_registers,
1610                                                        ARRAY_SIZE(oland_golden_rlc_registers));
1611                amdgpu_device_program_register_sequence(adev,
1612                                                        oland_mgcg_cgcg_init,
1613                                                        ARRAY_SIZE(oland_mgcg_cgcg_init));
1614                break;
1615        case CHIP_HAINAN:
1616                amdgpu_device_program_register_sequence(adev,
1617                                                        hainan_golden_registers,
1618                                                        ARRAY_SIZE(hainan_golden_registers));
1619                amdgpu_device_program_register_sequence(adev,
1620                                                        hainan_golden_registers2,
1621                                                        ARRAY_SIZE(hainan_golden_registers2));
1622                amdgpu_device_program_register_sequence(adev,
1623                                                        hainan_mgcg_cgcg_init,
1624                                                        ARRAY_SIZE(hainan_mgcg_cgcg_init));
1625                break;
1626
1627
1628        default:
1629                BUG();
1630        }
1631}
1632
1633static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1634{
1635        struct pci_dev *root = adev->pdev->bus->self;
1636        int bridge_pos, gpu_pos;
1637        u32 speed_cntl, current_data_rate;
1638        int i;
1639        u16 tmp16;
1640
1641        if (pci_is_root_bus(adev->pdev->bus))
1642                return;
1643
1644        if (amdgpu_pcie_gen2 == 0)
1645                return;
1646
1647        if (adev->flags & AMD_IS_APU)
1648                return;
1649
1650        if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1651                                        CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1652                return;
1653
1654        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1655        current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1656                LC_CURRENT_DATA_RATE_SHIFT;
1657        if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1658                if (current_data_rate == 2) {
1659                        DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1660                        return;
1661                }
1662                DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1663        } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1664                if (current_data_rate == 1) {
1665                        DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1666                        return;
1667                }
1668                DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1669        }
1670
1671        bridge_pos = pci_pcie_cap(root);
1672        if (!bridge_pos)
1673                return;
1674
1675        gpu_pos = pci_pcie_cap(adev->pdev);
1676        if (!gpu_pos)
1677                return;
1678
1679        if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1680                if (current_data_rate != 2) {
1681                        u16 bridge_cfg, gpu_cfg;
1682                        u16 bridge_cfg2, gpu_cfg2;
1683                        u32 max_lw, current_lw, tmp;
1684
1685                        pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1686                        pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1687
1688                        tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1689                        pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1690
1691                        tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1692                        pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1693
1694                        tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1695                        max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1696                        current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1697
1698                        if (current_lw < max_lw) {
1699                                tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1700                                if (tmp & LC_RENEGOTIATION_SUPPORT) {
1701                                        tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1702                                        tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1703                                        tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1704                                        WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1705                                }
1706                        }
1707
1708                        for (i = 0; i < 10; i++) {
1709                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1710                                if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1711                                        break;
1712
1713                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1714                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1715
1716                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1717                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1718
1719                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1720                                tmp |= LC_SET_QUIESCE;
1721                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1722
1723                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1724                                tmp |= LC_REDO_EQ;
1725                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1726
1727                                mdelay(100);
1728
1729                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1730                                tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1731                                tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1732                                pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1733
1734                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1735                                tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1736                                tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1737                                pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1738
1739                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1740                                tmp16 &= ~((1 << 4) | (7 << 9));
1741                                tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1742                                pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1743
1744                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1745                                tmp16 &= ~((1 << 4) | (7 << 9));
1746                                tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1747                                pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1748
1749                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1750                                tmp &= ~LC_SET_QUIESCE;
1751                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1752                        }
1753                }
1754        }
1755
1756        speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1757        speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1758        WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1759
1760        pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1761        tmp16 &= ~0xf;
1762        if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1763                tmp16 |= 3;
1764        else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1765                tmp16 |= 2;
1766        else
1767                tmp16 |= 1;
1768        pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1769
1770        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1771        speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1772        WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1773
1774        for (i = 0; i < adev->usec_timeout; i++) {
1775                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1776                if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1777                        break;
1778                udelay(1);
1779        }
1780}
1781
1782static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1783{
1784        unsigned long flags;
1785        u32 r;
1786
1787        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1788        WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1789        r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1790        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1791        return r;
1792}
1793
1794static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1795{
1796        unsigned long flags;
1797
1798        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1799        WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1800        WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1801        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1802}
1803
1804static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1805{
1806        unsigned long flags;
1807        u32 r;
1808
1809        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1810        WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1811        r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1812        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1813        return r;
1814}
1815
1816static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1817{
1818        unsigned long flags;
1819
1820        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1821        WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1822        WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1823        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1824}
1825static void si_program_aspm(struct amdgpu_device *adev)
1826{
1827        u32 data, orig;
1828        bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1829        bool disable_clkreq = false;
1830
1831        if (amdgpu_aspm == 0)
1832                return;
1833
1834        if (adev->flags & AMD_IS_APU)
1835                return;
1836        orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1837        data &= ~LC_XMIT_N_FTS_MASK;
1838        data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1839        if (orig != data)
1840                WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1841
1842        orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1843        data |= LC_GO_TO_RECOVERY;
1844        if (orig != data)
1845                WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1846
1847        orig = data = RREG32_PCIE(PCIE_P_CNTL);
1848        data |= P_IGNORE_EDB_ERR;
1849        if (orig != data)
1850                WREG32_PCIE(PCIE_P_CNTL, data);
1851
1852        orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1853        data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1854        data |= LC_PMI_TO_L1_DIS;
1855        if (!disable_l0s)
1856                data |= LC_L0S_INACTIVITY(7);
1857
1858        if (!disable_l1) {
1859                data |= LC_L1_INACTIVITY(7);
1860                data &= ~LC_PMI_TO_L1_DIS;
1861                if (orig != data)
1862                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1863
1864                if (!disable_plloff_in_l1) {
1865                        bool clk_req_support;
1866
1867                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1868                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1869                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1870                        if (orig != data)
1871                                si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1872
1873                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1874                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1875                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1876                        if (orig != data)
1877                                si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1878
1879                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1880                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1881                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1882                        if (orig != data)
1883                                si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1884
1885                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1886                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1887                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1888                        if (orig != data)
1889                                si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1890
1891                        if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
1892                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1893                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
1894                                if (orig != data)
1895                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1896
1897                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1898                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
1899                                if (orig != data)
1900                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1901
1902                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1903                                data &= ~PLL_RAMP_UP_TIME_2_MASK;
1904                                if (orig != data)
1905                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1906
1907                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1908                                data &= ~PLL_RAMP_UP_TIME_3_MASK;
1909                                if (orig != data)
1910                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1911
1912                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1913                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
1914                                if (orig != data)
1915                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1916
1917                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1918                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
1919                                if (orig != data)
1920                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1921
1922                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1923                                data &= ~PLL_RAMP_UP_TIME_2_MASK;
1924                                if (orig != data)
1925                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1926
1927                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1928                                data &= ~PLL_RAMP_UP_TIME_3_MASK;
1929                                if (orig != data)
1930                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1931                        }
1932                        orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1933                        data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1934                        data |= LC_DYN_LANES_PWR_STATE(3);
1935                        if (orig != data)
1936                                WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1937
1938                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1939                        data &= ~LS2_EXIT_TIME_MASK;
1940                        if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
1941                                data |= LS2_EXIT_TIME(5);
1942                        if (orig != data)
1943                                si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1944
1945                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1946                        data &= ~LS2_EXIT_TIME_MASK;
1947                        if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
1948                                data |= LS2_EXIT_TIME(5);
1949                        if (orig != data)
1950                                si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1951
1952                        if (!disable_clkreq &&
1953                            !pci_is_root_bus(adev->pdev->bus)) {
1954                                struct pci_dev *root = adev->pdev->bus->self;
1955                                u32 lnkcap;
1956
1957                                clk_req_support = false;
1958                                pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1959                                if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1960                                        clk_req_support = true;
1961                        } else {
1962                                clk_req_support = false;
1963                        }
1964
1965                        if (clk_req_support) {
1966                                orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1967                                data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1968                                if (orig != data)
1969                                        WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1970
1971                                orig = data = RREG32(THM_CLK_CNTL);
1972                                data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1973                                data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1974                                if (orig != data)
1975                                        WREG32(THM_CLK_CNTL, data);
1976
1977                                orig = data = RREG32(MISC_CLK_CNTL);
1978                                data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1979                                data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1980                                if (orig != data)
1981                                        WREG32(MISC_CLK_CNTL, data);
1982
1983                                orig = data = RREG32(CG_CLKPIN_CNTL);
1984                                data &= ~BCLK_AS_XCLK;
1985                                if (orig != data)
1986                                        WREG32(CG_CLKPIN_CNTL, data);
1987
1988                                orig = data = RREG32(CG_CLKPIN_CNTL_2);
1989                                data &= ~FORCE_BIF_REFCLK_EN;
1990                                if (orig != data)
1991                                        WREG32(CG_CLKPIN_CNTL_2, data);
1992
1993                                orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1994                                data &= ~MPLL_CLKOUT_SEL_MASK;
1995                                data |= MPLL_CLKOUT_SEL(4);
1996                                if (orig != data)
1997                                        WREG32(MPLL_BYPASSCLK_SEL, data);
1998
1999                                orig = data = RREG32(SPLL_CNTL_MODE);
2000                                data &= ~SPLL_REFCLK_SEL_MASK;
2001                                if (orig != data)
2002                                        WREG32(SPLL_CNTL_MODE, data);
2003                        }
2004                }
2005        } else {
2006                if (orig != data)
2007                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2008        }
2009
2010        orig = data = RREG32_PCIE(PCIE_CNTL2);
2011        data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2012        if (orig != data)
2013                WREG32_PCIE(PCIE_CNTL2, data);
2014
2015        if (!disable_l0s) {
2016                data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2017                if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2018                        data = RREG32_PCIE(PCIE_LC_STATUS1);
2019                        if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2020                                orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2021                                data &= ~LC_L0S_INACTIVITY_MASK;
2022                                if (orig != data)
2023                                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2024                        }
2025                }
2026        }
2027}
2028
2029static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2030{
2031        int readrq;
2032        u16 v;
2033
2034        readrq = pcie_get_readrq(adev->pdev);
2035        v = ffs(readrq) - 8;
2036        if ((v == 0) || (v == 6) || (v == 7))
2037                pcie_set_readrq(adev->pdev, 512);
2038}
2039
2040static int si_common_hw_init(void *handle)
2041{
2042        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2043
2044        si_fix_pci_max_read_req_size(adev);
2045        si_init_golden_registers(adev);
2046        si_pcie_gen3_enable(adev);
2047        si_program_aspm(adev);
2048
2049        return 0;
2050}
2051
2052static int si_common_hw_fini(void *handle)
2053{
2054        return 0;
2055}
2056
2057static int si_common_suspend(void *handle)
2058{
2059        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2060
2061        return si_common_hw_fini(adev);
2062}
2063
2064static int si_common_resume(void *handle)
2065{
2066        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2067
2068        return si_common_hw_init(adev);
2069}
2070
2071static bool si_common_is_idle(void *handle)
2072{
2073        return true;
2074}
2075
2076static int si_common_wait_for_idle(void *handle)
2077{
2078        return 0;
2079}
2080
2081static int si_common_soft_reset(void *handle)
2082{
2083        return 0;
2084}
2085
2086static int si_common_set_clockgating_state(void *handle,
2087                                            enum amd_clockgating_state state)
2088{
2089        return 0;
2090}
2091
2092static int si_common_set_powergating_state(void *handle,
2093                                            enum amd_powergating_state state)
2094{
2095        return 0;
2096}
2097
2098static const struct amd_ip_funcs si_common_ip_funcs = {
2099        .name = "si_common",
2100        .early_init = si_common_early_init,
2101        .late_init = NULL,
2102        .sw_init = si_common_sw_init,
2103        .sw_fini = si_common_sw_fini,
2104        .hw_init = si_common_hw_init,
2105        .hw_fini = si_common_hw_fini,
2106        .suspend = si_common_suspend,
2107        .resume = si_common_resume,
2108        .is_idle = si_common_is_idle,
2109        .wait_for_idle = si_common_wait_for_idle,
2110        .soft_reset = si_common_soft_reset,
2111        .set_clockgating_state = si_common_set_clockgating_state,
2112        .set_powergating_state = si_common_set_powergating_state,
2113};
2114
2115static const struct amdgpu_ip_block_version si_common_ip_block =
2116{
2117        .type = AMD_IP_BLOCK_TYPE_COMMON,
2118        .major = 1,
2119        .minor = 0,
2120        .rev = 0,
2121        .funcs = &si_common_ip_funcs,
2122};
2123
2124int si_set_ip_blocks(struct amdgpu_device *adev)
2125{
2126        si_detect_hw_virtualization(adev);
2127
2128        switch (adev->asic_type) {
2129        case CHIP_VERDE:
2130        case CHIP_TAHITI:
2131        case CHIP_PITCAIRN:
2132                amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2133                amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2134                amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2135                amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2136                amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2137                amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2138                if (adev->enable_virtual_display)
2139                        amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2140                else
2141                        amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2142                /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2143                /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2144                break;
2145        case CHIP_OLAND:
2146                amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2147                amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2148                amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2149                amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2150                amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2151                amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2152                if (adev->enable_virtual_display)
2153                        amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2154                else
2155                        amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2156
2157                /* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2158                /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2159                break;
2160        case CHIP_HAINAN:
2161                amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2162                amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2163                amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2164                amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2165                amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2166                amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2167                if (adev->enable_virtual_display)
2168                        amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2169                break;
2170        default:
2171                BUG();
2172        }
2173        return 0;
2174}
2175
2176