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