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 "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, false},
 975        {GB_ADDR_CONFIG, false},
 976        {MC_ARB_RAMCFG, false},
 977        {GB_TILE_MODE0, false},
 978        {GB_TILE_MODE1, false},
 979        {GB_TILE_MODE2, false},
 980        {GB_TILE_MODE3, false},
 981        {GB_TILE_MODE4, false},
 982        {GB_TILE_MODE5, false},
 983        {GB_TILE_MODE6, false},
 984        {GB_TILE_MODE7, false},
 985        {GB_TILE_MODE8, false},
 986        {GB_TILE_MODE9, false},
 987        {GB_TILE_MODE10, false},
 988        {GB_TILE_MODE11, false},
 989        {GB_TILE_MODE12, false},
 990        {GB_TILE_MODE13, false},
 991        {GB_TILE_MODE14, false},
 992        {GB_TILE_MODE15, false},
 993        {GB_TILE_MODE16, false},
 994        {GB_TILE_MODE17, false},
 995        {GB_TILE_MODE18, false},
 996        {GB_TILE_MODE19, false},
 997        {GB_TILE_MODE20, false},
 998        {GB_TILE_MODE21, false},
 999        {GB_TILE_MODE22, false},
1000        {GB_TILE_MODE23, false},
1001        {GB_TILE_MODE24, false},
1002        {GB_TILE_MODE25, false},
1003        {GB_TILE_MODE26, false},
1004        {GB_TILE_MODE27, false},
1005        {GB_TILE_MODE28, false},
1006        {GB_TILE_MODE29, false},
1007        {GB_TILE_MODE30, false},
1008        {GB_TILE_MODE31, false},
1009        {CC_RB_BACKEND_DISABLE, false, true},
1010        {GC_USER_RB_BACKEND_DISABLE, false, true},
1011        {PA_SC_RASTER_CONFIG, false, 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                if (reg_offset != si_allowed_read_registers[i].reg_offset)
1097                        continue;
1098
1099                if (!si_allowed_read_registers[i].untouched)
1100                        *value = si_get_register_value(adev,
1101                                                si_allowed_read_registers[i].grbm_indexed,
1102                                                se_num, sh_num, 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        case CHIP_VERDE:
1389                amdgpu_program_register_sequence(adev,
1390                                                 verde_golden_registers,
1391                                                 (const u32)ARRAY_SIZE(verde_golden_registers));
1392                amdgpu_program_register_sequence(adev,
1393                                                 verde_golden_rlc_registers,
1394                                                 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
1395                amdgpu_program_register_sequence(adev,
1396                                                 verde_mgcg_cgcg_init,
1397                                                 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
1398                amdgpu_program_register_sequence(adev,
1399                                                 verde_pg_init,
1400                                                 (const u32)ARRAY_SIZE(verde_pg_init));
1401                break;
1402        case CHIP_OLAND:
1403                amdgpu_program_register_sequence(adev,
1404                                                 oland_golden_registers,
1405                                                 (const u32)ARRAY_SIZE(oland_golden_registers));
1406                amdgpu_program_register_sequence(adev,
1407                                                 oland_golden_rlc_registers,
1408                                                 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
1409                amdgpu_program_register_sequence(adev,
1410                                                 oland_mgcg_cgcg_init,
1411                                                 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
1412        case CHIP_HAINAN:
1413                amdgpu_program_register_sequence(adev,
1414                                                 hainan_golden_registers,
1415                                                 (const u32)ARRAY_SIZE(hainan_golden_registers));
1416                amdgpu_program_register_sequence(adev,
1417                                                 hainan_golden_registers2,
1418                                                 (const u32)ARRAY_SIZE(hainan_golden_registers2));
1419                amdgpu_program_register_sequence(adev,
1420                                                 hainan_mgcg_cgcg_init,
1421                                                 (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
1422                break;
1423
1424
1425        default:
1426                BUG();
1427        }
1428}
1429
1430static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1431{
1432        struct pci_dev *root = adev->pdev->bus->self;
1433        int bridge_pos, gpu_pos;
1434        u32 speed_cntl, mask, current_data_rate;
1435        int ret, i;
1436        u16 tmp16;
1437
1438        if (pci_is_root_bus(adev->pdev->bus))
1439                return;
1440
1441        if (amdgpu_pcie_gen2 == 0)
1442                return;
1443
1444        if (adev->flags & AMD_IS_APU)
1445                return;
1446
1447        ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
1448        if (ret != 0)
1449                return;
1450
1451        if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
1452                return;
1453
1454        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1455        current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1456                LC_CURRENT_DATA_RATE_SHIFT;
1457        if (mask & DRM_PCIE_SPEED_80) {
1458                if (current_data_rate == 2) {
1459                        DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1460                        return;
1461                }
1462                DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1463        } else if (mask & DRM_PCIE_SPEED_50) {
1464                if (current_data_rate == 1) {
1465                        DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1466                        return;
1467                }
1468                DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1469        }
1470
1471        bridge_pos = pci_pcie_cap(root);
1472        if (!bridge_pos)
1473                return;
1474
1475        gpu_pos = pci_pcie_cap(adev->pdev);
1476        if (!gpu_pos)
1477                return;
1478
1479        if (mask & DRM_PCIE_SPEED_80) {
1480                if (current_data_rate != 2) {
1481                        u16 bridge_cfg, gpu_cfg;
1482                        u16 bridge_cfg2, gpu_cfg2;
1483                        u32 max_lw, current_lw, tmp;
1484
1485                        pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1486                        pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1487
1488                        tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1489                        pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1490
1491                        tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1492                        pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1493
1494                        tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1495                        max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1496                        current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1497
1498                        if (current_lw < max_lw) {
1499                                tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1500                                if (tmp & LC_RENEGOTIATION_SUPPORT) {
1501                                        tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1502                                        tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1503                                        tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1504                                        WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1505                                }
1506                        }
1507
1508                        for (i = 0; i < 10; i++) {
1509                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1510                                if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1511                                        break;
1512
1513                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1514                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1515
1516                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1517                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1518
1519                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1520                                tmp |= LC_SET_QUIESCE;
1521                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1522
1523                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1524                                tmp |= LC_REDO_EQ;
1525                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1526
1527                                mdelay(100);
1528
1529                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1530                                tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1531                                tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1532                                pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1533
1534                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1535                                tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1536                                tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1537                                pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1538
1539                                pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1540                                tmp16 &= ~((1 << 4) | (7 << 9));
1541                                tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1542                                pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1543
1544                                pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1545                                tmp16 &= ~((1 << 4) | (7 << 9));
1546                                tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1547                                pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1548
1549                                tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1550                                tmp &= ~LC_SET_QUIESCE;
1551                                WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1552                        }
1553                }
1554        }
1555
1556        speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1557        speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1558        WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1559
1560        pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1561        tmp16 &= ~0xf;
1562        if (mask & DRM_PCIE_SPEED_80)
1563                tmp16 |= 3;
1564        else if (mask & DRM_PCIE_SPEED_50)
1565                tmp16 |= 2;
1566        else
1567                tmp16 |= 1;
1568        pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1569
1570        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1571        speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1572        WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1573
1574        for (i = 0; i < adev->usec_timeout; i++) {
1575                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1576                if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1577                        break;
1578                udelay(1);
1579        }
1580}
1581
1582static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1583{
1584        unsigned long flags;
1585        u32 r;
1586
1587        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1588        WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1589        r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1590        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1591        return r;
1592}
1593
1594static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1595{
1596        unsigned long flags;
1597
1598        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1599        WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1600        WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1601        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1602}
1603
1604static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1605{
1606        unsigned long flags;
1607        u32 r;
1608
1609        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1610        WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1611        r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1612        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1613        return r;
1614}
1615
1616static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1617{
1618        unsigned long flags;
1619
1620        spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1621        WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1622        WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1623        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1624}
1625static void si_program_aspm(struct amdgpu_device *adev)
1626{
1627        u32 data, orig;
1628        bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1629        bool disable_clkreq = false;
1630
1631        if (amdgpu_aspm == 0)
1632                return;
1633
1634        if (adev->flags & AMD_IS_APU)
1635                return;
1636        orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1637        data &= ~LC_XMIT_N_FTS_MASK;
1638        data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1639        if (orig != data)
1640                WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1641
1642        orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1643        data |= LC_GO_TO_RECOVERY;
1644        if (orig != data)
1645                WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1646
1647        orig = data = RREG32_PCIE(PCIE_P_CNTL);
1648        data |= P_IGNORE_EDB_ERR;
1649        if (orig != data)
1650                WREG32_PCIE(PCIE_P_CNTL, data);
1651
1652        orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1653        data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1654        data |= LC_PMI_TO_L1_DIS;
1655        if (!disable_l0s)
1656                data |= LC_L0S_INACTIVITY(7);
1657
1658        if (!disable_l1) {
1659                data |= LC_L1_INACTIVITY(7);
1660                data &= ~LC_PMI_TO_L1_DIS;
1661                if (orig != data)
1662                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1663
1664                if (!disable_plloff_in_l1) {
1665                        bool clk_req_support;
1666
1667                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1668                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1669                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1670                        if (orig != data)
1671                                si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1672
1673                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1674                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1675                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1676                        if (orig != data)
1677                                si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1678
1679                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1680                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1681                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1682                        if (orig != data)
1683                                si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1684
1685                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1686                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1687                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1688                        if (orig != data)
1689                                si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1690
1691                        if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1692                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1693                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
1694                                if (orig != data)
1695                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1696
1697                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1698                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
1699                                if (orig != data)
1700                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1701
1702                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1703                                data &= ~PLL_RAMP_UP_TIME_2_MASK;
1704                                if (orig != data)
1705                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1706
1707                                orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1708                                data &= ~PLL_RAMP_UP_TIME_3_MASK;
1709                                if (orig != data)
1710                                        si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1711
1712                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1713                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
1714                                if (orig != data)
1715                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1716
1717                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1718                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
1719                                if (orig != data)
1720                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1721
1722                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1723                                data &= ~PLL_RAMP_UP_TIME_2_MASK;
1724                                if (orig != data)
1725                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1726
1727                                orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1728                                data &= ~PLL_RAMP_UP_TIME_3_MASK;
1729                                if (orig != data)
1730                                        si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1731                        }
1732                        orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1733                        data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1734                        data |= LC_DYN_LANES_PWR_STATE(3);
1735                        if (orig != data)
1736                                WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1737
1738                        orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1739                        data &= ~LS2_EXIT_TIME_MASK;
1740                        if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1741                                data |= LS2_EXIT_TIME(5);
1742                        if (orig != data)
1743                                si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1744
1745                        orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1746                        data &= ~LS2_EXIT_TIME_MASK;
1747                        if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1748                                data |= LS2_EXIT_TIME(5);
1749                        if (orig != data)
1750                                si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1751
1752                        if (!disable_clkreq &&
1753                            !pci_is_root_bus(adev->pdev->bus)) {
1754                                struct pci_dev *root = adev->pdev->bus->self;
1755                                u32 lnkcap;
1756
1757                                clk_req_support = false;
1758                                pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1759                                if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1760                                        clk_req_support = true;
1761                        } else {
1762                                clk_req_support = false;
1763                        }
1764
1765                        if (clk_req_support) {
1766                                orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1767                                data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1768                                if (orig != data)
1769                                        WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1770
1771                                orig = data = RREG32(THM_CLK_CNTL);
1772                                data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1773                                data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1774                                if (orig != data)
1775                                        WREG32(THM_CLK_CNTL, data);
1776
1777                                orig = data = RREG32(MISC_CLK_CNTL);
1778                                data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1779                                data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1780                                if (orig != data)
1781                                        WREG32(MISC_CLK_CNTL, data);
1782
1783                                orig = data = RREG32(CG_CLKPIN_CNTL);
1784                                data &= ~BCLK_AS_XCLK;
1785                                if (orig != data)
1786                                        WREG32(CG_CLKPIN_CNTL, data);
1787
1788                                orig = data = RREG32(CG_CLKPIN_CNTL_2);
1789                                data &= ~FORCE_BIF_REFCLK_EN;
1790                                if (orig != data)
1791                                        WREG32(CG_CLKPIN_CNTL_2, data);
1792
1793                                orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1794                                data &= ~MPLL_CLKOUT_SEL_MASK;
1795                                data |= MPLL_CLKOUT_SEL(4);
1796                                if (orig != data)
1797                                        WREG32(MPLL_BYPASSCLK_SEL, data);
1798
1799                                orig = data = RREG32(SPLL_CNTL_MODE);
1800                                data &= ~SPLL_REFCLK_SEL_MASK;
1801                                if (orig != data)
1802                                        WREG32(SPLL_CNTL_MODE, data);
1803                        }
1804                }
1805        } else {
1806                if (orig != data)
1807                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1808        }
1809
1810        orig = data = RREG32_PCIE(PCIE_CNTL2);
1811        data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
1812        if (orig != data)
1813                WREG32_PCIE(PCIE_CNTL2, data);
1814
1815        if (!disable_l0s) {
1816                data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1817                if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
1818                        data = RREG32_PCIE(PCIE_LC_STATUS1);
1819                        if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
1820                                orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1821                                data &= ~LC_L0S_INACTIVITY_MASK;
1822                                if (orig != data)
1823                                        WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1824                        }
1825                }
1826        }
1827}
1828
1829static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
1830{
1831        int readrq;
1832        u16 v;
1833
1834        readrq = pcie_get_readrq(adev->pdev);
1835        v = ffs(readrq) - 8;
1836        if ((v == 0) || (v == 6) || (v == 7))
1837                pcie_set_readrq(adev->pdev, 512);
1838}
1839
1840static int si_common_hw_init(void *handle)
1841{
1842        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1843
1844        si_fix_pci_max_read_req_size(adev);
1845        si_init_golden_registers(adev);
1846        si_pcie_gen3_enable(adev);
1847        si_program_aspm(adev);
1848
1849        return 0;
1850}
1851
1852static int si_common_hw_fini(void *handle)
1853{
1854        return 0;
1855}
1856
1857static int si_common_suspend(void *handle)
1858{
1859        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1860
1861        return si_common_hw_fini(adev);
1862}
1863
1864static int si_common_resume(void *handle)
1865{
1866        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1867
1868        return si_common_hw_init(adev);
1869}
1870
1871static bool si_common_is_idle(void *handle)
1872{
1873        return true;
1874}
1875
1876static int si_common_wait_for_idle(void *handle)
1877{
1878        return 0;
1879}
1880
1881static int si_common_soft_reset(void *handle)
1882{
1883        return 0;
1884}
1885
1886static int si_common_set_clockgating_state(void *handle,
1887                                            enum amd_clockgating_state state)
1888{
1889        return 0;
1890}
1891
1892static int si_common_set_powergating_state(void *handle,
1893                                            enum amd_powergating_state state)
1894{
1895        return 0;
1896}
1897
1898static const struct amd_ip_funcs si_common_ip_funcs = {
1899        .name = "si_common",
1900        .early_init = si_common_early_init,
1901        .late_init = NULL,
1902        .sw_init = si_common_sw_init,
1903        .sw_fini = si_common_sw_fini,
1904        .hw_init = si_common_hw_init,
1905        .hw_fini = si_common_hw_fini,
1906        .suspend = si_common_suspend,
1907        .resume = si_common_resume,
1908        .is_idle = si_common_is_idle,
1909        .wait_for_idle = si_common_wait_for_idle,
1910        .soft_reset = si_common_soft_reset,
1911        .set_clockgating_state = si_common_set_clockgating_state,
1912        .set_powergating_state = si_common_set_powergating_state,
1913};
1914
1915static const struct amdgpu_ip_block_version si_common_ip_block =
1916{
1917        .type = AMD_IP_BLOCK_TYPE_COMMON,
1918        .major = 1,
1919        .minor = 0,
1920        .rev = 0,
1921        .funcs = &si_common_ip_funcs,
1922};
1923
1924int si_set_ip_blocks(struct amdgpu_device *adev)
1925{
1926        si_detect_hw_virtualization(adev);
1927
1928        switch (adev->asic_type) {
1929        case CHIP_VERDE:
1930        case CHIP_TAHITI:
1931        case CHIP_PITCAIRN:
1932                amdgpu_ip_block_add(adev, &si_common_ip_block);
1933                amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1934                amdgpu_ip_block_add(adev, &si_ih_ip_block);
1935                amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1936                if (adev->enable_virtual_display)
1937                        amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1938                else
1939                        amdgpu_ip_block_add(adev, &dce_v6_0_ip_block);
1940                amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1941                amdgpu_ip_block_add(adev, &si_dma_ip_block);
1942                /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
1943                /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
1944                break;
1945        case CHIP_OLAND:
1946                amdgpu_ip_block_add(adev, &si_common_ip_block);
1947                amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1948                amdgpu_ip_block_add(adev, &si_ih_ip_block);
1949                amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1950                if (adev->enable_virtual_display)
1951                        amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1952                else
1953                        amdgpu_ip_block_add(adev, &dce_v6_4_ip_block);
1954                amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1955                amdgpu_ip_block_add(adev, &si_dma_ip_block);
1956                /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
1957                /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
1958                break;
1959        case CHIP_HAINAN:
1960                amdgpu_ip_block_add(adev, &si_common_ip_block);
1961                amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
1962                amdgpu_ip_block_add(adev, &si_ih_ip_block);
1963                amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
1964                if (adev->enable_virtual_display)
1965                        amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
1966                amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
1967                amdgpu_ip_block_add(adev, &si_dma_ip_block);
1968                break;
1969        default:
1970                BUG();
1971        }
1972        return 0;
1973}
1974
1975