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