Linux Audio

Check our new training course

Loading...
v4.17
   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 "amd_pcie.h"
  35#include "si_dpm.h"
  36#include "sid.h"
  37#include "si_ih.h"
  38#include "gfx_v6_0.h"
  39#include "gmc_v6_0.h"
  40#include "si_dma.h"
  41#include "dce_v6_0.h"
  42#include "si.h"
 
  43#include "dce_virtual.h"
  44#include "gca/gfx_6_0_d.h"
  45#include "oss/oss_1_0_d.h"
 
  46#include "gmc/gmc_6_0_d.h"
  47#include "dce/dce_6_0_d.h"
  48#include "uvd/uvd_4_0_d.h"
  49#include "bif/bif_3_0_d.h"
 
 
 
  50
  51static const u32 tahiti_golden_registers[] =
  52{
  53	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
  54	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
  55	mmDB_DEBUG, 0xffffffff, 0x00000000,
  56	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
  57	mmDB_DEBUG3, 0x0002021c, 0x00020200,
  58	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
  59	0x340c, 0x000000c0, 0x00800040,
  60	0x360c, 0x000000c0, 0x00800040,
  61	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
  62	mmFBC_MISC, 0x00200000, 0x50100000,
  63	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
  64	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
  65	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
  66	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
  67	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
  68	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
  69	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
  70	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
  71	0x000c, 0xffffffff, 0x0040,
  72	0x000d, 0x00000040, 0x00004040,
  73	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
  74	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
  75	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
  76	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
  77	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
  78	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
  79	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
  80	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
  81	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
  82	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
  83	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
  84	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
  85	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
  86	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  87	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  88	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  89};
  90
  91static const u32 tahiti_golden_registers2[] =
  92{
  93	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
  94};
  95
  96static const u32 tahiti_golden_rlc_registers[] =
  97{
  98	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
  99	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 100	0x311f, 0xffffffff, 0x10104040,
 101	0x3122, 0xffffffff, 0x0100000a,
 102	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 103	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 104	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
 105};
 106
 107static const u32 pitcairn_golden_registers[] =
 108{
 109	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 110	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 111	mmDB_DEBUG, 0xffffffff, 0x00000000,
 112	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 113	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 114	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 115	0x340c, 0x000300c0, 0x00800040,
 116	0x360c, 0x000300c0, 0x00800040,
 117	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 118	mmFBC_MISC, 0x00200000, 0x50100000,
 119	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 120	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 121	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 122	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 123	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 124	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 125	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 126	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
 127	0x000c, 0xffffffff, 0x0040,
 128	0x000d, 0x00000040, 0x00004040,
 129	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 130	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 131	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 132	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
 133	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 134	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
 135	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 136	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 137	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 138	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 139	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 140	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 141};
 142
 143static const u32 pitcairn_golden_rlc_registers[] =
 144{
 145	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
 146	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
 147	0x311f, 0xffffffff, 0x10102020,
 148	0x3122, 0xffffffff, 0x01000020,
 149	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 150	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
 151};
 152
 153static const u32 verde_pg_init[] =
 154{
 155	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
 156	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
 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, 0x0,
 162	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
 163	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
 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, 0x0,
 169	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
 170	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
 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, 0x0,
 176	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
 177	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
 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, 0x0,
 183	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
 184	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
 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, 0x0,
 190	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
 191	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
 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_WRITE, 0xffffffff, 0x0,
 198	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
 199	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
 200	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
 201	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 202	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 203	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
 204	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
 205	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 206	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 207	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
 208	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
 209	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
 210	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
 211	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
 212	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
 213	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
 214	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
 215	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
 216	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
 217	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
 218	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
 219	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
 220	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
 221	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
 222	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
 223	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
 224	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
 225	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
 226	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
 227	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
 228	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
 229	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
 230	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
 231	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
 232	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
 233	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
 234	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
 235	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
 236	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
 237	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
 238	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
 239	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
 240	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
 241	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
 242	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
 243	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
 244	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
 245	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
 246	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
 247	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
 248	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
 249	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
 250	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
 251	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
 252	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
 253	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
 254	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
 255	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
 256	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
 257	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
 258	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
 259	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
 260	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
 261	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
 262	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
 263	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
 264	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
 265	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
 266	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
 267	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
 268	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
 269	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
 270	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
 271	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
 272	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
 273	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
 274	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
 275	mmGMCON_MISC2, 0xfc00, 0x2000,
 276	mmGMCON_MISC3, 0xffffffff, 0xfc0,
 277	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
 278};
 279
 280static const u32 verde_golden_rlc_registers[] =
 281{
 282	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 283	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
 284	0x311f, 0xffffffff, 0x10808020,
 285	0x3122, 0xffffffff, 0x00800008,
 286	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
 287	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
 288};
 289
 290static const u32 verde_golden_registers[] =
 291{
 292	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 293	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 294	mmDB_DEBUG, 0xffffffff, 0x00000000,
 295	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 296	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 297	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 298	0x340c, 0x000300c0, 0x00800040,
 299	0x360c, 0x000300c0, 0x00800040,
 300	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 301	mmFBC_MISC, 0x00200000, 0x50100000,
 302	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 303	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 304	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 305	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 306	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 307	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 308	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 309	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
 310	0x000c, 0xffffffff, 0x0040,
 311	0x000d, 0x00000040, 0x00004040,
 312	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 313	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
 314	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
 315	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 316	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 317	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
 318	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 319	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
 320	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 321	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 322	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 323	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 324	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 325	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 326};
 327
 328static const u32 oland_golden_registers[] =
 329{
 330	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 331	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 332	mmDB_DEBUG, 0xffffffff, 0x00000000,
 333	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 334	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 335	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 336	0x340c, 0x000300c0, 0x00800040,
 337	0x360c, 0x000300c0, 0x00800040,
 338	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 339	mmFBC_MISC, 0x00200000, 0x50100000,
 340	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 341	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 342	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 343	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 344	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 345	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 346	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 347	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
 348	0x000c, 0xffffffff, 0x0040,
 349	0x000d, 0x00000040, 0x00004040,
 350	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 351	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 352	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 353	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
 354	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 355	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 356	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 357	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 358	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 359	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 360	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 361	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 362
 363};
 364
 365static const u32 oland_golden_rlc_registers[] =
 366{
 367	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 368	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 369	0x311f, 0xffffffff, 0x10104040,
 370	0x3122, 0xffffffff, 0x0100000a,
 371	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 372	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 373};
 374
 375static const u32 hainan_golden_registers[] =
 376{
 377	0x17bc, 0x00000030, 0x00000011,
 378	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 379	mmDB_DEBUG, 0xffffffff, 0x00000000,
 380	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 381	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 382	0x031e, 0x00000080, 0x00000000,
 383	0x3430, 0xff000fff, 0x00000100,
 384	0x340c, 0x000300c0, 0x00800040,
 385	0x3630, 0xff000fff, 0x00000100,
 386	0x360c, 0x000300c0, 0x00800040,
 387	0x16ec, 0x000000f0, 0x00000070,
 388	0x16f0, 0x00200000, 0x50100000,
 389	0x1c0c, 0x31000311, 0x00000011,
 390	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 391	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 392	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 393	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 394	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 395	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 396	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
 397	0x000c, 0xffffffff, 0x0040,
 398	0x000d, 0x00000040, 0x00004040,
 399	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
 400	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 401	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 402	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
 403	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 404	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 405	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 406	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 407	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 408	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 409	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 410	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 411};
 412
 413static const u32 hainan_golden_registers2[] =
 414{
 415	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
 416};
 417
 418static const u32 tahiti_mgcg_cgcg_init[] =
 419{
 420	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 421	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 422	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 423	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 424	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 425	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 426	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 427	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 428	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 429	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 430	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 431	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 432	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 433	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 434	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 435	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 436	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 437	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 438	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 439	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 440	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 441	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 442	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 443	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 444	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 445	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 446	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 447	0x2458, 0xffffffff, 0x00010000,
 448	0x2459, 0xffffffff, 0x00030002,
 449	0x245a, 0xffffffff, 0x00040007,
 450	0x245b, 0xffffffff, 0x00060005,
 451	0x245c, 0xffffffff, 0x00090008,
 452	0x245d, 0xffffffff, 0x00020001,
 453	0x245e, 0xffffffff, 0x00040003,
 454	0x245f, 0xffffffff, 0x00000007,
 455	0x2460, 0xffffffff, 0x00060005,
 456	0x2461, 0xffffffff, 0x00090008,
 457	0x2462, 0xffffffff, 0x00030002,
 458	0x2463, 0xffffffff, 0x00050004,
 459	0x2464, 0xffffffff, 0x00000008,
 460	0x2465, 0xffffffff, 0x00070006,
 461	0x2466, 0xffffffff, 0x000a0009,
 462	0x2467, 0xffffffff, 0x00040003,
 463	0x2468, 0xffffffff, 0x00060005,
 464	0x2469, 0xffffffff, 0x00000009,
 465	0x246a, 0xffffffff, 0x00080007,
 466	0x246b, 0xffffffff, 0x000b000a,
 467	0x246c, 0xffffffff, 0x00050004,
 468	0x246d, 0xffffffff, 0x00070006,
 469	0x246e, 0xffffffff, 0x0008000b,
 470	0x246f, 0xffffffff, 0x000a0009,
 471	0x2470, 0xffffffff, 0x000d000c,
 472	0x2471, 0xffffffff, 0x00060005,
 473	0x2472, 0xffffffff, 0x00080007,
 474	0x2473, 0xffffffff, 0x0000000b,
 475	0x2474, 0xffffffff, 0x000a0009,
 476	0x2475, 0xffffffff, 0x000d000c,
 477	0x2476, 0xffffffff, 0x00070006,
 478	0x2477, 0xffffffff, 0x00090008,
 479	0x2478, 0xffffffff, 0x0000000c,
 480	0x2479, 0xffffffff, 0x000b000a,
 481	0x247a, 0xffffffff, 0x000e000d,
 482	0x247b, 0xffffffff, 0x00080007,
 483	0x247c, 0xffffffff, 0x000a0009,
 484	0x247d, 0xffffffff, 0x0000000d,
 485	0x247e, 0xffffffff, 0x000c000b,
 486	0x247f, 0xffffffff, 0x000f000e,
 487	0x2480, 0xffffffff, 0x00090008,
 488	0x2481, 0xffffffff, 0x000b000a,
 489	0x2482, 0xffffffff, 0x000c000f,
 490	0x2483, 0xffffffff, 0x000e000d,
 491	0x2484, 0xffffffff, 0x00110010,
 492	0x2485, 0xffffffff, 0x000a0009,
 493	0x2486, 0xffffffff, 0x000c000b,
 494	0x2487, 0xffffffff, 0x0000000f,
 495	0x2488, 0xffffffff, 0x000e000d,
 496	0x2489, 0xffffffff, 0x00110010,
 497	0x248a, 0xffffffff, 0x000b000a,
 498	0x248b, 0xffffffff, 0x000d000c,
 499	0x248c, 0xffffffff, 0x00000010,
 500	0x248d, 0xffffffff, 0x000f000e,
 501	0x248e, 0xffffffff, 0x00120011,
 502	0x248f, 0xffffffff, 0x000c000b,
 503	0x2490, 0xffffffff, 0x000e000d,
 504	0x2491, 0xffffffff, 0x00000011,
 505	0x2492, 0xffffffff, 0x0010000f,
 506	0x2493, 0xffffffff, 0x00130012,
 507	0x2494, 0xffffffff, 0x000d000c,
 508	0x2495, 0xffffffff, 0x000f000e,
 509	0x2496, 0xffffffff, 0x00100013,
 510	0x2497, 0xffffffff, 0x00120011,
 511	0x2498, 0xffffffff, 0x00150014,
 512	0x2499, 0xffffffff, 0x000e000d,
 513	0x249a, 0xffffffff, 0x0010000f,
 514	0x249b, 0xffffffff, 0x00000013,
 515	0x249c, 0xffffffff, 0x00120011,
 516	0x249d, 0xffffffff, 0x00150014,
 517	0x249e, 0xffffffff, 0x000f000e,
 518	0x249f, 0xffffffff, 0x00110010,
 519	0x24a0, 0xffffffff, 0x00000014,
 520	0x24a1, 0xffffffff, 0x00130012,
 521	0x24a2, 0xffffffff, 0x00160015,
 522	0x24a3, 0xffffffff, 0x0010000f,
 523	0x24a4, 0xffffffff, 0x00120011,
 524	0x24a5, 0xffffffff, 0x00000015,
 525	0x24a6, 0xffffffff, 0x00140013,
 526	0x24a7, 0xffffffff, 0x00170016,
 527	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 528	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 529	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 530	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 531	0x000c, 0xffffffff, 0x0000001c,
 532	0x000d, 0x000f0000, 0x000f0000,
 533	0x0583, 0xffffffff, 0x00000100,
 534	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 535	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 536	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 537	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 538	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 539	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 540	0x157a, 0x00000001, 0x00000001,
 541	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 542	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 543	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 544	0x3430, 0xfffffff0, 0x00000100,
 545	0x3630, 0xfffffff0, 0x00000100,
 546};
 547static const u32 pitcairn_mgcg_cgcg_init[] =
 548{
 549	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 550	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 551	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 552	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 553	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 554	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 555	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 556	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 557	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 558	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 559	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 560	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 561	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 562	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 563	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 564	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 565	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 566	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 567	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 568	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 569	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 570	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 571	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 572	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 573	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 574	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 575	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 576	0x2458, 0xffffffff, 0x00010000,
 577	0x2459, 0xffffffff, 0x00030002,
 578	0x245a, 0xffffffff, 0x00040007,
 579	0x245b, 0xffffffff, 0x00060005,
 580	0x245c, 0xffffffff, 0x00090008,
 581	0x245d, 0xffffffff, 0x00020001,
 582	0x245e, 0xffffffff, 0x00040003,
 583	0x245f, 0xffffffff, 0x00000007,
 584	0x2460, 0xffffffff, 0x00060005,
 585	0x2461, 0xffffffff, 0x00090008,
 586	0x2462, 0xffffffff, 0x00030002,
 587	0x2463, 0xffffffff, 0x00050004,
 588	0x2464, 0xffffffff, 0x00000008,
 589	0x2465, 0xffffffff, 0x00070006,
 590	0x2466, 0xffffffff, 0x000a0009,
 591	0x2467, 0xffffffff, 0x00040003,
 592	0x2468, 0xffffffff, 0x00060005,
 593	0x2469, 0xffffffff, 0x00000009,
 594	0x246a, 0xffffffff, 0x00080007,
 595	0x246b, 0xffffffff, 0x000b000a,
 596	0x246c, 0xffffffff, 0x00050004,
 597	0x246d, 0xffffffff, 0x00070006,
 598	0x246e, 0xffffffff, 0x0008000b,
 599	0x246f, 0xffffffff, 0x000a0009,
 600	0x2470, 0xffffffff, 0x000d000c,
 601	0x2480, 0xffffffff, 0x00090008,
 602	0x2481, 0xffffffff, 0x000b000a,
 603	0x2482, 0xffffffff, 0x000c000f,
 604	0x2483, 0xffffffff, 0x000e000d,
 605	0x2484, 0xffffffff, 0x00110010,
 606	0x2485, 0xffffffff, 0x000a0009,
 607	0x2486, 0xffffffff, 0x000c000b,
 608	0x2487, 0xffffffff, 0x0000000f,
 609	0x2488, 0xffffffff, 0x000e000d,
 610	0x2489, 0xffffffff, 0x00110010,
 611	0x248a, 0xffffffff, 0x000b000a,
 612	0x248b, 0xffffffff, 0x000d000c,
 613	0x248c, 0xffffffff, 0x00000010,
 614	0x248d, 0xffffffff, 0x000f000e,
 615	0x248e, 0xffffffff, 0x00120011,
 616	0x248f, 0xffffffff, 0x000c000b,
 617	0x2490, 0xffffffff, 0x000e000d,
 618	0x2491, 0xffffffff, 0x00000011,
 619	0x2492, 0xffffffff, 0x0010000f,
 620	0x2493, 0xffffffff, 0x00130012,
 621	0x2494, 0xffffffff, 0x000d000c,
 622	0x2495, 0xffffffff, 0x000f000e,
 623	0x2496, 0xffffffff, 0x00100013,
 624	0x2497, 0xffffffff, 0x00120011,
 625	0x2498, 0xffffffff, 0x00150014,
 626	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 627	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 628	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 629	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 630	0x000c, 0xffffffff, 0x0000001c,
 631	0x000d, 0x000f0000, 0x000f0000,
 632	0x0583, 0xffffffff, 0x00000100,
 633	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 634	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 635	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 636	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 637	0x157a, 0x00000001, 0x00000001,
 638	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 639	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 640	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 641	0x3430, 0xfffffff0, 0x00000100,
 642	0x3630, 0xfffffff0, 0x00000100,
 643};
 644
 645static const u32 verde_mgcg_cgcg_init[] =
 646{
 647	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 648	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 649	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 650	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 651	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 652	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 653	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 654	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 655	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 656	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 657	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 658	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 659	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 660	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 661	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 662	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 663	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 664	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 665	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 666	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 667	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 668	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 669	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 670	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 671	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 672	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 673	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 674	0x2458, 0xffffffff, 0x00010000,
 675	0x2459, 0xffffffff, 0x00030002,
 676	0x245a, 0xffffffff, 0x00040007,
 677	0x245b, 0xffffffff, 0x00060005,
 678	0x245c, 0xffffffff, 0x00090008,
 679	0x245d, 0xffffffff, 0x00020001,
 680	0x245e, 0xffffffff, 0x00040003,
 681	0x245f, 0xffffffff, 0x00000007,
 682	0x2460, 0xffffffff, 0x00060005,
 683	0x2461, 0xffffffff, 0x00090008,
 684	0x2462, 0xffffffff, 0x00030002,
 685	0x2463, 0xffffffff, 0x00050004,
 686	0x2464, 0xffffffff, 0x00000008,
 687	0x2465, 0xffffffff, 0x00070006,
 688	0x2466, 0xffffffff, 0x000a0009,
 689	0x2467, 0xffffffff, 0x00040003,
 690	0x2468, 0xffffffff, 0x00060005,
 691	0x2469, 0xffffffff, 0x00000009,
 692	0x246a, 0xffffffff, 0x00080007,
 693	0x246b, 0xffffffff, 0x000b000a,
 694	0x246c, 0xffffffff, 0x00050004,
 695	0x246d, 0xffffffff, 0x00070006,
 696	0x246e, 0xffffffff, 0x0008000b,
 697	0x246f, 0xffffffff, 0x000a0009,
 698	0x2470, 0xffffffff, 0x000d000c,
 699	0x2480, 0xffffffff, 0x00090008,
 700	0x2481, 0xffffffff, 0x000b000a,
 701	0x2482, 0xffffffff, 0x000c000f,
 702	0x2483, 0xffffffff, 0x000e000d,
 703	0x2484, 0xffffffff, 0x00110010,
 704	0x2485, 0xffffffff, 0x000a0009,
 705	0x2486, 0xffffffff, 0x000c000b,
 706	0x2487, 0xffffffff, 0x0000000f,
 707	0x2488, 0xffffffff, 0x000e000d,
 708	0x2489, 0xffffffff, 0x00110010,
 709	0x248a, 0xffffffff, 0x000b000a,
 710	0x248b, 0xffffffff, 0x000d000c,
 711	0x248c, 0xffffffff, 0x00000010,
 712	0x248d, 0xffffffff, 0x000f000e,
 713	0x248e, 0xffffffff, 0x00120011,
 714	0x248f, 0xffffffff, 0x000c000b,
 715	0x2490, 0xffffffff, 0x000e000d,
 716	0x2491, 0xffffffff, 0x00000011,
 717	0x2492, 0xffffffff, 0x0010000f,
 718	0x2493, 0xffffffff, 0x00130012,
 719	0x2494, 0xffffffff, 0x000d000c,
 720	0x2495, 0xffffffff, 0x000f000e,
 721	0x2496, 0xffffffff, 0x00100013,
 722	0x2497, 0xffffffff, 0x00120011,
 723	0x2498, 0xffffffff, 0x00150014,
 724	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 725	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 726	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 727	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 728	0x000c, 0xffffffff, 0x0000001c,
 729	0x000d, 0x000f0000, 0x000f0000,
 730	0x0583, 0xffffffff, 0x00000100,
 731	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 732	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 733	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 734	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 735	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 736	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 737	0x157a, 0x00000001, 0x00000001,
 738	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 739	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 740	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 741	0x3430, 0xfffffff0, 0x00000100,
 742	0x3630, 0xfffffff0, 0x00000100,
 743};
 744
 745static const u32 oland_mgcg_cgcg_init[] =
 746{
 747	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 748	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 749	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 750	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 751	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 752	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 753	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 754	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 755	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 756	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 757	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 758	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 759	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 760	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 761	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 762	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 763	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 764	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 765	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 766	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 767	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 768	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 769	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 770	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 771	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 772	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 773	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 774	0x2458, 0xffffffff, 0x00010000,
 775	0x2459, 0xffffffff, 0x00030002,
 776	0x245a, 0xffffffff, 0x00040007,
 777	0x245b, 0xffffffff, 0x00060005,
 778	0x245c, 0xffffffff, 0x00090008,
 779	0x245d, 0xffffffff, 0x00020001,
 780	0x245e, 0xffffffff, 0x00040003,
 781	0x245f, 0xffffffff, 0x00000007,
 782	0x2460, 0xffffffff, 0x00060005,
 783	0x2461, 0xffffffff, 0x00090008,
 784	0x2462, 0xffffffff, 0x00030002,
 785	0x2463, 0xffffffff, 0x00050004,
 786	0x2464, 0xffffffff, 0x00000008,
 787	0x2465, 0xffffffff, 0x00070006,
 788	0x2466, 0xffffffff, 0x000a0009,
 789	0x2467, 0xffffffff, 0x00040003,
 790	0x2468, 0xffffffff, 0x00060005,
 791	0x2469, 0xffffffff, 0x00000009,
 792	0x246a, 0xffffffff, 0x00080007,
 793	0x246b, 0xffffffff, 0x000b000a,
 794	0x246c, 0xffffffff, 0x00050004,
 795	0x246d, 0xffffffff, 0x00070006,
 796	0x246e, 0xffffffff, 0x0008000b,
 797	0x246f, 0xffffffff, 0x000a0009,
 798	0x2470, 0xffffffff, 0x000d000c,
 799	0x2471, 0xffffffff, 0x00060005,
 800	0x2472, 0xffffffff, 0x00080007,
 801	0x2473, 0xffffffff, 0x0000000b,
 802	0x2474, 0xffffffff, 0x000a0009,
 803	0x2475, 0xffffffff, 0x000d000c,
 804	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 805	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 806	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 807	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 808	0x000c, 0xffffffff, 0x0000001c,
 809	0x000d, 0x000f0000, 0x000f0000,
 810	0x0583, 0xffffffff, 0x00000100,
 811	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 812	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 813	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 814	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 815	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 816	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 817	0x157a, 0x00000001, 0x00000001,
 818	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 819	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 820	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 821	0x3430, 0xfffffff0, 0x00000100,
 822	0x3630, 0xfffffff0, 0x00000100,
 823};
 824
 825static const u32 hainan_mgcg_cgcg_init[] =
 826{
 827	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 828	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 829	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 830	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 831	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 832	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 833	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 834	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 835	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 836	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 837	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 838	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 839	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 840	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 841	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 842	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 843	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 844	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 845	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 846	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 847	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 848	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 849	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 850	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 851	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 852	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 853	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 854	0x2458, 0xffffffff, 0x00010000,
 855	0x2459, 0xffffffff, 0x00030002,
 856	0x245a, 0xffffffff, 0x00040007,
 857	0x245b, 0xffffffff, 0x00060005,
 858	0x245c, 0xffffffff, 0x00090008,
 859	0x245d, 0xffffffff, 0x00020001,
 860	0x245e, 0xffffffff, 0x00040003,
 861	0x245f, 0xffffffff, 0x00000007,
 862	0x2460, 0xffffffff, 0x00060005,
 863	0x2461, 0xffffffff, 0x00090008,
 864	0x2462, 0xffffffff, 0x00030002,
 865	0x2463, 0xffffffff, 0x00050004,
 866	0x2464, 0xffffffff, 0x00000008,
 867	0x2465, 0xffffffff, 0x00070006,
 868	0x2466, 0xffffffff, 0x000a0009,
 869	0x2467, 0xffffffff, 0x00040003,
 870	0x2468, 0xffffffff, 0x00060005,
 871	0x2469, 0xffffffff, 0x00000009,
 872	0x246a, 0xffffffff, 0x00080007,
 873	0x246b, 0xffffffff, 0x000b000a,
 874	0x246c, 0xffffffff, 0x00050004,
 875	0x246d, 0xffffffff, 0x00070006,
 876	0x246e, 0xffffffff, 0x0008000b,
 877	0x246f, 0xffffffff, 0x000a0009,
 878	0x2470, 0xffffffff, 0x000d000c,
 879	0x2471, 0xffffffff, 0x00060005,
 880	0x2472, 0xffffffff, 0x00080007,
 881	0x2473, 0xffffffff, 0x0000000b,
 882	0x2474, 0xffffffff, 0x000a0009,
 883	0x2475, 0xffffffff, 0x000d000c,
 884	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 885	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 886	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 887	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 888	0x000c, 0xffffffff, 0x0000001c,
 889	0x000d, 0x000f0000, 0x000f0000,
 890	0x0583, 0xffffffff, 0x00000100,
 891	0x0409, 0xffffffff, 0x00000100,
 892	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 893	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 894	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 895	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 896	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 897	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 898	0x3430, 0xfffffff0, 0x00000100,
 899	0x3630, 0xfffffff0, 0x00000100,
 900};
 901
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 902static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
 903{
 904	unsigned long flags;
 905	u32 r;
 906
 907	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 908	WREG32(AMDGPU_PCIE_INDEX, reg);
 909	(void)RREG32(AMDGPU_PCIE_INDEX);
 910	r = RREG32(AMDGPU_PCIE_DATA);
 911	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 912	return r;
 913}
 914
 915static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 916{
 917	unsigned long flags;
 918
 919	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 920	WREG32(AMDGPU_PCIE_INDEX, reg);
 921	(void)RREG32(AMDGPU_PCIE_INDEX);
 922	WREG32(AMDGPU_PCIE_DATA, v);
 923	(void)RREG32(AMDGPU_PCIE_DATA);
 924	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 925}
 926
 927static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
 928{
 929	unsigned long flags;
 930	u32 r;
 931
 932	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 933	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
 934	(void)RREG32(PCIE_PORT_INDEX);
 935	r = RREG32(PCIE_PORT_DATA);
 936	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 937	return r;
 938}
 939
 940static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 941{
 942	unsigned long flags;
 943
 944	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
 945	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
 946	(void)RREG32(PCIE_PORT_INDEX);
 947	WREG32(PCIE_PORT_DATA, (v));
 948	(void)RREG32(PCIE_PORT_DATA);
 949	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 950}
 951
 952static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
 953{
 954	unsigned long flags;
 955	u32 r;
 956
 957	spin_lock_irqsave(&adev->smc_idx_lock, flags);
 958	WREG32(SMC_IND_INDEX_0, (reg));
 959	r = RREG32(SMC_IND_DATA_0);
 960	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
 961	return r;
 962}
 963
 964static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 965{
 966	unsigned long flags;
 967
 968	spin_lock_irqsave(&adev->smc_idx_lock, flags);
 969	WREG32(SMC_IND_INDEX_0, (reg));
 970	WREG32(SMC_IND_DATA_0, (v));
 971	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
 972}
 973
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 974static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
 975	{GRBM_STATUS},
 
 
 
 
 
 
 
 
 
 
 
 976	{GB_ADDR_CONFIG},
 977	{MC_ARB_RAMCFG},
 978	{GB_TILE_MODE0},
 979	{GB_TILE_MODE1},
 980	{GB_TILE_MODE2},
 981	{GB_TILE_MODE3},
 982	{GB_TILE_MODE4},
 983	{GB_TILE_MODE5},
 984	{GB_TILE_MODE6},
 985	{GB_TILE_MODE7},
 986	{GB_TILE_MODE8},
 987	{GB_TILE_MODE9},
 988	{GB_TILE_MODE10},
 989	{GB_TILE_MODE11},
 990	{GB_TILE_MODE12},
 991	{GB_TILE_MODE13},
 992	{GB_TILE_MODE14},
 993	{GB_TILE_MODE15},
 994	{GB_TILE_MODE16},
 995	{GB_TILE_MODE17},
 996	{GB_TILE_MODE18},
 997	{GB_TILE_MODE19},
 998	{GB_TILE_MODE20},
 999	{GB_TILE_MODE21},
1000	{GB_TILE_MODE22},
1001	{GB_TILE_MODE23},
1002	{GB_TILE_MODE24},
1003	{GB_TILE_MODE25},
1004	{GB_TILE_MODE26},
1005	{GB_TILE_MODE27},
1006	{GB_TILE_MODE28},
1007	{GB_TILE_MODE29},
1008	{GB_TILE_MODE30},
1009	{GB_TILE_MODE31},
1010	{CC_RB_BACKEND_DISABLE, true},
1011	{GC_USER_RB_BACKEND_DISABLE, true},
1012	{PA_SC_RASTER_CONFIG, true},
1013};
1014
1015static uint32_t si_get_register_value(struct amdgpu_device *adev,
1016				      bool indexed, u32 se_num,
1017				      u32 sh_num, u32 reg_offset)
1018{
1019	if (indexed) {
1020		uint32_t val;
1021		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1022		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1023
1024		switch (reg_offset) {
1025		case mmCC_RB_BACKEND_DISABLE:
1026			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1027		case mmGC_USER_RB_BACKEND_DISABLE:
1028			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1029		case mmPA_SC_RASTER_CONFIG:
1030			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1031		}
1032
1033		mutex_lock(&adev->grbm_idx_mutex);
1034		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1035			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1036
1037		val = RREG32(reg_offset);
1038
1039		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1040			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1041		mutex_unlock(&adev->grbm_idx_mutex);
1042		return val;
1043	} else {
1044		unsigned idx;
1045
1046		switch (reg_offset) {
1047		case mmGB_ADDR_CONFIG:
1048			return adev->gfx.config.gb_addr_config;
1049		case mmMC_ARB_RAMCFG:
1050			return adev->gfx.config.mc_arb_ramcfg;
1051		case mmGB_TILE_MODE0:
1052		case mmGB_TILE_MODE1:
1053		case mmGB_TILE_MODE2:
1054		case mmGB_TILE_MODE3:
1055		case mmGB_TILE_MODE4:
1056		case mmGB_TILE_MODE5:
1057		case mmGB_TILE_MODE6:
1058		case mmGB_TILE_MODE7:
1059		case mmGB_TILE_MODE8:
1060		case mmGB_TILE_MODE9:
1061		case mmGB_TILE_MODE10:
1062		case mmGB_TILE_MODE11:
1063		case mmGB_TILE_MODE12:
1064		case mmGB_TILE_MODE13:
1065		case mmGB_TILE_MODE14:
1066		case mmGB_TILE_MODE15:
1067		case mmGB_TILE_MODE16:
1068		case mmGB_TILE_MODE17:
1069		case mmGB_TILE_MODE18:
1070		case mmGB_TILE_MODE19:
1071		case mmGB_TILE_MODE20:
1072		case mmGB_TILE_MODE21:
1073		case mmGB_TILE_MODE22:
1074		case mmGB_TILE_MODE23:
1075		case mmGB_TILE_MODE24:
1076		case mmGB_TILE_MODE25:
1077		case mmGB_TILE_MODE26:
1078		case mmGB_TILE_MODE27:
1079		case mmGB_TILE_MODE28:
1080		case mmGB_TILE_MODE29:
1081		case mmGB_TILE_MODE30:
1082		case mmGB_TILE_MODE31:
1083			idx = (reg_offset - mmGB_TILE_MODE0);
1084			return adev->gfx.config.tile_mode_array[idx];
1085		default:
1086			return RREG32(reg_offset);
1087		}
1088	}
1089}
1090static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1091			     u32 sh_num, u32 reg_offset, u32 *value)
1092{
1093	uint32_t i;
1094
1095	*value = 0;
1096	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1097		bool indexed = si_allowed_read_registers[i].grbm_indexed;
1098
1099		if (reg_offset != si_allowed_read_registers[i].reg_offset)
1100			continue;
1101
1102		*value = si_get_register_value(adev, indexed, se_num, sh_num,
1103					       reg_offset);
1104		return 0;
1105	}
1106	return -EINVAL;
1107}
1108
1109static bool si_read_disabled_bios(struct amdgpu_device *adev)
1110{
1111	u32 bus_cntl;
1112	u32 d1vga_control = 0;
1113	u32 d2vga_control = 0;
1114	u32 vga_render_control = 0;
1115	u32 rom_cntl;
1116	bool r;
1117
1118	bus_cntl = RREG32(R600_BUS_CNTL);
1119	if (adev->mode_info.num_crtc) {
1120		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1121		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1122		vga_render_control = RREG32(VGA_RENDER_CONTROL);
1123	}
1124	rom_cntl = RREG32(R600_ROM_CNTL);
1125
1126	/* enable the rom */
1127	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1128	if (adev->mode_info.num_crtc) {
1129		/* Disable VGA mode */
1130		WREG32(AVIVO_D1VGA_CONTROL,
1131		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1132					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1133		WREG32(AVIVO_D2VGA_CONTROL,
1134		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1135					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1136		WREG32(VGA_RENDER_CONTROL,
1137		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1138	}
1139	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1140
1141	r = amdgpu_read_bios(adev);
1142
1143	/* restore regs */
1144	WREG32(R600_BUS_CNTL, bus_cntl);
1145	if (adev->mode_info.num_crtc) {
1146		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1147		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1148		WREG32(VGA_RENDER_CONTROL, vga_render_control);
1149	}
1150	WREG32(R600_ROM_CNTL, rom_cntl);
1151	return r;
1152}
1153
1154#define mmROM_INDEX 0x2A
1155#define mmROM_DATA  0x2B
1156
1157static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1158				  u8 *bios, u32 length_bytes)
1159{
1160	u32 *dw_ptr;
1161	u32 i, length_dw;
1162
1163	if (bios == NULL)
1164		return false;
1165	if (length_bytes == 0)
1166		return false;
1167	/* APU vbios image is part of sbios image */
1168	if (adev->flags & AMD_IS_APU)
1169		return false;
1170
1171	dw_ptr = (u32 *)bios;
1172	length_dw = ALIGN(length_bytes, 4) / 4;
1173	/* set rom index to 0 */
1174	WREG32(mmROM_INDEX, 0);
1175	for (i = 0; i < length_dw; i++)
1176		dw_ptr[i] = RREG32(mmROM_DATA);
1177
1178	return true;
1179}
1180
1181//xxx: not implemented
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1182static int si_asic_reset(struct amdgpu_device *adev)
1183{
1184	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
1185}
1186
1187static u32 si_get_config_memsize(struct amdgpu_device *adev)
1188{
1189	return RREG32(mmCONFIG_MEMSIZE);
1190}
1191
1192static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1193{
1194	uint32_t temp;
1195
1196	temp = RREG32(CONFIG_CNTL);
1197	if (state == false) {
1198		temp &= ~(1<<0);
1199		temp |= (1<<1);
1200	} else {
1201		temp &= ~(1<<1);
1202	}
1203	WREG32(CONFIG_CNTL, temp);
1204}
1205
1206static u32 si_get_xclk(struct amdgpu_device *adev)
1207{
1208        u32 reference_clock = adev->clock.spll.reference_freq;
1209	u32 tmp;
1210
1211	tmp = RREG32(CG_CLKPIN_CNTL_2);
1212	if (tmp & MUX_TCLK_TO_XCLK)
1213		return TCLK;
1214
1215	tmp = RREG32(CG_CLKPIN_CNTL);
1216	if (tmp & XTALIN_DIVIDE)
1217		return reference_clock / 4;
1218
1219	return reference_clock;
1220}
1221
1222//xxx:not implemented
1223static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1224{
1225	return 0;
1226}
1227
1228static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1229{
1230	if (is_virtual_machine()) /* passthrough mode */
1231		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1232}
1233
1234static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1235{
1236	if (!ring || !ring->funcs->emit_wreg) {
1237		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1238		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1239	} else {
1240		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1241	}
1242}
1243
1244static void si_invalidate_hdp(struct amdgpu_device *adev,
1245			      struct amdgpu_ring *ring)
1246{
1247	if (!ring || !ring->funcs->emit_wreg) {
1248		WREG32(mmHDP_DEBUG0, 1);
1249		RREG32(mmHDP_DEBUG0);
1250	} else {
1251		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1252	}
1253}
1254
 
 
 
 
 
 
 
 
 
 
 
1255static int si_get_pcie_lanes(struct amdgpu_device *adev)
1256{
1257	u32 link_width_cntl;
1258
1259	if (adev->flags & AMD_IS_APU)
1260		return 0;
1261
1262	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1263
1264	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1265	case LC_LINK_WIDTH_X1:
1266		return 1;
1267	case LC_LINK_WIDTH_X2:
1268		return 2;
1269	case LC_LINK_WIDTH_X4:
1270		return 4;
1271	case LC_LINK_WIDTH_X8:
1272		return 8;
1273	case LC_LINK_WIDTH_X0:
1274	case LC_LINK_WIDTH_X16:
1275	default:
1276		return 16;
1277	}
1278}
1279
1280static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1281{
1282	u32 link_width_cntl, mask;
1283
1284	if (adev->flags & AMD_IS_APU)
1285		return;
1286
1287	switch (lanes) {
1288	case 0:
1289		mask = LC_LINK_WIDTH_X0;
1290		break;
1291	case 1:
1292		mask = LC_LINK_WIDTH_X1;
1293		break;
1294	case 2:
1295		mask = LC_LINK_WIDTH_X2;
1296		break;
1297	case 4:
1298		mask = LC_LINK_WIDTH_X4;
1299		break;
1300	case 8:
1301		mask = LC_LINK_WIDTH_X8;
1302		break;
1303	case 16:
1304		mask = LC_LINK_WIDTH_X16;
1305		break;
1306	default:
1307		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1308		return;
1309	}
1310
1311	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1312	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1313	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1314	link_width_cntl |= (LC_RECONFIG_NOW |
1315			    LC_RECONFIG_ARC_MISSING_ESCAPE);
1316
1317	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1318}
1319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1320static const struct amdgpu_asic_funcs si_asic_funcs =
1321{
1322	.read_disabled_bios = &si_read_disabled_bios,
1323	.read_bios_from_rom = &si_read_bios_from_rom,
1324	.read_register = &si_read_register,
1325	.reset = &si_asic_reset,
 
1326	.set_vga_state = &si_vga_set_state,
1327	.get_xclk = &si_get_xclk,
1328	.set_uvd_clocks = &si_set_uvd_clocks,
1329	.set_vce_clocks = NULL,
1330	.get_pcie_lanes = &si_get_pcie_lanes,
1331	.set_pcie_lanes = &si_set_pcie_lanes,
1332	.get_config_memsize = &si_get_config_memsize,
1333	.flush_hdp = &si_flush_hdp,
1334	.invalidate_hdp = &si_invalidate_hdp,
 
 
 
 
 
 
 
1335};
1336
1337static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1338{
1339	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1340		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1341}
1342
1343static int si_common_early_init(void *handle)
1344{
1345	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1346
1347	adev->smc_rreg = &si_smc_rreg;
1348	adev->smc_wreg = &si_smc_wreg;
1349	adev->pcie_rreg = &si_pcie_rreg;
1350	adev->pcie_wreg = &si_pcie_wreg;
1351	adev->pciep_rreg = &si_pciep_rreg;
1352	adev->pciep_wreg = &si_pciep_wreg;
1353	adev->uvd_ctx_rreg = NULL;
1354	adev->uvd_ctx_wreg = NULL;
1355	adev->didt_rreg = NULL;
1356	adev->didt_wreg = NULL;
1357
1358	adev->asic_funcs = &si_asic_funcs;
1359
1360	adev->rev_id = si_get_rev_id(adev);
1361	adev->external_rev_id = 0xFF;
1362	switch (adev->asic_type) {
1363	case CHIP_TAHITI:
1364		adev->cg_flags =
1365			AMD_CG_SUPPORT_GFX_MGCG |
1366			AMD_CG_SUPPORT_GFX_MGLS |
1367			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1368			AMD_CG_SUPPORT_GFX_CGLS |
1369			AMD_CG_SUPPORT_GFX_CGTS |
1370			AMD_CG_SUPPORT_GFX_CP_LS |
1371			AMD_CG_SUPPORT_MC_MGCG |
1372			AMD_CG_SUPPORT_SDMA_MGCG |
1373			AMD_CG_SUPPORT_BIF_LS |
1374			AMD_CG_SUPPORT_VCE_MGCG |
1375			AMD_CG_SUPPORT_UVD_MGCG |
1376			AMD_CG_SUPPORT_HDP_LS |
1377			AMD_CG_SUPPORT_HDP_MGCG;
1378			adev->pg_flags = 0;
1379		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1380					(adev->rev_id == 1) ? 5 : 6;
1381		break;
1382	case CHIP_PITCAIRN:
1383		adev->cg_flags =
1384			AMD_CG_SUPPORT_GFX_MGCG |
1385			AMD_CG_SUPPORT_GFX_MGLS |
1386			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1387			AMD_CG_SUPPORT_GFX_CGLS |
1388			AMD_CG_SUPPORT_GFX_CGTS |
1389			AMD_CG_SUPPORT_GFX_CP_LS |
1390			AMD_CG_SUPPORT_GFX_RLC_LS |
1391			AMD_CG_SUPPORT_MC_LS |
1392			AMD_CG_SUPPORT_MC_MGCG |
1393			AMD_CG_SUPPORT_SDMA_MGCG |
1394			AMD_CG_SUPPORT_BIF_LS |
1395			AMD_CG_SUPPORT_VCE_MGCG |
1396			AMD_CG_SUPPORT_UVD_MGCG |
1397			AMD_CG_SUPPORT_HDP_LS |
1398			AMD_CG_SUPPORT_HDP_MGCG;
1399		adev->pg_flags = 0;
1400		adev->external_rev_id = adev->rev_id + 20;
1401		break;
1402
1403	case CHIP_VERDE:
1404		adev->cg_flags =
1405			AMD_CG_SUPPORT_GFX_MGCG |
1406			AMD_CG_SUPPORT_GFX_MGLS |
1407			AMD_CG_SUPPORT_GFX_CGLS |
1408			AMD_CG_SUPPORT_GFX_CGTS |
1409			AMD_CG_SUPPORT_GFX_CGTS_LS |
1410			AMD_CG_SUPPORT_GFX_CP_LS |
1411			AMD_CG_SUPPORT_MC_LS |
1412			AMD_CG_SUPPORT_MC_MGCG |
1413			AMD_CG_SUPPORT_SDMA_MGCG |
1414			AMD_CG_SUPPORT_SDMA_LS |
1415			AMD_CG_SUPPORT_BIF_LS |
1416			AMD_CG_SUPPORT_VCE_MGCG |
1417			AMD_CG_SUPPORT_UVD_MGCG |
1418			AMD_CG_SUPPORT_HDP_LS |
1419			AMD_CG_SUPPORT_HDP_MGCG;
1420		adev->pg_flags = 0;
1421		//???
1422		adev->external_rev_id = adev->rev_id + 40;
1423		break;
1424	case CHIP_OLAND:
1425		adev->cg_flags =
1426			AMD_CG_SUPPORT_GFX_MGCG |
1427			AMD_CG_SUPPORT_GFX_MGLS |
1428			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1429			AMD_CG_SUPPORT_GFX_CGLS |
1430			AMD_CG_SUPPORT_GFX_CGTS |
1431			AMD_CG_SUPPORT_GFX_CP_LS |
1432			AMD_CG_SUPPORT_GFX_RLC_LS |
1433			AMD_CG_SUPPORT_MC_LS |
1434			AMD_CG_SUPPORT_MC_MGCG |
1435			AMD_CG_SUPPORT_SDMA_MGCG |
1436			AMD_CG_SUPPORT_BIF_LS |
1437			AMD_CG_SUPPORT_UVD_MGCG |
1438			AMD_CG_SUPPORT_HDP_LS |
1439			AMD_CG_SUPPORT_HDP_MGCG;
1440		adev->pg_flags = 0;
1441		adev->external_rev_id = 60;
1442		break;
1443	case CHIP_HAINAN:
1444		adev->cg_flags =
1445			AMD_CG_SUPPORT_GFX_MGCG |
1446			AMD_CG_SUPPORT_GFX_MGLS |
1447			/*AMD_CG_SUPPORT_GFX_CGCG |*/
1448			AMD_CG_SUPPORT_GFX_CGLS |
1449			AMD_CG_SUPPORT_GFX_CGTS |
1450			AMD_CG_SUPPORT_GFX_CP_LS |
1451			AMD_CG_SUPPORT_GFX_RLC_LS |
1452			AMD_CG_SUPPORT_MC_LS |
1453			AMD_CG_SUPPORT_MC_MGCG |
1454			AMD_CG_SUPPORT_SDMA_MGCG |
1455			AMD_CG_SUPPORT_BIF_LS |
1456			AMD_CG_SUPPORT_HDP_LS |
1457			AMD_CG_SUPPORT_HDP_MGCG;
1458		adev->pg_flags = 0;
1459		adev->external_rev_id = 70;
1460		break;
1461
1462	default:
1463		return -EINVAL;
1464	}
1465
1466	return 0;
1467}
1468
1469static int si_common_sw_init(void *handle)
1470{
1471	return 0;
1472}
1473
1474static int si_common_sw_fini(void *handle)
1475{
1476	return 0;
1477}
1478
1479
1480static void si_init_golden_registers(struct amdgpu_device *adev)
1481{
1482	switch (adev->asic_type) {
1483	case CHIP_TAHITI:
1484		amdgpu_device_program_register_sequence(adev,
1485							tahiti_golden_registers,
1486							ARRAY_SIZE(tahiti_golden_registers));
1487		amdgpu_device_program_register_sequence(adev,
1488							tahiti_golden_rlc_registers,
1489							ARRAY_SIZE(tahiti_golden_rlc_registers));
1490		amdgpu_device_program_register_sequence(adev,
1491							tahiti_mgcg_cgcg_init,
1492							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1493		amdgpu_device_program_register_sequence(adev,
1494							tahiti_golden_registers2,
1495							ARRAY_SIZE(tahiti_golden_registers2));
1496		break;
1497	case CHIP_PITCAIRN:
1498		amdgpu_device_program_register_sequence(adev,
1499							pitcairn_golden_registers,
1500							ARRAY_SIZE(pitcairn_golden_registers));
1501		amdgpu_device_program_register_sequence(adev,
1502							pitcairn_golden_rlc_registers,
1503							ARRAY_SIZE(pitcairn_golden_rlc_registers));
1504		amdgpu_device_program_register_sequence(adev,
1505							pitcairn_mgcg_cgcg_init,
1506							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1507		break;
1508	case CHIP_VERDE:
1509		amdgpu_device_program_register_sequence(adev,
1510							verde_golden_registers,
1511							ARRAY_SIZE(verde_golden_registers));
1512		amdgpu_device_program_register_sequence(adev,
1513							verde_golden_rlc_registers,
1514							ARRAY_SIZE(verde_golden_rlc_registers));
1515		amdgpu_device_program_register_sequence(adev,
1516							verde_mgcg_cgcg_init,
1517							ARRAY_SIZE(verde_mgcg_cgcg_init));
1518		amdgpu_device_program_register_sequence(adev,
1519							verde_pg_init,
1520							ARRAY_SIZE(verde_pg_init));
1521		break;
1522	case CHIP_OLAND:
1523		amdgpu_device_program_register_sequence(adev,
1524							oland_golden_registers,
1525							ARRAY_SIZE(oland_golden_registers));
1526		amdgpu_device_program_register_sequence(adev,
1527							oland_golden_rlc_registers,
1528							ARRAY_SIZE(oland_golden_rlc_registers));
1529		amdgpu_device_program_register_sequence(adev,
1530							oland_mgcg_cgcg_init,
1531							ARRAY_SIZE(oland_mgcg_cgcg_init));
1532		break;
1533	case CHIP_HAINAN:
1534		amdgpu_device_program_register_sequence(adev,
1535							hainan_golden_registers,
1536							ARRAY_SIZE(hainan_golden_registers));
1537		amdgpu_device_program_register_sequence(adev,
1538							hainan_golden_registers2,
1539							ARRAY_SIZE(hainan_golden_registers2));
1540		amdgpu_device_program_register_sequence(adev,
1541							hainan_mgcg_cgcg_init,
1542							ARRAY_SIZE(hainan_mgcg_cgcg_init));
1543		break;
1544
1545
1546	default:
1547		BUG();
1548	}
1549}
1550
1551static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1552{
1553	struct pci_dev *root = adev->pdev->bus->self;
1554	int bridge_pos, gpu_pos;
1555	u32 speed_cntl, current_data_rate;
1556	int i;
1557	u16 tmp16;
1558
1559	if (pci_is_root_bus(adev->pdev->bus))
1560		return;
1561
1562	if (amdgpu_pcie_gen2 == 0)
1563		return;
1564
1565	if (adev->flags & AMD_IS_APU)
1566		return;
1567
1568	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1569					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1570		return;
1571
1572	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1573	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1574		LC_CURRENT_DATA_RATE_SHIFT;
1575	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1576		if (current_data_rate == 2) {
1577			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1578			return;
1579		}
1580		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1581	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1582		if (current_data_rate == 1) {
1583			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1584			return;
1585		}
1586		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1587	}
1588
1589	bridge_pos = pci_pcie_cap(root);
1590	if (!bridge_pos)
1591		return;
1592
1593	gpu_pos = pci_pcie_cap(adev->pdev);
1594	if (!gpu_pos)
1595		return;
1596
1597	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1598		if (current_data_rate != 2) {
1599			u16 bridge_cfg, gpu_cfg;
1600			u16 bridge_cfg2, gpu_cfg2;
1601			u32 max_lw, current_lw, tmp;
1602
1603			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1604			pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
 
 
1605
1606			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1607			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1608
1609			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1610			pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
 
1611
1612			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1613			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1614			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1615
1616			if (current_lw < max_lw) {
1617				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1618				if (tmp & LC_RENEGOTIATION_SUPPORT) {
1619					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1620					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1621					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1622					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1623				}
1624			}
1625
1626			for (i = 0; i < 10; i++) {
1627				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
 
 
1628				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1629					break;
1630
1631				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1632				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1633
1634				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1635				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
 
 
 
 
 
 
1636
1637				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1638				tmp |= LC_SET_QUIESCE;
1639				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1640
1641				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1642				tmp |= LC_REDO_EQ;
1643				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1644
1645				mdelay(100);
1646
1647				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
 
1648				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1649				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1650				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
 
1651
1652				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
 
 
1653				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1654				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1655				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1656
1657				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1658				tmp16 &= ~((1 << 4) | (7 << 9));
1659				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1660				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1661
1662				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1663				tmp16 &= ~((1 << 4) | (7 << 9));
1664				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1665				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1666
1667				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1668				tmp &= ~LC_SET_QUIESCE;
1669				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1670			}
1671		}
1672	}
1673
1674	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1675	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1676	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1677
1678	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1679	tmp16 &= ~0xf;
 
1680	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1681		tmp16 |= 3;
1682	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1683		tmp16 |= 2;
1684	else
1685		tmp16 |= 1;
1686	pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1687
1688	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1689	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1690	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1691
1692	for (i = 0; i < adev->usec_timeout; i++) {
1693		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1694		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1695			break;
1696		udelay(1);
1697	}
1698}
1699
1700static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1701{
1702	unsigned long flags;
1703	u32 r;
1704
1705	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1706	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1707	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1708	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1709	return r;
1710}
1711
1712static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1713{
1714	unsigned long flags;
1715
1716	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1717	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1718	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1719	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1720}
1721
1722static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1723{
1724	unsigned long flags;
1725	u32 r;
1726
1727	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1728	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1729	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1730	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1731	return r;
1732}
1733
1734static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1735{
1736	unsigned long flags;
1737
1738	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1739	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1740	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1741	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1742}
1743static void si_program_aspm(struct amdgpu_device *adev)
1744{
1745	u32 data, orig;
1746	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1747	bool disable_clkreq = false;
1748
1749	if (amdgpu_aspm == 0)
1750		return;
1751
1752	if (adev->flags & AMD_IS_APU)
1753		return;
1754	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1755	data &= ~LC_XMIT_N_FTS_MASK;
1756	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1757	if (orig != data)
1758		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1759
1760	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1761	data |= LC_GO_TO_RECOVERY;
1762	if (orig != data)
1763		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1764
1765	orig = data = RREG32_PCIE(PCIE_P_CNTL);
1766	data |= P_IGNORE_EDB_ERR;
1767	if (orig != data)
1768		WREG32_PCIE(PCIE_P_CNTL, data);
1769
1770	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1771	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1772	data |= LC_PMI_TO_L1_DIS;
1773	if (!disable_l0s)
1774		data |= LC_L0S_INACTIVITY(7);
1775
1776	if (!disable_l1) {
1777		data |= LC_L1_INACTIVITY(7);
1778		data &= ~LC_PMI_TO_L1_DIS;
1779		if (orig != data)
1780			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1781
1782		if (!disable_plloff_in_l1) {
1783			bool clk_req_support;
1784
1785			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1786			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1787			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1788			if (orig != data)
1789				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1790
1791			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1792			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1793			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1794			if (orig != data)
1795				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1796
1797			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1798			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1799			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1800			if (orig != data)
1801				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1802
1803			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1804			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1805			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1806			if (orig != data)
1807				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1808
1809			if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1810				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1811				data &= ~PLL_RAMP_UP_TIME_0_MASK;
1812				if (orig != data)
1813					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1814
1815				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1816				data &= ~PLL_RAMP_UP_TIME_1_MASK;
1817				if (orig != data)
1818					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1819
1820				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1821				data &= ~PLL_RAMP_UP_TIME_2_MASK;
1822				if (orig != data)
1823					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1824
1825				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1826				data &= ~PLL_RAMP_UP_TIME_3_MASK;
1827				if (orig != data)
1828					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1829
1830				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1831				data &= ~PLL_RAMP_UP_TIME_0_MASK;
1832				if (orig != data)
1833					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1834
1835				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1836				data &= ~PLL_RAMP_UP_TIME_1_MASK;
1837				if (orig != data)
1838					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1839
1840				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1841				data &= ~PLL_RAMP_UP_TIME_2_MASK;
1842				if (orig != data)
1843					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1844
1845				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1846				data &= ~PLL_RAMP_UP_TIME_3_MASK;
1847				if (orig != data)
1848					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1849			}
1850			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1851			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1852			data |= LC_DYN_LANES_PWR_STATE(3);
1853			if (orig != data)
1854				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1855
1856			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1857			data &= ~LS2_EXIT_TIME_MASK;
1858			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1859				data |= LS2_EXIT_TIME(5);
1860			if (orig != data)
1861				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1862
1863			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1864			data &= ~LS2_EXIT_TIME_MASK;
1865			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1866				data |= LS2_EXIT_TIME(5);
1867			if (orig != data)
1868				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1869
1870			if (!disable_clkreq &&
1871			    !pci_is_root_bus(adev->pdev->bus)) {
1872				struct pci_dev *root = adev->pdev->bus->self;
1873				u32 lnkcap;
1874
1875				clk_req_support = false;
1876				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1877				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1878					clk_req_support = true;
1879			} else {
1880				clk_req_support = false;
1881			}
1882
1883			if (clk_req_support) {
1884				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1885				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1886				if (orig != data)
1887					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1888
1889				orig = data = RREG32(THM_CLK_CNTL);
1890				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1891				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1892				if (orig != data)
1893					WREG32(THM_CLK_CNTL, data);
1894
1895				orig = data = RREG32(MISC_CLK_CNTL);
1896				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1897				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1898				if (orig != data)
1899					WREG32(MISC_CLK_CNTL, data);
1900
1901				orig = data = RREG32(CG_CLKPIN_CNTL);
1902				data &= ~BCLK_AS_XCLK;
1903				if (orig != data)
1904					WREG32(CG_CLKPIN_CNTL, data);
1905
1906				orig = data = RREG32(CG_CLKPIN_CNTL_2);
1907				data &= ~FORCE_BIF_REFCLK_EN;
1908				if (orig != data)
1909					WREG32(CG_CLKPIN_CNTL_2, data);
1910
1911				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1912				data &= ~MPLL_CLKOUT_SEL_MASK;
1913				data |= MPLL_CLKOUT_SEL(4);
1914				if (orig != data)
1915					WREG32(MPLL_BYPASSCLK_SEL, data);
1916
1917				orig = data = RREG32(SPLL_CNTL_MODE);
1918				data &= ~SPLL_REFCLK_SEL_MASK;
1919				if (orig != data)
1920					WREG32(SPLL_CNTL_MODE, data);
1921			}
1922		}
1923	} else {
1924		if (orig != data)
1925			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1926	}
1927
1928	orig = data = RREG32_PCIE(PCIE_CNTL2);
1929	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
1930	if (orig != data)
1931		WREG32_PCIE(PCIE_CNTL2, data);
1932
1933	if (!disable_l0s) {
1934		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1935		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
1936			data = RREG32_PCIE(PCIE_LC_STATUS1);
1937			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
1938				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1939				data &= ~LC_L0S_INACTIVITY_MASK;
1940				if (orig != data)
1941					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1942			}
1943		}
1944	}
1945}
1946
1947static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
1948{
1949	int readrq;
1950	u16 v;
1951
1952	readrq = pcie_get_readrq(adev->pdev);
1953	v = ffs(readrq) - 8;
1954	if ((v == 0) || (v == 6) || (v == 7))
1955		pcie_set_readrq(adev->pdev, 512);
1956}
1957
1958static int si_common_hw_init(void *handle)
1959{
1960	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1961
1962	si_fix_pci_max_read_req_size(adev);
1963	si_init_golden_registers(adev);
1964	si_pcie_gen3_enable(adev);
1965	si_program_aspm(adev);
1966
1967	return 0;
1968}
1969
1970static int si_common_hw_fini(void *handle)
1971{
1972	return 0;
1973}
1974
1975static int si_common_suspend(void *handle)
1976{
1977	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1978
1979	return si_common_hw_fini(adev);
1980}
1981
1982static int si_common_resume(void *handle)
1983{
1984	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1985
1986	return si_common_hw_init(adev);
1987}
1988
1989static bool si_common_is_idle(void *handle)
1990{
1991	return true;
1992}
1993
1994static int si_common_wait_for_idle(void *handle)
1995{
1996	return 0;
1997}
1998
1999static int si_common_soft_reset(void *handle)
2000{
2001	return 0;
2002}
2003
2004static int si_common_set_clockgating_state(void *handle,
2005					    enum amd_clockgating_state state)
2006{
2007	return 0;
2008}
2009
2010static int si_common_set_powergating_state(void *handle,
2011					    enum amd_powergating_state state)
2012{
2013	return 0;
2014}
2015
2016static const struct amd_ip_funcs si_common_ip_funcs = {
2017	.name = "si_common",
2018	.early_init = si_common_early_init,
2019	.late_init = NULL,
2020	.sw_init = si_common_sw_init,
2021	.sw_fini = si_common_sw_fini,
2022	.hw_init = si_common_hw_init,
2023	.hw_fini = si_common_hw_fini,
2024	.suspend = si_common_suspend,
2025	.resume = si_common_resume,
2026	.is_idle = si_common_is_idle,
2027	.wait_for_idle = si_common_wait_for_idle,
2028	.soft_reset = si_common_soft_reset,
2029	.set_clockgating_state = si_common_set_clockgating_state,
2030	.set_powergating_state = si_common_set_powergating_state,
2031};
2032
2033static const struct amdgpu_ip_block_version si_common_ip_block =
2034{
2035	.type = AMD_IP_BLOCK_TYPE_COMMON,
2036	.major = 1,
2037	.minor = 0,
2038	.rev = 0,
2039	.funcs = &si_common_ip_funcs,
2040};
2041
2042int si_set_ip_blocks(struct amdgpu_device *adev)
2043{
2044	si_detect_hw_virtualization(adev);
2045
2046	switch (adev->asic_type) {
2047	case CHIP_VERDE:
2048	case CHIP_TAHITI:
2049	case CHIP_PITCAIRN:
2050		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2051		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2052		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
 
 
2053		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2054		if (adev->enable_virtual_display)
2055			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
 
 
 
 
2056		else
2057			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2058		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2059		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2060		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2061		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2062		break;
2063	case CHIP_OLAND:
2064		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2065		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2066		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
 
 
2067		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2068		if (adev->enable_virtual_display)
2069			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
 
 
 
 
2070		else
2071			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2072		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2073		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2074		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
2075		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2076		break;
2077	case CHIP_HAINAN:
2078		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2079		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2080		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
 
 
2081		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2082		if (adev->enable_virtual_display)
2083			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2084		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2085		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2086		break;
2087	default:
2088		BUG();
2089	}
2090	return 0;
2091}
2092
v5.14.15
   1/*
   2 * Copyright 2015 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 */
  23
  24#include <linux/firmware.h>
  25#include <linux/slab.h>
  26#include <linux/module.h>
  27#include <linux/pci.h>
  28
  29#include <drm/amdgpu_drm.h>
  30
  31#include "amdgpu.h"
  32#include "amdgpu_atombios.h"
  33#include "amdgpu_ih.h"
  34#include "amdgpu_uvd.h"
  35#include "amdgpu_vce.h"
  36#include "atom.h"
  37#include "amd_pcie.h"
  38#include "si_dpm.h"
  39#include "sid.h"
  40#include "si_ih.h"
  41#include "gfx_v6_0.h"
  42#include "gmc_v6_0.h"
  43#include "si_dma.h"
  44#include "dce_v6_0.h"
  45#include "si.h"
  46#include "uvd_v3_1.h"
  47#include "dce_virtual.h"
  48#include "gca/gfx_6_0_d.h"
  49#include "oss/oss_1_0_d.h"
  50#include "oss/oss_1_0_sh_mask.h"
  51#include "gmc/gmc_6_0_d.h"
  52#include "dce/dce_6_0_d.h"
  53#include "uvd/uvd_4_0_d.h"
  54#include "bif/bif_3_0_d.h"
  55#include "bif/bif_3_0_sh_mask.h"
  56
  57#include "amdgpu_dm.h"
  58
  59static const u32 tahiti_golden_registers[] =
  60{
  61	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
  62	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
  63	mmDB_DEBUG, 0xffffffff, 0x00000000,
  64	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
  65	mmDB_DEBUG3, 0x0002021c, 0x00020200,
  66	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
  67	0x340c, 0x000000c0, 0x00800040,
  68	0x360c, 0x000000c0, 0x00800040,
  69	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
  70	mmFBC_MISC, 0x00200000, 0x50100000,
  71	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
  72	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
  73	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
  74	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
  75	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
  76	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
  77	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
  78	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
  79	0x000c, 0xffffffff, 0x0040,
  80	0x000d, 0x00000040, 0x00004040,
  81	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
  82	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
  83	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
  84	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
  85	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
  86	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
  87	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
  88	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
  89	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
  90	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
  91	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
  92	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
  93	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
  94	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  95	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  96	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
  97};
  98
  99static const u32 tahiti_golden_registers2[] =
 100{
 101	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
 102};
 103
 104static const u32 tahiti_golden_rlc_registers[] =
 105{
 106	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
 107	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 108	0x311f, 0xffffffff, 0x10104040,
 109	0x3122, 0xffffffff, 0x0100000a,
 110	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 111	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 112	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
 113};
 114
 115static const u32 pitcairn_golden_registers[] =
 116{
 117	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 118	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 119	mmDB_DEBUG, 0xffffffff, 0x00000000,
 120	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 121	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 122	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 123	0x340c, 0x000300c0, 0x00800040,
 124	0x360c, 0x000300c0, 0x00800040,
 125	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 126	mmFBC_MISC, 0x00200000, 0x50100000,
 127	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 128	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 129	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 130	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 131	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 132	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 133	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 134	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
 135	0x000c, 0xffffffff, 0x0040,
 136	0x000d, 0x00000040, 0x00004040,
 137	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 138	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 139	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 140	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
 141	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 142	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
 143	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 144	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 145	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 146	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 147	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 148	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 149};
 150
 151static const u32 pitcairn_golden_rlc_registers[] =
 152{
 153	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
 154	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
 155	0x311f, 0xffffffff, 0x10102020,
 156	0x3122, 0xffffffff, 0x01000020,
 157	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 158	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
 159};
 160
 161static const u32 verde_pg_init[] =
 162{
 163	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
 164	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
 165	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 166	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 167	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 168	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 169	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 170	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
 171	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
 172	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 173	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 174	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 175	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 176	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 177	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
 178	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
 179	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 180	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 181	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 182	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 183	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 184	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
 185	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
 186	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 187	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 188	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 189	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 190	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 191	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
 192	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
 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_WRITE, 0xffffffff, 0x0,
 198	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
 199	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
 200	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 201	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 202	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 203	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 204	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 205	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
 206	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
 207	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
 208	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
 209	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 210	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
 211	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
 212	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
 213	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 214	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
 215	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
 216	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
 217	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
 218	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
 219	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
 220	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
 221	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
 222	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
 223	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
 224	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
 225	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
 226	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
 227	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
 228	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
 229	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
 230	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
 231	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
 232	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
 233	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
 234	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
 235	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
 236	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
 237	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
 238	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
 239	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
 240	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
 241	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
 242	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
 243	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
 244	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
 245	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
 246	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
 247	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
 248	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
 249	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
 250	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
 251	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
 252	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
 253	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
 254	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
 255	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
 256	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
 257	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
 258	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
 259	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
 260	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
 261	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
 262	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
 263	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
 264	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
 265	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
 266	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
 267	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
 268	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
 269	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
 270	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
 271	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
 272	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
 273	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
 274	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
 275	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
 276	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
 277	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
 278	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
 279	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
 280	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
 281	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
 282	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
 283	mmGMCON_MISC2, 0xfc00, 0x2000,
 284	mmGMCON_MISC3, 0xffffffff, 0xfc0,
 285	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
 286};
 287
 288static const u32 verde_golden_rlc_registers[] =
 289{
 290	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 291	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
 292	0x311f, 0xffffffff, 0x10808020,
 293	0x3122, 0xffffffff, 0x00800008,
 294	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
 295	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
 296};
 297
 298static const u32 verde_golden_registers[] =
 299{
 300	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 301	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 302	mmDB_DEBUG, 0xffffffff, 0x00000000,
 303	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 304	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 305	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 306	0x340c, 0x000300c0, 0x00800040,
 307	0x360c, 0x000300c0, 0x00800040,
 308	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 309	mmFBC_MISC, 0x00200000, 0x50100000,
 310	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 311	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 312	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 313	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 314	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 315	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 316	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 317	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
 318	0x000c, 0xffffffff, 0x0040,
 319	0x000d, 0x00000040, 0x00004040,
 320	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 321	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
 322	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
 323	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 324	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 325	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
 326	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 327	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
 328	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 329	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 330	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 331	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 332	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 333	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 334};
 335
 336static const u32 oland_golden_registers[] =
 337{
 338	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
 339	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 340	mmDB_DEBUG, 0xffffffff, 0x00000000,
 341	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 342	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 343	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
 344	0x340c, 0x000300c0, 0x00800040,
 345	0x360c, 0x000300c0, 0x00800040,
 346	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
 347	mmFBC_MISC, 0x00200000, 0x50100000,
 348	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
 349	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 350	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 351	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 352	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 353	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 354	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 355	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
 356	0x000c, 0xffffffff, 0x0040,
 357	0x000d, 0x00000040, 0x00004040,
 358	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
 359	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 360	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 361	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
 362	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 363	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 364	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 365	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 366	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 367	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 368	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 369	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 370
 371};
 372
 373static const u32 oland_golden_rlc_registers[] =
 374{
 375	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
 376	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
 377	0x311f, 0xffffffff, 0x10104040,
 378	0x3122, 0xffffffff, 0x0100000a,
 379	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
 380	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
 381};
 382
 383static const u32 hainan_golden_registers[] =
 384{
 385	0x17bc, 0x00000030, 0x00000011,
 386	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
 387	mmDB_DEBUG, 0xffffffff, 0x00000000,
 388	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
 389	mmDB_DEBUG3, 0x0002021c, 0x00020200,
 390	0x031e, 0x00000080, 0x00000000,
 391	0x3430, 0xff000fff, 0x00000100,
 392	0x340c, 0x000300c0, 0x00800040,
 393	0x3630, 0xff000fff, 0x00000100,
 394	0x360c, 0x000300c0, 0x00800040,
 395	0x16ec, 0x000000f0, 0x00000070,
 396	0x16f0, 0x00200000, 0x50100000,
 397	0x1c0c, 0x31000311, 0x00000011,
 398	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
 399	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
 400	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
 401	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
 402	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
 403	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
 404	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
 405	0x000c, 0xffffffff, 0x0040,
 406	0x000d, 0x00000040, 0x00004040,
 407	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
 408	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
 409	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
 410	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
 411	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
 412	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
 413	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
 414	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
 415	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
 416	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 417	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 418	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
 419};
 420
 421static const u32 hainan_golden_registers2[] =
 422{
 423	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
 424};
 425
 426static const u32 tahiti_mgcg_cgcg_init[] =
 427{
 428	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 429	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 430	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 431	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 432	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 433	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 434	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 435	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 436	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 437	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 438	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 439	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 440	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 441	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 442	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 443	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 444	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 445	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 446	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 447	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 448	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 449	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 450	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 451	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 452	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 453	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 454	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 455	0x2458, 0xffffffff, 0x00010000,
 456	0x2459, 0xffffffff, 0x00030002,
 457	0x245a, 0xffffffff, 0x00040007,
 458	0x245b, 0xffffffff, 0x00060005,
 459	0x245c, 0xffffffff, 0x00090008,
 460	0x245d, 0xffffffff, 0x00020001,
 461	0x245e, 0xffffffff, 0x00040003,
 462	0x245f, 0xffffffff, 0x00000007,
 463	0x2460, 0xffffffff, 0x00060005,
 464	0x2461, 0xffffffff, 0x00090008,
 465	0x2462, 0xffffffff, 0x00030002,
 466	0x2463, 0xffffffff, 0x00050004,
 467	0x2464, 0xffffffff, 0x00000008,
 468	0x2465, 0xffffffff, 0x00070006,
 469	0x2466, 0xffffffff, 0x000a0009,
 470	0x2467, 0xffffffff, 0x00040003,
 471	0x2468, 0xffffffff, 0x00060005,
 472	0x2469, 0xffffffff, 0x00000009,
 473	0x246a, 0xffffffff, 0x00080007,
 474	0x246b, 0xffffffff, 0x000b000a,
 475	0x246c, 0xffffffff, 0x00050004,
 476	0x246d, 0xffffffff, 0x00070006,
 477	0x246e, 0xffffffff, 0x0008000b,
 478	0x246f, 0xffffffff, 0x000a0009,
 479	0x2470, 0xffffffff, 0x000d000c,
 480	0x2471, 0xffffffff, 0x00060005,
 481	0x2472, 0xffffffff, 0x00080007,
 482	0x2473, 0xffffffff, 0x0000000b,
 483	0x2474, 0xffffffff, 0x000a0009,
 484	0x2475, 0xffffffff, 0x000d000c,
 485	0x2476, 0xffffffff, 0x00070006,
 486	0x2477, 0xffffffff, 0x00090008,
 487	0x2478, 0xffffffff, 0x0000000c,
 488	0x2479, 0xffffffff, 0x000b000a,
 489	0x247a, 0xffffffff, 0x000e000d,
 490	0x247b, 0xffffffff, 0x00080007,
 491	0x247c, 0xffffffff, 0x000a0009,
 492	0x247d, 0xffffffff, 0x0000000d,
 493	0x247e, 0xffffffff, 0x000c000b,
 494	0x247f, 0xffffffff, 0x000f000e,
 495	0x2480, 0xffffffff, 0x00090008,
 496	0x2481, 0xffffffff, 0x000b000a,
 497	0x2482, 0xffffffff, 0x000c000f,
 498	0x2483, 0xffffffff, 0x000e000d,
 499	0x2484, 0xffffffff, 0x00110010,
 500	0x2485, 0xffffffff, 0x000a0009,
 501	0x2486, 0xffffffff, 0x000c000b,
 502	0x2487, 0xffffffff, 0x0000000f,
 503	0x2488, 0xffffffff, 0x000e000d,
 504	0x2489, 0xffffffff, 0x00110010,
 505	0x248a, 0xffffffff, 0x000b000a,
 506	0x248b, 0xffffffff, 0x000d000c,
 507	0x248c, 0xffffffff, 0x00000010,
 508	0x248d, 0xffffffff, 0x000f000e,
 509	0x248e, 0xffffffff, 0x00120011,
 510	0x248f, 0xffffffff, 0x000c000b,
 511	0x2490, 0xffffffff, 0x000e000d,
 512	0x2491, 0xffffffff, 0x00000011,
 513	0x2492, 0xffffffff, 0x0010000f,
 514	0x2493, 0xffffffff, 0x00130012,
 515	0x2494, 0xffffffff, 0x000d000c,
 516	0x2495, 0xffffffff, 0x000f000e,
 517	0x2496, 0xffffffff, 0x00100013,
 518	0x2497, 0xffffffff, 0x00120011,
 519	0x2498, 0xffffffff, 0x00150014,
 520	0x2499, 0xffffffff, 0x000e000d,
 521	0x249a, 0xffffffff, 0x0010000f,
 522	0x249b, 0xffffffff, 0x00000013,
 523	0x249c, 0xffffffff, 0x00120011,
 524	0x249d, 0xffffffff, 0x00150014,
 525	0x249e, 0xffffffff, 0x000f000e,
 526	0x249f, 0xffffffff, 0x00110010,
 527	0x24a0, 0xffffffff, 0x00000014,
 528	0x24a1, 0xffffffff, 0x00130012,
 529	0x24a2, 0xffffffff, 0x00160015,
 530	0x24a3, 0xffffffff, 0x0010000f,
 531	0x24a4, 0xffffffff, 0x00120011,
 532	0x24a5, 0xffffffff, 0x00000015,
 533	0x24a6, 0xffffffff, 0x00140013,
 534	0x24a7, 0xffffffff, 0x00170016,
 535	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 536	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 537	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 538	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 539	0x000c, 0xffffffff, 0x0000001c,
 540	0x000d, 0x000f0000, 0x000f0000,
 541	0x0583, 0xffffffff, 0x00000100,
 542	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 543	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 544	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 545	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 546	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 547	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 548	0x157a, 0x00000001, 0x00000001,
 549	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 550	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 551	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 552	0x3430, 0xfffffff0, 0x00000100,
 553	0x3630, 0xfffffff0, 0x00000100,
 554};
 555static const u32 pitcairn_mgcg_cgcg_init[] =
 556{
 557	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 558	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 559	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 560	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 561	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 562	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 563	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 564	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 565	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 566	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 567	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 568	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 569	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 570	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 571	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 572	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 573	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 574	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 575	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 576	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 577	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 578	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 579	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 580	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 581	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 582	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 583	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 584	0x2458, 0xffffffff, 0x00010000,
 585	0x2459, 0xffffffff, 0x00030002,
 586	0x245a, 0xffffffff, 0x00040007,
 587	0x245b, 0xffffffff, 0x00060005,
 588	0x245c, 0xffffffff, 0x00090008,
 589	0x245d, 0xffffffff, 0x00020001,
 590	0x245e, 0xffffffff, 0x00040003,
 591	0x245f, 0xffffffff, 0x00000007,
 592	0x2460, 0xffffffff, 0x00060005,
 593	0x2461, 0xffffffff, 0x00090008,
 594	0x2462, 0xffffffff, 0x00030002,
 595	0x2463, 0xffffffff, 0x00050004,
 596	0x2464, 0xffffffff, 0x00000008,
 597	0x2465, 0xffffffff, 0x00070006,
 598	0x2466, 0xffffffff, 0x000a0009,
 599	0x2467, 0xffffffff, 0x00040003,
 600	0x2468, 0xffffffff, 0x00060005,
 601	0x2469, 0xffffffff, 0x00000009,
 602	0x246a, 0xffffffff, 0x00080007,
 603	0x246b, 0xffffffff, 0x000b000a,
 604	0x246c, 0xffffffff, 0x00050004,
 605	0x246d, 0xffffffff, 0x00070006,
 606	0x246e, 0xffffffff, 0x0008000b,
 607	0x246f, 0xffffffff, 0x000a0009,
 608	0x2470, 0xffffffff, 0x000d000c,
 609	0x2480, 0xffffffff, 0x00090008,
 610	0x2481, 0xffffffff, 0x000b000a,
 611	0x2482, 0xffffffff, 0x000c000f,
 612	0x2483, 0xffffffff, 0x000e000d,
 613	0x2484, 0xffffffff, 0x00110010,
 614	0x2485, 0xffffffff, 0x000a0009,
 615	0x2486, 0xffffffff, 0x000c000b,
 616	0x2487, 0xffffffff, 0x0000000f,
 617	0x2488, 0xffffffff, 0x000e000d,
 618	0x2489, 0xffffffff, 0x00110010,
 619	0x248a, 0xffffffff, 0x000b000a,
 620	0x248b, 0xffffffff, 0x000d000c,
 621	0x248c, 0xffffffff, 0x00000010,
 622	0x248d, 0xffffffff, 0x000f000e,
 623	0x248e, 0xffffffff, 0x00120011,
 624	0x248f, 0xffffffff, 0x000c000b,
 625	0x2490, 0xffffffff, 0x000e000d,
 626	0x2491, 0xffffffff, 0x00000011,
 627	0x2492, 0xffffffff, 0x0010000f,
 628	0x2493, 0xffffffff, 0x00130012,
 629	0x2494, 0xffffffff, 0x000d000c,
 630	0x2495, 0xffffffff, 0x000f000e,
 631	0x2496, 0xffffffff, 0x00100013,
 632	0x2497, 0xffffffff, 0x00120011,
 633	0x2498, 0xffffffff, 0x00150014,
 634	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 635	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 636	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 637	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 638	0x000c, 0xffffffff, 0x0000001c,
 639	0x000d, 0x000f0000, 0x000f0000,
 640	0x0583, 0xffffffff, 0x00000100,
 641	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 642	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 643	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 644	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 645	0x157a, 0x00000001, 0x00000001,
 646	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 647	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 648	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 649	0x3430, 0xfffffff0, 0x00000100,
 650	0x3630, 0xfffffff0, 0x00000100,
 651};
 652
 653static const u32 verde_mgcg_cgcg_init[] =
 654{
 655	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 656	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 657	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 658	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 659	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 660	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 661	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 662	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 663	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 664	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 665	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 666	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 667	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 668	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 669	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 670	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 671	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 672	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 673	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 674	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 675	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 676	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 677	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 678	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 679	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 680	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 681	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 682	0x2458, 0xffffffff, 0x00010000,
 683	0x2459, 0xffffffff, 0x00030002,
 684	0x245a, 0xffffffff, 0x00040007,
 685	0x245b, 0xffffffff, 0x00060005,
 686	0x245c, 0xffffffff, 0x00090008,
 687	0x245d, 0xffffffff, 0x00020001,
 688	0x245e, 0xffffffff, 0x00040003,
 689	0x245f, 0xffffffff, 0x00000007,
 690	0x2460, 0xffffffff, 0x00060005,
 691	0x2461, 0xffffffff, 0x00090008,
 692	0x2462, 0xffffffff, 0x00030002,
 693	0x2463, 0xffffffff, 0x00050004,
 694	0x2464, 0xffffffff, 0x00000008,
 695	0x2465, 0xffffffff, 0x00070006,
 696	0x2466, 0xffffffff, 0x000a0009,
 697	0x2467, 0xffffffff, 0x00040003,
 698	0x2468, 0xffffffff, 0x00060005,
 699	0x2469, 0xffffffff, 0x00000009,
 700	0x246a, 0xffffffff, 0x00080007,
 701	0x246b, 0xffffffff, 0x000b000a,
 702	0x246c, 0xffffffff, 0x00050004,
 703	0x246d, 0xffffffff, 0x00070006,
 704	0x246e, 0xffffffff, 0x0008000b,
 705	0x246f, 0xffffffff, 0x000a0009,
 706	0x2470, 0xffffffff, 0x000d000c,
 707	0x2480, 0xffffffff, 0x00090008,
 708	0x2481, 0xffffffff, 0x000b000a,
 709	0x2482, 0xffffffff, 0x000c000f,
 710	0x2483, 0xffffffff, 0x000e000d,
 711	0x2484, 0xffffffff, 0x00110010,
 712	0x2485, 0xffffffff, 0x000a0009,
 713	0x2486, 0xffffffff, 0x000c000b,
 714	0x2487, 0xffffffff, 0x0000000f,
 715	0x2488, 0xffffffff, 0x000e000d,
 716	0x2489, 0xffffffff, 0x00110010,
 717	0x248a, 0xffffffff, 0x000b000a,
 718	0x248b, 0xffffffff, 0x000d000c,
 719	0x248c, 0xffffffff, 0x00000010,
 720	0x248d, 0xffffffff, 0x000f000e,
 721	0x248e, 0xffffffff, 0x00120011,
 722	0x248f, 0xffffffff, 0x000c000b,
 723	0x2490, 0xffffffff, 0x000e000d,
 724	0x2491, 0xffffffff, 0x00000011,
 725	0x2492, 0xffffffff, 0x0010000f,
 726	0x2493, 0xffffffff, 0x00130012,
 727	0x2494, 0xffffffff, 0x000d000c,
 728	0x2495, 0xffffffff, 0x000f000e,
 729	0x2496, 0xffffffff, 0x00100013,
 730	0x2497, 0xffffffff, 0x00120011,
 731	0x2498, 0xffffffff, 0x00150014,
 732	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 733	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 734	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 735	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 736	0x000c, 0xffffffff, 0x0000001c,
 737	0x000d, 0x000f0000, 0x000f0000,
 738	0x0583, 0xffffffff, 0x00000100,
 739	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 740	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 741	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 742	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 743	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 744	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 745	0x157a, 0x00000001, 0x00000001,
 746	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 747	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 748	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 749	0x3430, 0xfffffff0, 0x00000100,
 750	0x3630, 0xfffffff0, 0x00000100,
 751};
 752
 753static const u32 oland_mgcg_cgcg_init[] =
 754{
 755	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 756	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 757	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 758	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 759	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 760	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 761	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 762	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 763	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 764	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 765	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 766	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 767	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 768	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 769	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 770	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 771	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 772	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 773	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 774	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 775	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 776	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 777	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 778	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 779	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 780	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 781	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 782	0x2458, 0xffffffff, 0x00010000,
 783	0x2459, 0xffffffff, 0x00030002,
 784	0x245a, 0xffffffff, 0x00040007,
 785	0x245b, 0xffffffff, 0x00060005,
 786	0x245c, 0xffffffff, 0x00090008,
 787	0x245d, 0xffffffff, 0x00020001,
 788	0x245e, 0xffffffff, 0x00040003,
 789	0x245f, 0xffffffff, 0x00000007,
 790	0x2460, 0xffffffff, 0x00060005,
 791	0x2461, 0xffffffff, 0x00090008,
 792	0x2462, 0xffffffff, 0x00030002,
 793	0x2463, 0xffffffff, 0x00050004,
 794	0x2464, 0xffffffff, 0x00000008,
 795	0x2465, 0xffffffff, 0x00070006,
 796	0x2466, 0xffffffff, 0x000a0009,
 797	0x2467, 0xffffffff, 0x00040003,
 798	0x2468, 0xffffffff, 0x00060005,
 799	0x2469, 0xffffffff, 0x00000009,
 800	0x246a, 0xffffffff, 0x00080007,
 801	0x246b, 0xffffffff, 0x000b000a,
 802	0x246c, 0xffffffff, 0x00050004,
 803	0x246d, 0xffffffff, 0x00070006,
 804	0x246e, 0xffffffff, 0x0008000b,
 805	0x246f, 0xffffffff, 0x000a0009,
 806	0x2470, 0xffffffff, 0x000d000c,
 807	0x2471, 0xffffffff, 0x00060005,
 808	0x2472, 0xffffffff, 0x00080007,
 809	0x2473, 0xffffffff, 0x0000000b,
 810	0x2474, 0xffffffff, 0x000a0009,
 811	0x2475, 0xffffffff, 0x000d000c,
 812	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 813	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 814	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 815	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 816	0x000c, 0xffffffff, 0x0000001c,
 817	0x000d, 0x000f0000, 0x000f0000,
 818	0x0583, 0xffffffff, 0x00000100,
 819	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
 820	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
 821	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 822	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 823	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 824	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
 825	0x157a, 0x00000001, 0x00000001,
 826	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 827	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 828	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 829	0x3430, 0xfffffff0, 0x00000100,
 830	0x3630, 0xfffffff0, 0x00000100,
 831};
 832
 833static const u32 hainan_mgcg_cgcg_init[] =
 834{
 835	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
 836	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 837	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 838	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
 839	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
 840	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
 841	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
 842	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
 843	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
 844	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
 845	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
 846	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
 847	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
 848	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
 849	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
 850	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
 851	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
 852	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
 853	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
 854	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
 855	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
 856	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
 857	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
 858	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 859	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
 860	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
 861	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
 862	0x2458, 0xffffffff, 0x00010000,
 863	0x2459, 0xffffffff, 0x00030002,
 864	0x245a, 0xffffffff, 0x00040007,
 865	0x245b, 0xffffffff, 0x00060005,
 866	0x245c, 0xffffffff, 0x00090008,
 867	0x245d, 0xffffffff, 0x00020001,
 868	0x245e, 0xffffffff, 0x00040003,
 869	0x245f, 0xffffffff, 0x00000007,
 870	0x2460, 0xffffffff, 0x00060005,
 871	0x2461, 0xffffffff, 0x00090008,
 872	0x2462, 0xffffffff, 0x00030002,
 873	0x2463, 0xffffffff, 0x00050004,
 874	0x2464, 0xffffffff, 0x00000008,
 875	0x2465, 0xffffffff, 0x00070006,
 876	0x2466, 0xffffffff, 0x000a0009,
 877	0x2467, 0xffffffff, 0x00040003,
 878	0x2468, 0xffffffff, 0x00060005,
 879	0x2469, 0xffffffff, 0x00000009,
 880	0x246a, 0xffffffff, 0x00080007,
 881	0x246b, 0xffffffff, 0x000b000a,
 882	0x246c, 0xffffffff, 0x00050004,
 883	0x246d, 0xffffffff, 0x00070006,
 884	0x246e, 0xffffffff, 0x0008000b,
 885	0x246f, 0xffffffff, 0x000a0009,
 886	0x2470, 0xffffffff, 0x000d000c,
 887	0x2471, 0xffffffff, 0x00060005,
 888	0x2472, 0xffffffff, 0x00080007,
 889	0x2473, 0xffffffff, 0x0000000b,
 890	0x2474, 0xffffffff, 0x000a0009,
 891	0x2475, 0xffffffff, 0x000d000c,
 892	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
 893	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
 894	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
 895	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
 896	0x000c, 0xffffffff, 0x0000001c,
 897	0x000d, 0x000f0000, 0x000f0000,
 898	0x0583, 0xffffffff, 0x00000100,
 899	0x0409, 0xffffffff, 0x00000100,
 900	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
 901	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
 902	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
 903	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
 904	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
 905	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 906	0x3430, 0xfffffff0, 0x00000100,
 907	0x3630, 0xfffffff0, 0x00000100,
 908};
 909
 910/* XXX: update when we support VCE */
 911#if 0
 912/* tahiti, pitcarin, verde */
 913static const struct amdgpu_video_codec_info tahiti_video_codecs_encode_array[] =
 914{
 915	{
 916		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
 917		.max_width = 2048,
 918		.max_height = 1152,
 919		.max_pixels_per_frame = 2048 * 1152,
 920		.max_level = 0,
 921	},
 922};
 923
 924static const struct amdgpu_video_codecs tahiti_video_codecs_encode =
 925{
 926	.codec_count = ARRAY_SIZE(tahiti_video_codecs_encode_array),
 927	.codec_array = tahiti_video_codecs_encode_array,
 928};
 929#else
 930static const struct amdgpu_video_codecs tahiti_video_codecs_encode =
 931{
 932	.codec_count = 0,
 933	.codec_array = NULL,
 934};
 935#endif
 936/* oland and hainan don't support encode */
 937static const struct amdgpu_video_codecs hainan_video_codecs_encode =
 938{
 939	.codec_count = 0,
 940	.codec_array = NULL,
 941};
 942
 943/* tahiti, pitcarin, verde, oland */
 944static const struct amdgpu_video_codec_info tahiti_video_codecs_decode_array[] =
 945{
 946	{
 947		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
 948		.max_width = 2048,
 949		.max_height = 1152,
 950		.max_pixels_per_frame = 2048 * 1152,
 951		.max_level = 3,
 952	},
 953	{
 954		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
 955		.max_width = 2048,
 956		.max_height = 1152,
 957		.max_pixels_per_frame = 2048 * 1152,
 958		.max_level = 5,
 959	},
 960	{
 961		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
 962		.max_width = 2048,
 963		.max_height = 1152,
 964		.max_pixels_per_frame = 2048 * 1152,
 965		.max_level = 41,
 966	},
 967	{
 968		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
 969		.max_width = 2048,
 970		.max_height = 1152,
 971		.max_pixels_per_frame = 2048 * 1152,
 972		.max_level = 4,
 973	},
 974};
 975
 976static const struct amdgpu_video_codecs tahiti_video_codecs_decode =
 977{
 978	.codec_count = ARRAY_SIZE(tahiti_video_codecs_decode_array),
 979	.codec_array = tahiti_video_codecs_decode_array,
 980};
 981
 982/* hainan doesn't support decode */
 983static const struct amdgpu_video_codecs hainan_video_codecs_decode =
 984{
 985	.codec_count = 0,
 986	.codec_array = NULL,
 987};
 988
 989static int si_query_video_codecs(struct amdgpu_device *adev, bool encode,
 990				 const struct amdgpu_video_codecs **codecs)
 991{
 992	switch (adev->asic_type) {
 993	case CHIP_VERDE:
 994	case CHIP_TAHITI:
 995	case CHIP_PITCAIRN:
 996		if (encode)
 997			*codecs = &tahiti_video_codecs_encode;
 998		else
 999			*codecs = &tahiti_video_codecs_decode;
1000		return 0;
1001	case CHIP_OLAND:
1002		if (encode)
1003			*codecs = &hainan_video_codecs_encode;
1004		else
1005			*codecs = &tahiti_video_codecs_decode;
1006		return 0;
1007	case CHIP_HAINAN:
1008		if (encode)
1009			*codecs = &hainan_video_codecs_encode;
1010		else
1011			*codecs = &hainan_video_codecs_decode;
1012		return 0;
1013	default:
1014		return -EINVAL;
1015	}
1016}
1017
1018static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
1019{
1020	unsigned long flags;
1021	u32 r;
1022
1023	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1024	WREG32(AMDGPU_PCIE_INDEX, reg);
1025	(void)RREG32(AMDGPU_PCIE_INDEX);
1026	r = RREG32(AMDGPU_PCIE_DATA);
1027	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1028	return r;
1029}
1030
1031static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1032{
1033	unsigned long flags;
1034
1035	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1036	WREG32(AMDGPU_PCIE_INDEX, reg);
1037	(void)RREG32(AMDGPU_PCIE_INDEX);
1038	WREG32(AMDGPU_PCIE_DATA, v);
1039	(void)RREG32(AMDGPU_PCIE_DATA);
1040	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1041}
1042
1043static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
1044{
1045	unsigned long flags;
1046	u32 r;
1047
1048	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1049	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
1050	(void)RREG32(PCIE_PORT_INDEX);
1051	r = RREG32(PCIE_PORT_DATA);
1052	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1053	return r;
1054}
1055
1056static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1057{
1058	unsigned long flags;
1059
1060	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1061	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
1062	(void)RREG32(PCIE_PORT_INDEX);
1063	WREG32(PCIE_PORT_DATA, (v));
1064	(void)RREG32(PCIE_PORT_DATA);
1065	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1066}
1067
1068static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
1069{
1070	unsigned long flags;
1071	u32 r;
1072
1073	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1074	WREG32(SMC_IND_INDEX_0, (reg));
1075	r = RREG32(SMC_IND_DATA_0);
1076	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1077	return r;
1078}
1079
1080static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1081{
1082	unsigned long flags;
1083
1084	spin_lock_irqsave(&adev->smc_idx_lock, flags);
1085	WREG32(SMC_IND_INDEX_0, (reg));
1086	WREG32(SMC_IND_DATA_0, (v));
1087	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1088}
1089
1090static u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
1091{
1092	unsigned long flags;
1093	u32 r;
1094
1095	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
1096	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
1097	r = RREG32(mmUVD_CTX_DATA);
1098	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1099	return r;
1100}
1101
1102static void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1103{
1104	unsigned long flags;
1105
1106	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
1107	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
1108	WREG32(mmUVD_CTX_DATA, (v));
1109	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1110}
1111
1112static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
1113	{GRBM_STATUS},
1114	{mmGRBM_STATUS2},
1115	{mmGRBM_STATUS_SE0},
1116	{mmGRBM_STATUS_SE1},
1117	{mmSRBM_STATUS},
1118	{mmSRBM_STATUS2},
1119	{DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
1120	{DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
1121	{mmCP_STAT},
1122	{mmCP_STALLED_STAT1},
1123	{mmCP_STALLED_STAT2},
1124	{mmCP_STALLED_STAT3},
1125	{GB_ADDR_CONFIG},
1126	{MC_ARB_RAMCFG},
1127	{GB_TILE_MODE0},
1128	{GB_TILE_MODE1},
1129	{GB_TILE_MODE2},
1130	{GB_TILE_MODE3},
1131	{GB_TILE_MODE4},
1132	{GB_TILE_MODE5},
1133	{GB_TILE_MODE6},
1134	{GB_TILE_MODE7},
1135	{GB_TILE_MODE8},
1136	{GB_TILE_MODE9},
1137	{GB_TILE_MODE10},
1138	{GB_TILE_MODE11},
1139	{GB_TILE_MODE12},
1140	{GB_TILE_MODE13},
1141	{GB_TILE_MODE14},
1142	{GB_TILE_MODE15},
1143	{GB_TILE_MODE16},
1144	{GB_TILE_MODE17},
1145	{GB_TILE_MODE18},
1146	{GB_TILE_MODE19},
1147	{GB_TILE_MODE20},
1148	{GB_TILE_MODE21},
1149	{GB_TILE_MODE22},
1150	{GB_TILE_MODE23},
1151	{GB_TILE_MODE24},
1152	{GB_TILE_MODE25},
1153	{GB_TILE_MODE26},
1154	{GB_TILE_MODE27},
1155	{GB_TILE_MODE28},
1156	{GB_TILE_MODE29},
1157	{GB_TILE_MODE30},
1158	{GB_TILE_MODE31},
1159	{CC_RB_BACKEND_DISABLE, true},
1160	{GC_USER_RB_BACKEND_DISABLE, true},
1161	{PA_SC_RASTER_CONFIG, true},
1162};
1163
1164static uint32_t si_get_register_value(struct amdgpu_device *adev,
1165				      bool indexed, u32 se_num,
1166				      u32 sh_num, u32 reg_offset)
1167{
1168	if (indexed) {
1169		uint32_t val;
1170		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1171		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1172
1173		switch (reg_offset) {
1174		case mmCC_RB_BACKEND_DISABLE:
1175			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1176		case mmGC_USER_RB_BACKEND_DISABLE:
1177			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1178		case mmPA_SC_RASTER_CONFIG:
1179			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1180		}
1181
1182		mutex_lock(&adev->grbm_idx_mutex);
1183		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1184			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1185
1186		val = RREG32(reg_offset);
1187
1188		if (se_num != 0xffffffff || sh_num != 0xffffffff)
1189			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1190		mutex_unlock(&adev->grbm_idx_mutex);
1191		return val;
1192	} else {
1193		unsigned idx;
1194
1195		switch (reg_offset) {
1196		case mmGB_ADDR_CONFIG:
1197			return adev->gfx.config.gb_addr_config;
1198		case mmMC_ARB_RAMCFG:
1199			return adev->gfx.config.mc_arb_ramcfg;
1200		case mmGB_TILE_MODE0:
1201		case mmGB_TILE_MODE1:
1202		case mmGB_TILE_MODE2:
1203		case mmGB_TILE_MODE3:
1204		case mmGB_TILE_MODE4:
1205		case mmGB_TILE_MODE5:
1206		case mmGB_TILE_MODE6:
1207		case mmGB_TILE_MODE7:
1208		case mmGB_TILE_MODE8:
1209		case mmGB_TILE_MODE9:
1210		case mmGB_TILE_MODE10:
1211		case mmGB_TILE_MODE11:
1212		case mmGB_TILE_MODE12:
1213		case mmGB_TILE_MODE13:
1214		case mmGB_TILE_MODE14:
1215		case mmGB_TILE_MODE15:
1216		case mmGB_TILE_MODE16:
1217		case mmGB_TILE_MODE17:
1218		case mmGB_TILE_MODE18:
1219		case mmGB_TILE_MODE19:
1220		case mmGB_TILE_MODE20:
1221		case mmGB_TILE_MODE21:
1222		case mmGB_TILE_MODE22:
1223		case mmGB_TILE_MODE23:
1224		case mmGB_TILE_MODE24:
1225		case mmGB_TILE_MODE25:
1226		case mmGB_TILE_MODE26:
1227		case mmGB_TILE_MODE27:
1228		case mmGB_TILE_MODE28:
1229		case mmGB_TILE_MODE29:
1230		case mmGB_TILE_MODE30:
1231		case mmGB_TILE_MODE31:
1232			idx = (reg_offset - mmGB_TILE_MODE0);
1233			return adev->gfx.config.tile_mode_array[idx];
1234		default:
1235			return RREG32(reg_offset);
1236		}
1237	}
1238}
1239static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1240			     u32 sh_num, u32 reg_offset, u32 *value)
1241{
1242	uint32_t i;
1243
1244	*value = 0;
1245	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1246		bool indexed = si_allowed_read_registers[i].grbm_indexed;
1247
1248		if (reg_offset != si_allowed_read_registers[i].reg_offset)
1249			continue;
1250
1251		*value = si_get_register_value(adev, indexed, se_num, sh_num,
1252					       reg_offset);
1253		return 0;
1254	}
1255	return -EINVAL;
1256}
1257
1258static bool si_read_disabled_bios(struct amdgpu_device *adev)
1259{
1260	u32 bus_cntl;
1261	u32 d1vga_control = 0;
1262	u32 d2vga_control = 0;
1263	u32 vga_render_control = 0;
1264	u32 rom_cntl;
1265	bool r;
1266
1267	bus_cntl = RREG32(R600_BUS_CNTL);
1268	if (adev->mode_info.num_crtc) {
1269		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1270		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1271		vga_render_control = RREG32(VGA_RENDER_CONTROL);
1272	}
1273	rom_cntl = RREG32(R600_ROM_CNTL);
1274
1275	/* enable the rom */
1276	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1277	if (adev->mode_info.num_crtc) {
1278		/* Disable VGA mode */
1279		WREG32(AVIVO_D1VGA_CONTROL,
1280		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1281					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1282		WREG32(AVIVO_D2VGA_CONTROL,
1283		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1284					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1285		WREG32(VGA_RENDER_CONTROL,
1286		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1287	}
1288	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1289
1290	r = amdgpu_read_bios(adev);
1291
1292	/* restore regs */
1293	WREG32(R600_BUS_CNTL, bus_cntl);
1294	if (adev->mode_info.num_crtc) {
1295		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1296		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1297		WREG32(VGA_RENDER_CONTROL, vga_render_control);
1298	}
1299	WREG32(R600_ROM_CNTL, rom_cntl);
1300	return r;
1301}
1302
1303#define mmROM_INDEX 0x2A
1304#define mmROM_DATA  0x2B
1305
1306static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1307				  u8 *bios, u32 length_bytes)
1308{
1309	u32 *dw_ptr;
1310	u32 i, length_dw;
1311
1312	if (bios == NULL)
1313		return false;
1314	if (length_bytes == 0)
1315		return false;
1316	/* APU vbios image is part of sbios image */
1317	if (adev->flags & AMD_IS_APU)
1318		return false;
1319
1320	dw_ptr = (u32 *)bios;
1321	length_dw = ALIGN(length_bytes, 4) / 4;
1322	/* set rom index to 0 */
1323	WREG32(mmROM_INDEX, 0);
1324	for (i = 0; i < length_dw; i++)
1325		dw_ptr[i] = RREG32(mmROM_DATA);
1326
1327	return true;
1328}
1329
1330static void si_set_clk_bypass_mode(struct amdgpu_device *adev)
1331{
1332	u32 tmp, i;
1333
1334	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1335	tmp |= SPLL_BYPASS_EN;
1336	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1337
1338	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1339	tmp |= SPLL_CTLREQ_CHG;
1340	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1341
1342	for (i = 0; i < adev->usec_timeout; i++) {
1343		if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
1344			break;
1345		udelay(1);
1346	}
1347
1348	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1349	tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
1350	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1351
1352	tmp = RREG32(MPLL_CNTL_MODE);
1353	tmp &= ~MPLL_MCLK_SEL;
1354	WREG32(MPLL_CNTL_MODE, tmp);
1355}
1356
1357static void si_spll_powerdown(struct amdgpu_device *adev)
1358{
1359	u32 tmp;
1360
1361	tmp = RREG32(SPLL_CNTL_MODE);
1362	tmp |= SPLL_SW_DIR_CONTROL;
1363	WREG32(SPLL_CNTL_MODE, tmp);
1364
1365	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1366	tmp |= SPLL_RESET;
1367	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1368
1369	tmp = RREG32(CG_SPLL_FUNC_CNTL);
1370	tmp |= SPLL_SLEEP;
1371	WREG32(CG_SPLL_FUNC_CNTL, tmp);
1372
1373	tmp = RREG32(SPLL_CNTL_MODE);
1374	tmp &= ~SPLL_SW_DIR_CONTROL;
1375	WREG32(SPLL_CNTL_MODE, tmp);
1376}
1377
1378static int si_gpu_pci_config_reset(struct amdgpu_device *adev)
1379{
1380	u32 i;
1381	int r = -EINVAL;
1382
1383	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1384
1385	/* set mclk/sclk to bypass */
1386	si_set_clk_bypass_mode(adev);
1387	/* powerdown spll */
1388	si_spll_powerdown(adev);
1389	/* disable BM */
1390	pci_clear_master(adev->pdev);
1391	/* reset */
1392	amdgpu_device_pci_config_reset(adev);
1393
1394	udelay(100);
1395
1396	/* wait for asic to come out of reset */
1397	for (i = 0; i < adev->usec_timeout; i++) {
1398		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1399			/* enable BM */
1400			pci_set_master(adev->pdev);
1401			adev->has_hw_reset = true;
1402			r = 0;
1403			break;
1404		}
1405		udelay(1);
1406	}
1407	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1408
1409	return r;
1410}
1411
1412static bool si_asic_supports_baco(struct amdgpu_device *adev)
1413{
1414	return false;
1415}
1416
1417static enum amd_reset_method
1418si_asic_reset_method(struct amdgpu_device *adev)
1419{
1420	if (amdgpu_reset_method == AMD_RESET_METHOD_PCI)
1421		return amdgpu_reset_method;
1422	else if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
1423		 amdgpu_reset_method != -1)
1424		dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
1425			 amdgpu_reset_method);
1426
1427	return AMD_RESET_METHOD_LEGACY;
1428}
1429
1430static int si_asic_reset(struct amdgpu_device *adev)
1431{
1432	int r;
1433
1434	switch (si_asic_reset_method(adev)) {
1435	case AMD_RESET_METHOD_PCI:
1436		dev_info(adev->dev, "PCI reset\n");
1437		r = amdgpu_device_pci_reset(adev);
1438		break;
1439	default:
1440		dev_info(adev->dev, "PCI CONFIG reset\n");
1441		r = si_gpu_pci_config_reset(adev);
1442		break;
1443	}
1444
1445	return r;
1446}
1447
1448static u32 si_get_config_memsize(struct amdgpu_device *adev)
1449{
1450	return RREG32(mmCONFIG_MEMSIZE);
1451}
1452
1453static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1454{
1455	uint32_t temp;
1456
1457	temp = RREG32(CONFIG_CNTL);
1458	if (!state) {
1459		temp &= ~(1<<0);
1460		temp |= (1<<1);
1461	} else {
1462		temp &= ~(1<<1);
1463	}
1464	WREG32(CONFIG_CNTL, temp);
1465}
1466
1467static u32 si_get_xclk(struct amdgpu_device *adev)
1468{
1469	u32 reference_clock = adev->clock.spll.reference_freq;
1470	u32 tmp;
1471
1472	tmp = RREG32(CG_CLKPIN_CNTL_2);
1473	if (tmp & MUX_TCLK_TO_XCLK)
1474		return TCLK;
1475
1476	tmp = RREG32(CG_CLKPIN_CNTL);
1477	if (tmp & XTALIN_DIVIDE)
1478		return reference_clock / 4;
1479
1480	return reference_clock;
1481}
1482
 
 
 
 
 
 
 
 
 
 
 
 
1483static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1484{
1485	if (!ring || !ring->funcs->emit_wreg) {
1486		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1487		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1488	} else {
1489		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1490	}
1491}
1492
1493static void si_invalidate_hdp(struct amdgpu_device *adev,
1494			      struct amdgpu_ring *ring)
1495{
1496	if (!ring || !ring->funcs->emit_wreg) {
1497		WREG32(mmHDP_DEBUG0, 1);
1498		RREG32(mmHDP_DEBUG0);
1499	} else {
1500		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1501	}
1502}
1503
1504static bool si_need_full_reset(struct amdgpu_device *adev)
1505{
1506	/* change this when we support soft reset */
1507	return true;
1508}
1509
1510static bool si_need_reset_on_init(struct amdgpu_device *adev)
1511{
1512	return false;
1513}
1514
1515static int si_get_pcie_lanes(struct amdgpu_device *adev)
1516{
1517	u32 link_width_cntl;
1518
1519	if (adev->flags & AMD_IS_APU)
1520		return 0;
1521
1522	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1523
1524	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1525	case LC_LINK_WIDTH_X1:
1526		return 1;
1527	case LC_LINK_WIDTH_X2:
1528		return 2;
1529	case LC_LINK_WIDTH_X4:
1530		return 4;
1531	case LC_LINK_WIDTH_X8:
1532		return 8;
1533	case LC_LINK_WIDTH_X0:
1534	case LC_LINK_WIDTH_X16:
1535	default:
1536		return 16;
1537	}
1538}
1539
1540static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1541{
1542	u32 link_width_cntl, mask;
1543
1544	if (adev->flags & AMD_IS_APU)
1545		return;
1546
1547	switch (lanes) {
1548	case 0:
1549		mask = LC_LINK_WIDTH_X0;
1550		break;
1551	case 1:
1552		mask = LC_LINK_WIDTH_X1;
1553		break;
1554	case 2:
1555		mask = LC_LINK_WIDTH_X2;
1556		break;
1557	case 4:
1558		mask = LC_LINK_WIDTH_X4;
1559		break;
1560	case 8:
1561		mask = LC_LINK_WIDTH_X8;
1562		break;
1563	case 16:
1564		mask = LC_LINK_WIDTH_X16;
1565		break;
1566	default:
1567		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1568		return;
1569	}
1570
1571	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1572	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1573	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1574	link_width_cntl |= (LC_RECONFIG_NOW |
1575			    LC_RECONFIG_ARC_MISSING_ESCAPE);
1576
1577	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1578}
1579
1580static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1581			      uint64_t *count1)
1582{
1583	uint32_t perfctr = 0;
1584	uint64_t cnt0_of, cnt1_of;
1585	int tmp;
1586
1587	/* This reports 0 on APUs, so return to avoid writing/reading registers
1588	 * that may or may not be different from their GPU counterparts
1589	 */
1590	if (adev->flags & AMD_IS_APU)
1591		return;
1592
1593	/* Set the 2 events that we wish to watch, defined above */
1594	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1595	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1596	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1597
1598	/* Write to enable desired perf counters */
1599	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1600	/* Zero out and enable the perf counters
1601	 * Write 0x5:
1602	 * Bit 0 = Start all counters(1)
1603	 * Bit 2 = Global counter reset enable(1)
1604	 */
1605	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1606
1607	msleep(1000);
1608
1609	/* Load the shadow and disable the perf counters
1610	 * Write 0x2:
1611	 * Bit 0 = Stop counters(0)
1612	 * Bit 1 = Load the shadow counters(1)
1613	 */
1614	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1615
1616	/* Read register values to get any >32bit overflow */
1617	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1618	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1619	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1620
1621	/* Get the values and add the overflow */
1622	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1623	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1624}
1625
1626static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1627{
1628	uint64_t nak_r, nak_g;
1629
1630	/* Get the number of NAKs received and generated */
1631	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1632	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1633
1634	/* Add the total number of NAKs, i.e the number of replays */
1635	return (nak_r + nak_g);
1636}
1637
1638static int si_uvd_send_upll_ctlreq(struct amdgpu_device *adev,
1639				   unsigned cg_upll_func_cntl)
1640{
1641	unsigned i;
1642
1643	/* Make sure UPLL_CTLREQ is deasserted */
1644	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1645
1646	mdelay(10);
1647
1648	/* Assert UPLL_CTLREQ */
1649	WREG32_P(cg_upll_func_cntl, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1650
1651	/* Wait for CTLACK and CTLACK2 to get asserted */
1652	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1653		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1654
1655		if ((RREG32(cg_upll_func_cntl) & mask) == mask)
1656			break;
1657		mdelay(10);
1658	}
1659
1660	/* Deassert UPLL_CTLREQ */
1661	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1662
1663	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1664		DRM_ERROR("Timeout setting UVD clocks!\n");
1665		return -ETIMEDOUT;
1666	}
1667
1668	return 0;
1669}
1670
1671static unsigned si_uvd_calc_upll_post_div(unsigned vco_freq,
1672					  unsigned target_freq,
1673					  unsigned pd_min,
1674					  unsigned pd_even)
1675{
1676	unsigned post_div = vco_freq / target_freq;
1677
1678	/* Adjust to post divider minimum value */
1679	if (post_div < pd_min)
1680		post_div = pd_min;
1681
1682	/* We alway need a frequency less than or equal the target */
1683	if ((vco_freq / post_div) > target_freq)
1684		post_div += 1;
1685
1686	/* Post dividers above a certain value must be even */
1687	if (post_div > pd_even && post_div % 2)
1688		post_div += 1;
1689
1690	return post_div;
1691}
1692
1693/**
1694 * si_calc_upll_dividers - calc UPLL clock dividers
1695 *
1696 * @adev: amdgpu_device pointer
1697 * @vclk: wanted VCLK
1698 * @dclk: wanted DCLK
1699 * @vco_min: minimum VCO frequency
1700 * @vco_max: maximum VCO frequency
1701 * @fb_factor: factor to multiply vco freq with
1702 * @fb_mask: limit and bitmask for feedback divider
1703 * @pd_min: post divider minimum
1704 * @pd_max: post divider maximum
1705 * @pd_even: post divider must be even above this value
1706 * @optimal_fb_div: resulting feedback divider
1707 * @optimal_vclk_div: resulting vclk post divider
1708 * @optimal_dclk_div: resulting dclk post divider
1709 *
1710 * Calculate dividers for UVDs UPLL (except APUs).
1711 * Returns zero on success; -EINVAL on error.
1712 */
1713static int si_calc_upll_dividers(struct amdgpu_device *adev,
1714				 unsigned vclk, unsigned dclk,
1715				 unsigned vco_min, unsigned vco_max,
1716				 unsigned fb_factor, unsigned fb_mask,
1717				 unsigned pd_min, unsigned pd_max,
1718				 unsigned pd_even,
1719				 unsigned *optimal_fb_div,
1720				 unsigned *optimal_vclk_div,
1721				 unsigned *optimal_dclk_div)
1722{
1723	unsigned vco_freq, ref_freq = adev->clock.spll.reference_freq;
1724
1725	/* Start off with something large */
1726	unsigned optimal_score = ~0;
1727
1728	/* Loop through vco from low to high */
1729	vco_min = max(max(vco_min, vclk), dclk);
1730	for (vco_freq = vco_min; vco_freq <= vco_max; vco_freq += 100) {
1731		uint64_t fb_div = (uint64_t)vco_freq * fb_factor;
1732		unsigned vclk_div, dclk_div, score;
1733
1734		do_div(fb_div, ref_freq);
1735
1736		/* fb div out of range ? */
1737		if (fb_div > fb_mask)
1738			break; /* It can oly get worse */
1739
1740		fb_div &= fb_mask;
1741
1742		/* Calc vclk divider with current vco freq */
1743		vclk_div = si_uvd_calc_upll_post_div(vco_freq, vclk,
1744						     pd_min, pd_even);
1745		if (vclk_div > pd_max)
1746			break; /* vco is too big, it has to stop */
1747
1748		/* Calc dclk divider with current vco freq */
1749		dclk_div = si_uvd_calc_upll_post_div(vco_freq, dclk,
1750						     pd_min, pd_even);
1751		if (dclk_div > pd_max)
1752			break; /* vco is too big, it has to stop */
1753
1754		/* Calc score with current vco freq */
1755		score = vclk - (vco_freq / vclk_div) + dclk - (vco_freq / dclk_div);
1756
1757		/* Determine if this vco setting is better than current optimal settings */
1758		if (score < optimal_score) {
1759			*optimal_fb_div = fb_div;
1760			*optimal_vclk_div = vclk_div;
1761			*optimal_dclk_div = dclk_div;
1762			optimal_score = score;
1763			if (optimal_score == 0)
1764				break; /* It can't get better than this */
1765		}
1766	}
1767
1768	/* Did we found a valid setup ? */
1769	if (optimal_score == ~0)
1770		return -EINVAL;
1771
1772	return 0;
1773}
1774
1775static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1776{
1777	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1778	int r;
1779
1780	/* Bypass vclk and dclk with bclk */
1781	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1782		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1783		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1784
1785	/* Put PLL in bypass mode */
1786	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1787
1788	if (!vclk || !dclk) {
1789		/* Keep the Bypass mode */
1790		return 0;
1791	}
1792
1793	r = si_calc_upll_dividers(adev, vclk, dclk, 125000, 250000,
1794				  16384, 0x03FFFFFF, 0, 128, 5,
1795				  &fb_div, &vclk_div, &dclk_div);
1796	if (r)
1797		return r;
1798
1799	/* Set RESET_ANTI_MUX to 0 */
1800	WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1801
1802	/* Set VCO_MODE to 1 */
1803	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1804
1805	/* Disable sleep mode */
1806	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1807
1808	/* Deassert UPLL_RESET */
1809	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1810
1811	mdelay(1);
1812
1813	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1814	if (r)
1815		return r;
1816
1817	/* Assert UPLL_RESET again */
1818	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1819
1820	/* Disable spread spectrum. */
1821	WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1822
1823	/* Set feedback divider */
1824	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1825
1826	/* Set ref divider to 0 */
1827	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1828
1829	if (fb_div < 307200)
1830		WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1831	else
1832		WREG32_P(CG_UPLL_FUNC_CNTL_4,
1833			 UPLL_SPARE_ISPARE9,
1834			 ~UPLL_SPARE_ISPARE9);
1835
1836	/* Set PDIV_A and PDIV_B */
1837	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1838		 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1839		 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1840
1841	/* Give the PLL some time to settle */
1842	mdelay(15);
1843
1844	/* Deassert PLL_RESET */
1845	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1846
1847	mdelay(15);
1848
1849	/* Switch from bypass mode to normal mode */
1850	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1851
1852	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1853	if (r)
1854		return r;
1855
1856	/* Switch VCLK and DCLK selection */
1857	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1858		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1859		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1860
1861	mdelay(100);
1862
1863	return 0;
1864}
1865
1866static int si_vce_send_vcepll_ctlreq(struct amdgpu_device *adev)
1867{
1868	unsigned i;
1869
1870	/* Make sure VCEPLL_CTLREQ is deasserted */
1871	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1872
1873	mdelay(10);
1874
1875	/* Assert UPLL_CTLREQ */
1876	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1877
1878	/* Wait for CTLACK and CTLACK2 to get asserted */
1879	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1880		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1881
1882		if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
1883			break;
1884		mdelay(10);
1885	}
1886
1887	/* Deassert UPLL_CTLREQ */
1888	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1889
1890	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1891		DRM_ERROR("Timeout setting UVD clocks!\n");
1892		return -ETIMEDOUT;
1893	}
1894
1895	return 0;
1896}
1897
1898static int si_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1899{
1900	unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
1901	int r;
1902
1903	/* Bypass evclk and ecclk with bclk */
1904	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1905		     EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
1906		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1907
1908	/* Put PLL in bypass mode */
1909	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
1910		     ~VCEPLL_BYPASS_EN_MASK);
1911
1912	if (!evclk || !ecclk) {
1913		/* Keep the Bypass mode, put PLL to sleep */
1914		WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1915			     ~VCEPLL_SLEEP_MASK);
1916		return 0;
1917	}
1918
1919	r = si_calc_upll_dividers(adev, evclk, ecclk, 125000, 250000,
1920				  16384, 0x03FFFFFF, 0, 128, 5,
1921				  &fb_div, &evclk_div, &ecclk_div);
1922	if (r)
1923		return r;
1924
1925	/* Set RESET_ANTI_MUX to 0 */
1926	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1927
1928	/* Set VCO_MODE to 1 */
1929	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
1930		     ~VCEPLL_VCO_MODE_MASK);
1931
1932	/* Toggle VCEPLL_SLEEP to 1 then back to 0 */
1933	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1934		     ~VCEPLL_SLEEP_MASK);
1935	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
1936
1937	/* Deassert VCEPLL_RESET */
1938	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1939
1940	mdelay(1);
1941
1942	r = si_vce_send_vcepll_ctlreq(adev);
1943	if (r)
1944		return r;
1945
1946	/* Assert VCEPLL_RESET again */
1947	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
1948
1949	/* Disable spread spectrum. */
1950	WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1951
1952	/* Set feedback divider */
1953	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3,
1954		     VCEPLL_FB_DIV(fb_div),
1955		     ~VCEPLL_FB_DIV_MASK);
1956
1957	/* Set ref divider to 0 */
1958	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
1959
1960	/* Set PDIV_A and PDIV_B */
1961	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1962		     VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
1963		     ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
1964
1965	/* Give the PLL some time to settle */
1966	mdelay(15);
1967
1968	/* Deassert PLL_RESET */
1969	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1970
1971	mdelay(15);
1972
1973	/* Switch from bypass mode to normal mode */
1974	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
1975
1976	r = si_vce_send_vcepll_ctlreq(adev);
1977	if (r)
1978		return r;
1979
1980	/* Switch VCLK and DCLK selection */
1981	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1982		     EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
1983		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1984
1985	mdelay(100);
1986
1987	return 0;
1988}
1989
1990static void si_pre_asic_init(struct amdgpu_device *adev)
1991{
1992}
1993
1994static const struct amdgpu_asic_funcs si_asic_funcs =
1995{
1996	.read_disabled_bios = &si_read_disabled_bios,
1997	.read_bios_from_rom = &si_read_bios_from_rom,
1998	.read_register = &si_read_register,
1999	.reset = &si_asic_reset,
2000	.reset_method = &si_asic_reset_method,
2001	.set_vga_state = &si_vga_set_state,
2002	.get_xclk = &si_get_xclk,
2003	.set_uvd_clocks = &si_set_uvd_clocks,
2004	.set_vce_clocks = &si_set_vce_clocks,
2005	.get_pcie_lanes = &si_get_pcie_lanes,
2006	.set_pcie_lanes = &si_set_pcie_lanes,
2007	.get_config_memsize = &si_get_config_memsize,
2008	.flush_hdp = &si_flush_hdp,
2009	.invalidate_hdp = &si_invalidate_hdp,
2010	.need_full_reset = &si_need_full_reset,
2011	.get_pcie_usage = &si_get_pcie_usage,
2012	.need_reset_on_init = &si_need_reset_on_init,
2013	.get_pcie_replay_count = &si_get_pcie_replay_count,
2014	.supports_baco = &si_asic_supports_baco,
2015	.pre_asic_init = &si_pre_asic_init,
2016	.query_video_codecs = &si_query_video_codecs,
2017};
2018
2019static uint32_t si_get_rev_id(struct amdgpu_device *adev)
2020{
2021	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
2022		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
2023}
2024
2025static int si_common_early_init(void *handle)
2026{
2027	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2028
2029	adev->smc_rreg = &si_smc_rreg;
2030	adev->smc_wreg = &si_smc_wreg;
2031	adev->pcie_rreg = &si_pcie_rreg;
2032	adev->pcie_wreg = &si_pcie_wreg;
2033	adev->pciep_rreg = &si_pciep_rreg;
2034	adev->pciep_wreg = &si_pciep_wreg;
2035	adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
2036	adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
2037	adev->didt_rreg = NULL;
2038	adev->didt_wreg = NULL;
2039
2040	adev->asic_funcs = &si_asic_funcs;
2041
2042	adev->rev_id = si_get_rev_id(adev);
2043	adev->external_rev_id = 0xFF;
2044	switch (adev->asic_type) {
2045	case CHIP_TAHITI:
2046		adev->cg_flags =
2047			AMD_CG_SUPPORT_GFX_MGCG |
2048			AMD_CG_SUPPORT_GFX_MGLS |
2049			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2050			AMD_CG_SUPPORT_GFX_CGLS |
2051			AMD_CG_SUPPORT_GFX_CGTS |
2052			AMD_CG_SUPPORT_GFX_CP_LS |
2053			AMD_CG_SUPPORT_MC_MGCG |
2054			AMD_CG_SUPPORT_SDMA_MGCG |
2055			AMD_CG_SUPPORT_BIF_LS |
2056			AMD_CG_SUPPORT_VCE_MGCG |
2057			AMD_CG_SUPPORT_UVD_MGCG |
2058			AMD_CG_SUPPORT_HDP_LS |
2059			AMD_CG_SUPPORT_HDP_MGCG;
2060		adev->pg_flags = 0;
2061		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
2062					(adev->rev_id == 1) ? 5 : 6;
2063		break;
2064	case CHIP_PITCAIRN:
2065		adev->cg_flags =
2066			AMD_CG_SUPPORT_GFX_MGCG |
2067			AMD_CG_SUPPORT_GFX_MGLS |
2068			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2069			AMD_CG_SUPPORT_GFX_CGLS |
2070			AMD_CG_SUPPORT_GFX_CGTS |
2071			AMD_CG_SUPPORT_GFX_CP_LS |
2072			AMD_CG_SUPPORT_GFX_RLC_LS |
2073			AMD_CG_SUPPORT_MC_LS |
2074			AMD_CG_SUPPORT_MC_MGCG |
2075			AMD_CG_SUPPORT_SDMA_MGCG |
2076			AMD_CG_SUPPORT_BIF_LS |
2077			AMD_CG_SUPPORT_VCE_MGCG |
2078			AMD_CG_SUPPORT_UVD_MGCG |
2079			AMD_CG_SUPPORT_HDP_LS |
2080			AMD_CG_SUPPORT_HDP_MGCG;
2081		adev->pg_flags = 0;
2082		adev->external_rev_id = adev->rev_id + 20;
2083		break;
2084
2085	case CHIP_VERDE:
2086		adev->cg_flags =
2087			AMD_CG_SUPPORT_GFX_MGCG |
2088			AMD_CG_SUPPORT_GFX_MGLS |
2089			AMD_CG_SUPPORT_GFX_CGLS |
2090			AMD_CG_SUPPORT_GFX_CGTS |
2091			AMD_CG_SUPPORT_GFX_CGTS_LS |
2092			AMD_CG_SUPPORT_GFX_CP_LS |
2093			AMD_CG_SUPPORT_MC_LS |
2094			AMD_CG_SUPPORT_MC_MGCG |
2095			AMD_CG_SUPPORT_SDMA_MGCG |
2096			AMD_CG_SUPPORT_SDMA_LS |
2097			AMD_CG_SUPPORT_BIF_LS |
2098			AMD_CG_SUPPORT_VCE_MGCG |
2099			AMD_CG_SUPPORT_UVD_MGCG |
2100			AMD_CG_SUPPORT_HDP_LS |
2101			AMD_CG_SUPPORT_HDP_MGCG;
2102		adev->pg_flags = 0;
2103		//???
2104		adev->external_rev_id = adev->rev_id + 40;
2105		break;
2106	case CHIP_OLAND:
2107		adev->cg_flags =
2108			AMD_CG_SUPPORT_GFX_MGCG |
2109			AMD_CG_SUPPORT_GFX_MGLS |
2110			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2111			AMD_CG_SUPPORT_GFX_CGLS |
2112			AMD_CG_SUPPORT_GFX_CGTS |
2113			AMD_CG_SUPPORT_GFX_CP_LS |
2114			AMD_CG_SUPPORT_GFX_RLC_LS |
2115			AMD_CG_SUPPORT_MC_LS |
2116			AMD_CG_SUPPORT_MC_MGCG |
2117			AMD_CG_SUPPORT_SDMA_MGCG |
2118			AMD_CG_SUPPORT_BIF_LS |
2119			AMD_CG_SUPPORT_UVD_MGCG |
2120			AMD_CG_SUPPORT_HDP_LS |
2121			AMD_CG_SUPPORT_HDP_MGCG;
2122		adev->pg_flags = 0;
2123		adev->external_rev_id = 60;
2124		break;
2125	case CHIP_HAINAN:
2126		adev->cg_flags =
2127			AMD_CG_SUPPORT_GFX_MGCG |
2128			AMD_CG_SUPPORT_GFX_MGLS |
2129			/*AMD_CG_SUPPORT_GFX_CGCG |*/
2130			AMD_CG_SUPPORT_GFX_CGLS |
2131			AMD_CG_SUPPORT_GFX_CGTS |
2132			AMD_CG_SUPPORT_GFX_CP_LS |
2133			AMD_CG_SUPPORT_GFX_RLC_LS |
2134			AMD_CG_SUPPORT_MC_LS |
2135			AMD_CG_SUPPORT_MC_MGCG |
2136			AMD_CG_SUPPORT_SDMA_MGCG |
2137			AMD_CG_SUPPORT_BIF_LS |
2138			AMD_CG_SUPPORT_HDP_LS |
2139			AMD_CG_SUPPORT_HDP_MGCG;
2140		adev->pg_flags = 0;
2141		adev->external_rev_id = 70;
2142		break;
2143
2144	default:
2145		return -EINVAL;
2146	}
2147
2148	return 0;
2149}
2150
2151static int si_common_sw_init(void *handle)
2152{
2153	return 0;
2154}
2155
2156static int si_common_sw_fini(void *handle)
2157{
2158	return 0;
2159}
2160
2161
2162static void si_init_golden_registers(struct amdgpu_device *adev)
2163{
2164	switch (adev->asic_type) {
2165	case CHIP_TAHITI:
2166		amdgpu_device_program_register_sequence(adev,
2167							tahiti_golden_registers,
2168							ARRAY_SIZE(tahiti_golden_registers));
2169		amdgpu_device_program_register_sequence(adev,
2170							tahiti_golden_rlc_registers,
2171							ARRAY_SIZE(tahiti_golden_rlc_registers));
2172		amdgpu_device_program_register_sequence(adev,
2173							tahiti_mgcg_cgcg_init,
2174							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
2175		amdgpu_device_program_register_sequence(adev,
2176							tahiti_golden_registers2,
2177							ARRAY_SIZE(tahiti_golden_registers2));
2178		break;
2179	case CHIP_PITCAIRN:
2180		amdgpu_device_program_register_sequence(adev,
2181							pitcairn_golden_registers,
2182							ARRAY_SIZE(pitcairn_golden_registers));
2183		amdgpu_device_program_register_sequence(adev,
2184							pitcairn_golden_rlc_registers,
2185							ARRAY_SIZE(pitcairn_golden_rlc_registers));
2186		amdgpu_device_program_register_sequence(adev,
2187							pitcairn_mgcg_cgcg_init,
2188							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
2189		break;
2190	case CHIP_VERDE:
2191		amdgpu_device_program_register_sequence(adev,
2192							verde_golden_registers,
2193							ARRAY_SIZE(verde_golden_registers));
2194		amdgpu_device_program_register_sequence(adev,
2195							verde_golden_rlc_registers,
2196							ARRAY_SIZE(verde_golden_rlc_registers));
2197		amdgpu_device_program_register_sequence(adev,
2198							verde_mgcg_cgcg_init,
2199							ARRAY_SIZE(verde_mgcg_cgcg_init));
2200		amdgpu_device_program_register_sequence(adev,
2201							verde_pg_init,
2202							ARRAY_SIZE(verde_pg_init));
2203		break;
2204	case CHIP_OLAND:
2205		amdgpu_device_program_register_sequence(adev,
2206							oland_golden_registers,
2207							ARRAY_SIZE(oland_golden_registers));
2208		amdgpu_device_program_register_sequence(adev,
2209							oland_golden_rlc_registers,
2210							ARRAY_SIZE(oland_golden_rlc_registers));
2211		amdgpu_device_program_register_sequence(adev,
2212							oland_mgcg_cgcg_init,
2213							ARRAY_SIZE(oland_mgcg_cgcg_init));
2214		break;
2215	case CHIP_HAINAN:
2216		amdgpu_device_program_register_sequence(adev,
2217							hainan_golden_registers,
2218							ARRAY_SIZE(hainan_golden_registers));
2219		amdgpu_device_program_register_sequence(adev,
2220							hainan_golden_registers2,
2221							ARRAY_SIZE(hainan_golden_registers2));
2222		amdgpu_device_program_register_sequence(adev,
2223							hainan_mgcg_cgcg_init,
2224							ARRAY_SIZE(hainan_mgcg_cgcg_init));
2225		break;
2226
2227
2228	default:
2229		BUG();
2230	}
2231}
2232
2233static void si_pcie_gen3_enable(struct amdgpu_device *adev)
2234{
2235	struct pci_dev *root = adev->pdev->bus->self;
 
2236	u32 speed_cntl, current_data_rate;
2237	int i;
2238	u16 tmp16;
2239
2240	if (pci_is_root_bus(adev->pdev->bus))
2241		return;
2242
2243	if (amdgpu_pcie_gen2 == 0)
2244		return;
2245
2246	if (adev->flags & AMD_IS_APU)
2247		return;
2248
2249	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2250					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
2251		return;
2252
2253	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2254	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
2255		LC_CURRENT_DATA_RATE_SHIFT;
2256	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2257		if (current_data_rate == 2) {
2258			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
2259			return;
2260		}
2261		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
2262	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
2263		if (current_data_rate == 1) {
2264			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
2265			return;
2266		}
2267		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
2268	}
2269
2270	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
 
 
 
 
 
2271		return;
2272
2273	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
2274		if (current_data_rate != 2) {
2275			u16 bridge_cfg, gpu_cfg;
2276			u16 bridge_cfg2, gpu_cfg2;
2277			u32 max_lw, current_lw, tmp;
2278
2279			pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2280						  &bridge_cfg);
2281			pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
2282						  &gpu_cfg);
2283
2284			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
2285			pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
2286
2287			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
2288			pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
2289						   tmp16);
2290
2291			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
2292			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
2293			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
2294
2295			if (current_lw < max_lw) {
2296				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2297				if (tmp & LC_RENEGOTIATION_SUPPORT) {
2298					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
2299					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
2300					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
2301					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
2302				}
2303			}
2304
2305			for (i = 0; i < 10; i++) {
2306				pcie_capability_read_word(adev->pdev,
2307							  PCI_EXP_DEVSTA,
2308							  &tmp16);
2309				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
2310					break;
2311
2312				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2313							  &bridge_cfg);
2314				pcie_capability_read_word(adev->pdev,
2315							  PCI_EXP_LNKCTL,
2316							  &gpu_cfg);
2317
2318				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2319							  &bridge_cfg2);
2320				pcie_capability_read_word(adev->pdev,
2321							  PCI_EXP_LNKCTL2,
2322							  &gpu_cfg2);
2323
2324				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2325				tmp |= LC_SET_QUIESCE;
2326				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2327
2328				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2329				tmp |= LC_REDO_EQ;
2330				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2331
2332				mdelay(100);
2333
2334				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2335							  &tmp16);
2336				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2337				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
2338				pcie_capability_write_word(root, PCI_EXP_LNKCTL,
2339							   tmp16);
2340
2341				pcie_capability_read_word(adev->pdev,
2342							  PCI_EXP_LNKCTL,
2343							  &tmp16);
2344				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2345				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
2346				pcie_capability_write_word(adev->pdev,
2347							   PCI_EXP_LNKCTL,
2348							   tmp16);
2349
2350				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2351							  &tmp16);
2352				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2353					   PCI_EXP_LNKCTL2_TX_MARGIN);
2354				tmp16 |= (bridge_cfg2 &
2355					  (PCI_EXP_LNKCTL2_ENTER_COMP |
2356					   PCI_EXP_LNKCTL2_TX_MARGIN));
2357				pcie_capability_write_word(root,
2358							   PCI_EXP_LNKCTL2,
2359							   tmp16);
2360
2361				pcie_capability_read_word(adev->pdev,
2362							  PCI_EXP_LNKCTL2,
2363							  &tmp16);
2364				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2365					   PCI_EXP_LNKCTL2_TX_MARGIN);
2366				tmp16 |= (gpu_cfg2 &
2367					  (PCI_EXP_LNKCTL2_ENTER_COMP |
2368					   PCI_EXP_LNKCTL2_TX_MARGIN));
2369				pcie_capability_write_word(adev->pdev,
2370							   PCI_EXP_LNKCTL2,
2371							   tmp16);
2372
2373				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
2374				tmp &= ~LC_SET_QUIESCE;
2375				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
2376			}
2377		}
2378	}
2379
2380	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
2381	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
2382	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2383
2384	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
2385	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
2386
2387	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
2388		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
2389	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
2390		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
2391	else
2392		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
2393	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
2394
2395	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2396	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
2397	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2398
2399	for (i = 0; i < adev->usec_timeout; i++) {
2400		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2401		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
2402			break;
2403		udelay(1);
2404	}
2405}
2406
2407static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
2408{
2409	unsigned long flags;
2410	u32 r;
2411
2412	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2413	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2414	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
2415	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2416	return r;
2417}
2418
2419static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2420{
2421	unsigned long flags;
2422
2423	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2424	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2425	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
2426	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2427}
2428
2429static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
2430{
2431	unsigned long flags;
2432	u32 r;
2433
2434	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2435	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2436	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
2437	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2438	return r;
2439}
2440
2441static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2442{
2443	unsigned long flags;
2444
2445	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2446	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2447	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
2448	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2449}
2450static void si_program_aspm(struct amdgpu_device *adev)
2451{
2452	u32 data, orig;
2453	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
2454	bool disable_clkreq = false;
2455
2456	if (amdgpu_aspm == 0)
2457		return;
2458
2459	if (adev->flags & AMD_IS_APU)
2460		return;
2461	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2462	data &= ~LC_XMIT_N_FTS_MASK;
2463	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
2464	if (orig != data)
2465		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
2466
2467	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
2468	data |= LC_GO_TO_RECOVERY;
2469	if (orig != data)
2470		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
2471
2472	orig = data = RREG32_PCIE(PCIE_P_CNTL);
2473	data |= P_IGNORE_EDB_ERR;
2474	if (orig != data)
2475		WREG32_PCIE(PCIE_P_CNTL, data);
2476
2477	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2478	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
2479	data |= LC_PMI_TO_L1_DIS;
2480	if (!disable_l0s)
2481		data |= LC_L0S_INACTIVITY(7);
2482
2483	if (!disable_l1) {
2484		data |= LC_L1_INACTIVITY(7);
2485		data &= ~LC_PMI_TO_L1_DIS;
2486		if (orig != data)
2487			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2488
2489		if (!disable_plloff_in_l1) {
2490			bool clk_req_support;
2491
2492			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2493			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2494			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2495			if (orig != data)
2496				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2497
2498			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2499			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2500			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2501			if (orig != data)
2502				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2503
2504			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2505			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2506			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2507			if (orig != data)
2508				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2509
2510			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2511			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2512			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2513			if (orig != data)
2514				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2515
2516			if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
2517				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2518				data &= ~PLL_RAMP_UP_TIME_0_MASK;
2519				if (orig != data)
2520					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2521
2522				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2523				data &= ~PLL_RAMP_UP_TIME_1_MASK;
2524				if (orig != data)
2525					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2526
2527				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
2528				data &= ~PLL_RAMP_UP_TIME_2_MASK;
2529				if (orig != data)
2530					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
2531
2532				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
2533				data &= ~PLL_RAMP_UP_TIME_3_MASK;
2534				if (orig != data)
2535					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
2536
2537				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2538				data &= ~PLL_RAMP_UP_TIME_0_MASK;
2539				if (orig != data)
2540					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2541
2542				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2543				data &= ~PLL_RAMP_UP_TIME_1_MASK;
2544				if (orig != data)
2545					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2546
2547				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
2548				data &= ~PLL_RAMP_UP_TIME_2_MASK;
2549				if (orig != data)
2550					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
2551
2552				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
2553				data &= ~PLL_RAMP_UP_TIME_3_MASK;
2554				if (orig != data)
2555					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
2556			}
2557			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2558			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
2559			data |= LC_DYN_LANES_PWR_STATE(3);
2560			if (orig != data)
2561				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
2562
2563			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
2564			data &= ~LS2_EXIT_TIME_MASK;
2565			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2566				data |= LS2_EXIT_TIME(5);
2567			if (orig != data)
2568				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
2569
2570			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
2571			data &= ~LS2_EXIT_TIME_MASK;
2572			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
2573				data |= LS2_EXIT_TIME(5);
2574			if (orig != data)
2575				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
2576
2577			if (!disable_clkreq &&
2578			    !pci_is_root_bus(adev->pdev->bus)) {
2579				struct pci_dev *root = adev->pdev->bus->self;
2580				u32 lnkcap;
2581
2582				clk_req_support = false;
2583				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
2584				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
2585					clk_req_support = true;
2586			} else {
2587				clk_req_support = false;
2588			}
2589
2590			if (clk_req_support) {
2591				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
2592				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
2593				if (orig != data)
2594					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
2595
2596				orig = data = RREG32(THM_CLK_CNTL);
2597				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
2598				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
2599				if (orig != data)
2600					WREG32(THM_CLK_CNTL, data);
2601
2602				orig = data = RREG32(MISC_CLK_CNTL);
2603				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
2604				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
2605				if (orig != data)
2606					WREG32(MISC_CLK_CNTL, data);
2607
2608				orig = data = RREG32(CG_CLKPIN_CNTL);
2609				data &= ~BCLK_AS_XCLK;
2610				if (orig != data)
2611					WREG32(CG_CLKPIN_CNTL, data);
2612
2613				orig = data = RREG32(CG_CLKPIN_CNTL_2);
2614				data &= ~FORCE_BIF_REFCLK_EN;
2615				if (orig != data)
2616					WREG32(CG_CLKPIN_CNTL_2, data);
2617
2618				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
2619				data &= ~MPLL_CLKOUT_SEL_MASK;
2620				data |= MPLL_CLKOUT_SEL(4);
2621				if (orig != data)
2622					WREG32(MPLL_BYPASSCLK_SEL, data);
2623
2624				orig = data = RREG32(SPLL_CNTL_MODE);
2625				data &= ~SPLL_REFCLK_SEL_MASK;
2626				if (orig != data)
2627					WREG32(SPLL_CNTL_MODE, data);
2628			}
2629		}
2630	} else {
2631		if (orig != data)
2632			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2633	}
2634
2635	orig = data = RREG32_PCIE(PCIE_CNTL2);
2636	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2637	if (orig != data)
2638		WREG32_PCIE(PCIE_CNTL2, data);
2639
2640	if (!disable_l0s) {
2641		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
2642		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2643			data = RREG32_PCIE(PCIE_LC_STATUS1);
2644			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
2645				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
2646				data &= ~LC_L0S_INACTIVITY_MASK;
2647				if (orig != data)
2648					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
2649			}
2650		}
2651	}
2652}
2653
2654static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2655{
2656	int readrq;
2657	u16 v;
2658
2659	readrq = pcie_get_readrq(adev->pdev);
2660	v = ffs(readrq) - 8;
2661	if ((v == 0) || (v == 6) || (v == 7))
2662		pcie_set_readrq(adev->pdev, 512);
2663}
2664
2665static int si_common_hw_init(void *handle)
2666{
2667	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2668
2669	si_fix_pci_max_read_req_size(adev);
2670	si_init_golden_registers(adev);
2671	si_pcie_gen3_enable(adev);
2672	si_program_aspm(adev);
2673
2674	return 0;
2675}
2676
2677static int si_common_hw_fini(void *handle)
2678{
2679	return 0;
2680}
2681
2682static int si_common_suspend(void *handle)
2683{
2684	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2685
2686	return si_common_hw_fini(adev);
2687}
2688
2689static int si_common_resume(void *handle)
2690{
2691	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2692
2693	return si_common_hw_init(adev);
2694}
2695
2696static bool si_common_is_idle(void *handle)
2697{
2698	return true;
2699}
2700
2701static int si_common_wait_for_idle(void *handle)
2702{
2703	return 0;
2704}
2705
2706static int si_common_soft_reset(void *handle)
2707{
2708	return 0;
2709}
2710
2711static int si_common_set_clockgating_state(void *handle,
2712					    enum amd_clockgating_state state)
2713{
2714	return 0;
2715}
2716
2717static int si_common_set_powergating_state(void *handle,
2718					    enum amd_powergating_state state)
2719{
2720	return 0;
2721}
2722
2723static const struct amd_ip_funcs si_common_ip_funcs = {
2724	.name = "si_common",
2725	.early_init = si_common_early_init,
2726	.late_init = NULL,
2727	.sw_init = si_common_sw_init,
2728	.sw_fini = si_common_sw_fini,
2729	.hw_init = si_common_hw_init,
2730	.hw_fini = si_common_hw_fini,
2731	.suspend = si_common_suspend,
2732	.resume = si_common_resume,
2733	.is_idle = si_common_is_idle,
2734	.wait_for_idle = si_common_wait_for_idle,
2735	.soft_reset = si_common_soft_reset,
2736	.set_clockgating_state = si_common_set_clockgating_state,
2737	.set_powergating_state = si_common_set_powergating_state,
2738};
2739
2740static const struct amdgpu_ip_block_version si_common_ip_block =
2741{
2742	.type = AMD_IP_BLOCK_TYPE_COMMON,
2743	.major = 1,
2744	.minor = 0,
2745	.rev = 0,
2746	.funcs = &si_common_ip_funcs,
2747};
2748
2749int si_set_ip_blocks(struct amdgpu_device *adev)
2750{
 
 
2751	switch (adev->asic_type) {
2752	case CHIP_VERDE:
2753	case CHIP_TAHITI:
2754	case CHIP_PITCAIRN:
2755		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2756		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2757		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2758		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2759		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2760		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2761		if (adev->enable_virtual_display)
2762			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2763#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2764		else if (amdgpu_device_has_dc_support(adev))
2765			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2766#endif
2767		else
2768			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
2769		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
 
 
2770		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2771		break;
2772	case CHIP_OLAND:
2773		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2774		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2775		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2776		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2777		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2778		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2779		if (adev->enable_virtual_display)
2780			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
2781#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2782		else if (amdgpu_device_has_dc_support(adev))
2783			amdgpu_device_ip_block_add(adev, &dm_ip_block);
2784#endif
2785		else
2786			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
2787		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
 
 
2788		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
2789		break;
2790	case CHIP_HAINAN:
2791		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2792		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2793		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
2794		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2795		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
2796		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
2797		if (adev->enable_virtual_display)
2798			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
 
 
2799		break;
2800	default:
2801		BUG();
2802	}
2803	return 0;
2804}
2805