Home | History | Annotate | Line # | Download | only in amdgpu
      1  1.7       mrg /*	$NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright 2012 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  * Authors: Alex Deucher
     25  1.1  riastrad  */
     26  1.1  riastrad #include <sys/cdefs.h>
     27  1.7       mrg __KERNEL_RCSID(0, "$NetBSD: amdgpu_cik.c,v 1.7 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.4  riastrad #include <linux/pci.h>
     33  1.4  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 "cikd.h"
     40  1.1  riastrad #include "atom.h"
     41  1.4  riastrad #include "amd_pcie.h"
     42  1.1  riastrad 
     43  1.1  riastrad #include "cik.h"
     44  1.1  riastrad #include "gmc_v7_0.h"
     45  1.1  riastrad #include "cik_ih.h"
     46  1.1  riastrad #include "dce_v8_0.h"
     47  1.1  riastrad #include "gfx_v7_0.h"
     48  1.1  riastrad #include "cik_sdma.h"
     49  1.1  riastrad #include "uvd_v4_2.h"
     50  1.1  riastrad #include "vce_v2_0.h"
     51  1.1  riastrad #include "cik_dpm.h"
     52  1.1  riastrad 
     53  1.1  riastrad #include "uvd/uvd_4_2_d.h"
     54  1.1  riastrad 
     55  1.1  riastrad #include "smu/smu_7_0_1_d.h"
     56  1.1  riastrad #include "smu/smu_7_0_1_sh_mask.h"
     57  1.1  riastrad 
     58  1.1  riastrad #include "dce/dce_8_0_d.h"
     59  1.1  riastrad #include "dce/dce_8_0_sh_mask.h"
     60  1.1  riastrad 
     61  1.1  riastrad #include "bif/bif_4_1_d.h"
     62  1.1  riastrad #include "bif/bif_4_1_sh_mask.h"
     63  1.1  riastrad 
     64  1.1  riastrad #include "gca/gfx_7_2_d.h"
     65  1.1  riastrad #include "gca/gfx_7_2_enum.h"
     66  1.1  riastrad #include "gca/gfx_7_2_sh_mask.h"
     67  1.1  riastrad 
     68  1.1  riastrad #include "gmc/gmc_7_1_d.h"
     69  1.1  riastrad #include "gmc/gmc_7_1_sh_mask.h"
     70  1.1  riastrad 
     71  1.1  riastrad #include "oss/oss_2_0_d.h"
     72  1.1  riastrad #include "oss/oss_2_0_sh_mask.h"
     73  1.1  riastrad 
     74  1.4  riastrad #include "amdgpu_dm.h"
     75  1.1  riastrad #include "amdgpu_amdkfd.h"
     76  1.4  riastrad #include "dce_virtual.h"
     77  1.1  riastrad 
     78  1.5  riastrad #include <linux/nbsd-namespace.h>
     79  1.5  riastrad 
     80  1.1  riastrad /*
     81  1.1  riastrad  * Indirect registers accessor
     82  1.1  riastrad  */
     83  1.1  riastrad static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
     84  1.1  riastrad {
     85  1.1  riastrad 	unsigned long flags;
     86  1.1  riastrad 	u32 r;
     87  1.1  riastrad 
     88  1.1  riastrad 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
     89  1.1  riastrad 	WREG32(mmPCIE_INDEX, reg);
     90  1.1  riastrad 	(void)RREG32(mmPCIE_INDEX);
     91  1.1  riastrad 	r = RREG32(mmPCIE_DATA);
     92  1.1  riastrad 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
     93  1.1  riastrad 	return r;
     94  1.1  riastrad }
     95  1.1  riastrad 
     96  1.1  riastrad static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
     97  1.1  riastrad {
     98  1.1  riastrad 	unsigned long flags;
     99  1.1  riastrad 
    100  1.1  riastrad 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
    101  1.1  riastrad 	WREG32(mmPCIE_INDEX, reg);
    102  1.1  riastrad 	(void)RREG32(mmPCIE_INDEX);
    103  1.1  riastrad 	WREG32(mmPCIE_DATA, v);
    104  1.1  riastrad 	(void)RREG32(mmPCIE_DATA);
    105  1.1  riastrad 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
    106  1.1  riastrad }
    107  1.1  riastrad 
    108  1.1  riastrad static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
    109  1.1  riastrad {
    110  1.1  riastrad 	unsigned long flags;
    111  1.1  riastrad 	u32 r;
    112  1.1  riastrad 
    113  1.1  riastrad 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
    114  1.1  riastrad 	WREG32(mmSMC_IND_INDEX_0, (reg));
    115  1.1  riastrad 	r = RREG32(mmSMC_IND_DATA_0);
    116  1.1  riastrad 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
    117  1.1  riastrad 	return r;
    118  1.1  riastrad }
    119  1.1  riastrad 
    120  1.1  riastrad static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
    121  1.1  riastrad {
    122  1.1  riastrad 	unsigned long flags;
    123  1.1  riastrad 
    124  1.1  riastrad 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
    125  1.1  riastrad 	WREG32(mmSMC_IND_INDEX_0, (reg));
    126  1.1  riastrad 	WREG32(mmSMC_IND_DATA_0, (v));
    127  1.1  riastrad 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
    128  1.1  riastrad }
    129  1.1  riastrad 
    130  1.1  riastrad static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
    131  1.1  riastrad {
    132  1.1  riastrad 	unsigned long flags;
    133  1.1  riastrad 	u32 r;
    134  1.1  riastrad 
    135  1.1  riastrad 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
    136  1.1  riastrad 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
    137  1.1  riastrad 	r = RREG32(mmUVD_CTX_DATA);
    138  1.1  riastrad 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
    139  1.1  riastrad 	return r;
    140  1.1  riastrad }
    141  1.1  riastrad 
    142  1.1  riastrad static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
    143  1.1  riastrad {
    144  1.1  riastrad 	unsigned long flags;
    145  1.1  riastrad 
    146  1.1  riastrad 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
    147  1.1  riastrad 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
    148  1.1  riastrad 	WREG32(mmUVD_CTX_DATA, (v));
    149  1.1  riastrad 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
    150  1.1  riastrad }
    151  1.1  riastrad 
    152  1.1  riastrad static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
    153  1.1  riastrad {
    154  1.1  riastrad 	unsigned long flags;
    155  1.1  riastrad 	u32 r;
    156  1.1  riastrad 
    157  1.1  riastrad 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
    158  1.1  riastrad 	WREG32(mmDIDT_IND_INDEX, (reg));
    159  1.1  riastrad 	r = RREG32(mmDIDT_IND_DATA);
    160  1.1  riastrad 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
    161  1.1  riastrad 	return r;
    162  1.1  riastrad }
    163  1.1  riastrad 
    164  1.1  riastrad static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
    165  1.1  riastrad {
    166  1.1  riastrad 	unsigned long flags;
    167  1.1  riastrad 
    168  1.1  riastrad 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
    169  1.1  riastrad 	WREG32(mmDIDT_IND_INDEX, (reg));
    170  1.1  riastrad 	WREG32(mmDIDT_IND_DATA, (v));
    171  1.1  riastrad 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
    172  1.1  riastrad }
    173  1.1  riastrad 
    174  1.1  riastrad static const u32 bonaire_golden_spm_registers[] =
    175  1.1  riastrad {
    176  1.1  riastrad 	0xc200, 0xe0ffffff, 0xe0000000
    177  1.1  riastrad };
    178  1.1  riastrad 
    179  1.1  riastrad static const u32 bonaire_golden_common_registers[] =
    180  1.1  riastrad {
    181  1.1  riastrad 	0x31dc, 0xffffffff, 0x00000800,
    182  1.1  riastrad 	0x31dd, 0xffffffff, 0x00000800,
    183  1.1  riastrad 	0x31e6, 0xffffffff, 0x00007fbf,
    184  1.1  riastrad 	0x31e7, 0xffffffff, 0x00007faf
    185  1.1  riastrad };
    186  1.1  riastrad 
    187  1.1  riastrad static const u32 bonaire_golden_registers[] =
    188  1.1  riastrad {
    189  1.1  riastrad 	0xcd5, 0x00000333, 0x00000333,
    190  1.1  riastrad 	0xcd4, 0x000c0fc0, 0x00040200,
    191  1.1  riastrad 	0x2684, 0x00010000, 0x00058208,
    192  1.1  riastrad 	0xf000, 0xffff1fff, 0x00140000,
    193  1.1  riastrad 	0xf080, 0xfdfc0fff, 0x00000100,
    194  1.1  riastrad 	0xf08d, 0x40000000, 0x40000200,
    195  1.1  riastrad 	0x260c, 0xffffffff, 0x00000000,
    196  1.1  riastrad 	0x260d, 0xf00fffff, 0x00000400,
    197  1.1  riastrad 	0x260e, 0x0002021c, 0x00020200,
    198  1.1  riastrad 	0x31e, 0x00000080, 0x00000000,
    199  1.1  riastrad 	0x16ec, 0x000000f0, 0x00000070,
    200  1.1  riastrad 	0x16f0, 0xf0311fff, 0x80300000,
    201  1.1  riastrad 	0x263e, 0x73773777, 0x12010001,
    202  1.1  riastrad 	0xd43, 0x00810000, 0x408af000,
    203  1.1  riastrad 	0x1c0c, 0x31000111, 0x00000011,
    204  1.1  riastrad 	0xbd2, 0x73773777, 0x12010001,
    205  1.1  riastrad 	0x883, 0x00007fb6, 0x0021a1b1,
    206  1.1  riastrad 	0x884, 0x00007fb6, 0x002021b1,
    207  1.1  riastrad 	0x860, 0x00007fb6, 0x00002191,
    208  1.1  riastrad 	0x886, 0x00007fb6, 0x002121b1,
    209  1.1  riastrad 	0x887, 0x00007fb6, 0x002021b1,
    210  1.1  riastrad 	0x877, 0x00007fb6, 0x00002191,
    211  1.1  riastrad 	0x878, 0x00007fb6, 0x00002191,
    212  1.1  riastrad 	0xd8a, 0x0000003f, 0x0000000a,
    213  1.1  riastrad 	0xd8b, 0x0000003f, 0x0000000a,
    214  1.1  riastrad 	0xab9, 0x00073ffe, 0x000022a2,
    215  1.1  riastrad 	0x903, 0x000007ff, 0x00000000,
    216  1.1  riastrad 	0x2285, 0xf000003f, 0x00000007,
    217  1.1  riastrad 	0x22fc, 0x00002001, 0x00000001,
    218  1.1  riastrad 	0x22c9, 0xffffffff, 0x00ffffff,
    219  1.1  riastrad 	0xc281, 0x0000ff0f, 0x00000000,
    220  1.1  riastrad 	0xa293, 0x07ffffff, 0x06000000,
    221  1.1  riastrad 	0x136, 0x00000fff, 0x00000100,
    222  1.1  riastrad 	0xf9e, 0x00000001, 0x00000002,
    223  1.1  riastrad 	0x2440, 0x03000000, 0x0362c688,
    224  1.1  riastrad 	0x2300, 0x000000ff, 0x00000001,
    225  1.1  riastrad 	0x390, 0x00001fff, 0x00001fff,
    226  1.1  riastrad 	0x2418, 0x0000007f, 0x00000020,
    227  1.1  riastrad 	0x2542, 0x00010000, 0x00010000,
    228  1.1  riastrad 	0x2b05, 0x000003ff, 0x000000f3,
    229  1.1  riastrad 	0x2b03, 0xffffffff, 0x00001032
    230  1.1  riastrad };
    231  1.1  riastrad 
    232  1.1  riastrad static const u32 bonaire_mgcg_cgcg_init[] =
    233  1.1  riastrad {
    234  1.1  riastrad 	0x3108, 0xffffffff, 0xfffffffc,
    235  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    236  1.1  riastrad 	0xf0a8, 0xffffffff, 0x00000100,
    237  1.1  riastrad 	0xf082, 0xffffffff, 0x00000100,
    238  1.1  riastrad 	0xf0b0, 0xffffffff, 0xc0000100,
    239  1.1  riastrad 	0xf0b2, 0xffffffff, 0xc0000100,
    240  1.1  riastrad 	0xf0b1, 0xffffffff, 0xc0000100,
    241  1.1  riastrad 	0x1579, 0xffffffff, 0x00600100,
    242  1.1  riastrad 	0xf0a0, 0xffffffff, 0x00000100,
    243  1.1  riastrad 	0xf085, 0xffffffff, 0x06000100,
    244  1.1  riastrad 	0xf088, 0xffffffff, 0x00000100,
    245  1.1  riastrad 	0xf086, 0xffffffff, 0x06000100,
    246  1.1  riastrad 	0xf081, 0xffffffff, 0x00000100,
    247  1.1  riastrad 	0xf0b8, 0xffffffff, 0x00000100,
    248  1.1  riastrad 	0xf089, 0xffffffff, 0x00000100,
    249  1.1  riastrad 	0xf080, 0xffffffff, 0x00000100,
    250  1.1  riastrad 	0xf08c, 0xffffffff, 0x00000100,
    251  1.1  riastrad 	0xf08d, 0xffffffff, 0x00000100,
    252  1.1  riastrad 	0xf094, 0xffffffff, 0x00000100,
    253  1.1  riastrad 	0xf095, 0xffffffff, 0x00000100,
    254  1.1  riastrad 	0xf096, 0xffffffff, 0x00000100,
    255  1.1  riastrad 	0xf097, 0xffffffff, 0x00000100,
    256  1.1  riastrad 	0xf098, 0xffffffff, 0x00000100,
    257  1.1  riastrad 	0xf09f, 0xffffffff, 0x00000100,
    258  1.1  riastrad 	0xf09e, 0xffffffff, 0x00000100,
    259  1.1  riastrad 	0xf084, 0xffffffff, 0x06000100,
    260  1.1  riastrad 	0xf0a4, 0xffffffff, 0x00000100,
    261  1.1  riastrad 	0xf09d, 0xffffffff, 0x00000100,
    262  1.1  riastrad 	0xf0ad, 0xffffffff, 0x00000100,
    263  1.1  riastrad 	0xf0ac, 0xffffffff, 0x00000100,
    264  1.1  riastrad 	0xf09c, 0xffffffff, 0x00000100,
    265  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    266  1.1  riastrad 	0xf008, 0xffffffff, 0x00010000,
    267  1.1  riastrad 	0xf009, 0xffffffff, 0x00030002,
    268  1.1  riastrad 	0xf00a, 0xffffffff, 0x00040007,
    269  1.1  riastrad 	0xf00b, 0xffffffff, 0x00060005,
    270  1.1  riastrad 	0xf00c, 0xffffffff, 0x00090008,
    271  1.1  riastrad 	0xf00d, 0xffffffff, 0x00010000,
    272  1.1  riastrad 	0xf00e, 0xffffffff, 0x00030002,
    273  1.1  riastrad 	0xf00f, 0xffffffff, 0x00040007,
    274  1.1  riastrad 	0xf010, 0xffffffff, 0x00060005,
    275  1.1  riastrad 	0xf011, 0xffffffff, 0x00090008,
    276  1.1  riastrad 	0xf012, 0xffffffff, 0x00010000,
    277  1.1  riastrad 	0xf013, 0xffffffff, 0x00030002,
    278  1.1  riastrad 	0xf014, 0xffffffff, 0x00040007,
    279  1.1  riastrad 	0xf015, 0xffffffff, 0x00060005,
    280  1.1  riastrad 	0xf016, 0xffffffff, 0x00090008,
    281  1.1  riastrad 	0xf017, 0xffffffff, 0x00010000,
    282  1.1  riastrad 	0xf018, 0xffffffff, 0x00030002,
    283  1.1  riastrad 	0xf019, 0xffffffff, 0x00040007,
    284  1.1  riastrad 	0xf01a, 0xffffffff, 0x00060005,
    285  1.1  riastrad 	0xf01b, 0xffffffff, 0x00090008,
    286  1.1  riastrad 	0xf01c, 0xffffffff, 0x00010000,
    287  1.1  riastrad 	0xf01d, 0xffffffff, 0x00030002,
    288  1.1  riastrad 	0xf01e, 0xffffffff, 0x00040007,
    289  1.1  riastrad 	0xf01f, 0xffffffff, 0x00060005,
    290  1.1  riastrad 	0xf020, 0xffffffff, 0x00090008,
    291  1.1  riastrad 	0xf021, 0xffffffff, 0x00010000,
    292  1.1  riastrad 	0xf022, 0xffffffff, 0x00030002,
    293  1.1  riastrad 	0xf023, 0xffffffff, 0x00040007,
    294  1.1  riastrad 	0xf024, 0xffffffff, 0x00060005,
    295  1.1  riastrad 	0xf025, 0xffffffff, 0x00090008,
    296  1.1  riastrad 	0xf026, 0xffffffff, 0x00010000,
    297  1.1  riastrad 	0xf027, 0xffffffff, 0x00030002,
    298  1.1  riastrad 	0xf028, 0xffffffff, 0x00040007,
    299  1.1  riastrad 	0xf029, 0xffffffff, 0x00060005,
    300  1.1  riastrad 	0xf02a, 0xffffffff, 0x00090008,
    301  1.1  riastrad 	0xf000, 0xffffffff, 0x96e00200,
    302  1.1  riastrad 	0x21c2, 0xffffffff, 0x00900100,
    303  1.1  riastrad 	0x3109, 0xffffffff, 0x0020003f,
    304  1.1  riastrad 	0xe, 0xffffffff, 0x0140001c,
    305  1.1  riastrad 	0xf, 0x000f0000, 0x000f0000,
    306  1.1  riastrad 	0x88, 0xffffffff, 0xc060000c,
    307  1.1  riastrad 	0x89, 0xc0000fff, 0x00000100,
    308  1.1  riastrad 	0x3e4, 0xffffffff, 0x00000100,
    309  1.1  riastrad 	0x3e6, 0x00000101, 0x00000000,
    310  1.1  riastrad 	0x82a, 0xffffffff, 0x00000104,
    311  1.1  riastrad 	0x1579, 0xff000fff, 0x00000100,
    312  1.1  riastrad 	0xc33, 0xc0000fff, 0x00000104,
    313  1.1  riastrad 	0x3079, 0x00000001, 0x00000001,
    314  1.1  riastrad 	0x3403, 0xff000ff0, 0x00000100,
    315  1.1  riastrad 	0x3603, 0xff000ff0, 0x00000100
    316  1.1  riastrad };
    317  1.1  riastrad 
    318  1.1  riastrad static const u32 spectre_golden_spm_registers[] =
    319  1.1  riastrad {
    320  1.1  riastrad 	0xc200, 0xe0ffffff, 0xe0000000
    321  1.1  riastrad };
    322  1.1  riastrad 
    323  1.1  riastrad static const u32 spectre_golden_common_registers[] =
    324  1.1  riastrad {
    325  1.1  riastrad 	0x31dc, 0xffffffff, 0x00000800,
    326  1.1  riastrad 	0x31dd, 0xffffffff, 0x00000800,
    327  1.1  riastrad 	0x31e6, 0xffffffff, 0x00007fbf,
    328  1.1  riastrad 	0x31e7, 0xffffffff, 0x00007faf
    329  1.1  riastrad };
    330  1.1  riastrad 
    331  1.1  riastrad static const u32 spectre_golden_registers[] =
    332  1.1  riastrad {
    333  1.1  riastrad 	0xf000, 0xffff1fff, 0x96940200,
    334  1.1  riastrad 	0xf003, 0xffff0001, 0xff000000,
    335  1.1  riastrad 	0xf080, 0xfffc0fff, 0x00000100,
    336  1.1  riastrad 	0x1bb6, 0x00010101, 0x00010000,
    337  1.1  riastrad 	0x260d, 0xf00fffff, 0x00000400,
    338  1.1  riastrad 	0x260e, 0xfffffffc, 0x00020200,
    339  1.1  riastrad 	0x16ec, 0x000000f0, 0x00000070,
    340  1.1  riastrad 	0x16f0, 0xf0311fff, 0x80300000,
    341  1.1  riastrad 	0x263e, 0x73773777, 0x12010001,
    342  1.1  riastrad 	0x26df, 0x00ff0000, 0x00fc0000,
    343  1.1  riastrad 	0xbd2, 0x73773777, 0x12010001,
    344  1.1  riastrad 	0x2285, 0xf000003f, 0x00000007,
    345  1.1  riastrad 	0x22c9, 0xffffffff, 0x00ffffff,
    346  1.1  riastrad 	0xa0d4, 0x3f3f3fff, 0x00000082,
    347  1.1  riastrad 	0xa0d5, 0x0000003f, 0x00000000,
    348  1.1  riastrad 	0xf9e, 0x00000001, 0x00000002,
    349  1.1  riastrad 	0x244f, 0xffff03df, 0x00000004,
    350  1.1  riastrad 	0x31da, 0x00000008, 0x00000008,
    351  1.1  riastrad 	0x2300, 0x000008ff, 0x00000800,
    352  1.1  riastrad 	0x2542, 0x00010000, 0x00010000,
    353  1.1  riastrad 	0x2b03, 0xffffffff, 0x54763210,
    354  1.1  riastrad 	0x853e, 0x01ff01ff, 0x00000002,
    355  1.1  riastrad 	0x8526, 0x007ff800, 0x00200000,
    356  1.1  riastrad 	0x8057, 0xffffffff, 0x00000f40,
    357  1.1  riastrad 	0xc24d, 0xffffffff, 0x00000001
    358  1.1  riastrad };
    359  1.1  riastrad 
    360  1.1  riastrad static const u32 spectre_mgcg_cgcg_init[] =
    361  1.1  riastrad {
    362  1.1  riastrad 	0x3108, 0xffffffff, 0xfffffffc,
    363  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    364  1.1  riastrad 	0xf0a8, 0xffffffff, 0x00000100,
    365  1.1  riastrad 	0xf082, 0xffffffff, 0x00000100,
    366  1.1  riastrad 	0xf0b0, 0xffffffff, 0x00000100,
    367  1.1  riastrad 	0xf0b2, 0xffffffff, 0x00000100,
    368  1.1  riastrad 	0xf0b1, 0xffffffff, 0x00000100,
    369  1.1  riastrad 	0x1579, 0xffffffff, 0x00600100,
    370  1.1  riastrad 	0xf0a0, 0xffffffff, 0x00000100,
    371  1.1  riastrad 	0xf085, 0xffffffff, 0x06000100,
    372  1.1  riastrad 	0xf088, 0xffffffff, 0x00000100,
    373  1.1  riastrad 	0xf086, 0xffffffff, 0x06000100,
    374  1.1  riastrad 	0xf081, 0xffffffff, 0x00000100,
    375  1.1  riastrad 	0xf0b8, 0xffffffff, 0x00000100,
    376  1.1  riastrad 	0xf089, 0xffffffff, 0x00000100,
    377  1.1  riastrad 	0xf080, 0xffffffff, 0x00000100,
    378  1.1  riastrad 	0xf08c, 0xffffffff, 0x00000100,
    379  1.1  riastrad 	0xf08d, 0xffffffff, 0x00000100,
    380  1.1  riastrad 	0xf094, 0xffffffff, 0x00000100,
    381  1.1  riastrad 	0xf095, 0xffffffff, 0x00000100,
    382  1.1  riastrad 	0xf096, 0xffffffff, 0x00000100,
    383  1.1  riastrad 	0xf097, 0xffffffff, 0x00000100,
    384  1.1  riastrad 	0xf098, 0xffffffff, 0x00000100,
    385  1.1  riastrad 	0xf09f, 0xffffffff, 0x00000100,
    386  1.1  riastrad 	0xf09e, 0xffffffff, 0x00000100,
    387  1.1  riastrad 	0xf084, 0xffffffff, 0x06000100,
    388  1.1  riastrad 	0xf0a4, 0xffffffff, 0x00000100,
    389  1.1  riastrad 	0xf09d, 0xffffffff, 0x00000100,
    390  1.1  riastrad 	0xf0ad, 0xffffffff, 0x00000100,
    391  1.1  riastrad 	0xf0ac, 0xffffffff, 0x00000100,
    392  1.1  riastrad 	0xf09c, 0xffffffff, 0x00000100,
    393  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    394  1.1  riastrad 	0xf008, 0xffffffff, 0x00010000,
    395  1.1  riastrad 	0xf009, 0xffffffff, 0x00030002,
    396  1.1  riastrad 	0xf00a, 0xffffffff, 0x00040007,
    397  1.1  riastrad 	0xf00b, 0xffffffff, 0x00060005,
    398  1.1  riastrad 	0xf00c, 0xffffffff, 0x00090008,
    399  1.1  riastrad 	0xf00d, 0xffffffff, 0x00010000,
    400  1.1  riastrad 	0xf00e, 0xffffffff, 0x00030002,
    401  1.1  riastrad 	0xf00f, 0xffffffff, 0x00040007,
    402  1.1  riastrad 	0xf010, 0xffffffff, 0x00060005,
    403  1.1  riastrad 	0xf011, 0xffffffff, 0x00090008,
    404  1.1  riastrad 	0xf012, 0xffffffff, 0x00010000,
    405  1.1  riastrad 	0xf013, 0xffffffff, 0x00030002,
    406  1.1  riastrad 	0xf014, 0xffffffff, 0x00040007,
    407  1.1  riastrad 	0xf015, 0xffffffff, 0x00060005,
    408  1.1  riastrad 	0xf016, 0xffffffff, 0x00090008,
    409  1.1  riastrad 	0xf017, 0xffffffff, 0x00010000,
    410  1.1  riastrad 	0xf018, 0xffffffff, 0x00030002,
    411  1.1  riastrad 	0xf019, 0xffffffff, 0x00040007,
    412  1.1  riastrad 	0xf01a, 0xffffffff, 0x00060005,
    413  1.1  riastrad 	0xf01b, 0xffffffff, 0x00090008,
    414  1.1  riastrad 	0xf01c, 0xffffffff, 0x00010000,
    415  1.1  riastrad 	0xf01d, 0xffffffff, 0x00030002,
    416  1.1  riastrad 	0xf01e, 0xffffffff, 0x00040007,
    417  1.1  riastrad 	0xf01f, 0xffffffff, 0x00060005,
    418  1.1  riastrad 	0xf020, 0xffffffff, 0x00090008,
    419  1.1  riastrad 	0xf021, 0xffffffff, 0x00010000,
    420  1.1  riastrad 	0xf022, 0xffffffff, 0x00030002,
    421  1.1  riastrad 	0xf023, 0xffffffff, 0x00040007,
    422  1.1  riastrad 	0xf024, 0xffffffff, 0x00060005,
    423  1.1  riastrad 	0xf025, 0xffffffff, 0x00090008,
    424  1.1  riastrad 	0xf026, 0xffffffff, 0x00010000,
    425  1.1  riastrad 	0xf027, 0xffffffff, 0x00030002,
    426  1.1  riastrad 	0xf028, 0xffffffff, 0x00040007,
    427  1.1  riastrad 	0xf029, 0xffffffff, 0x00060005,
    428  1.1  riastrad 	0xf02a, 0xffffffff, 0x00090008,
    429  1.1  riastrad 	0xf02b, 0xffffffff, 0x00010000,
    430  1.1  riastrad 	0xf02c, 0xffffffff, 0x00030002,
    431  1.1  riastrad 	0xf02d, 0xffffffff, 0x00040007,
    432  1.1  riastrad 	0xf02e, 0xffffffff, 0x00060005,
    433  1.1  riastrad 	0xf02f, 0xffffffff, 0x00090008,
    434  1.1  riastrad 	0xf000, 0xffffffff, 0x96e00200,
    435  1.1  riastrad 	0x21c2, 0xffffffff, 0x00900100,
    436  1.1  riastrad 	0x3109, 0xffffffff, 0x0020003f,
    437  1.1  riastrad 	0xe, 0xffffffff, 0x0140001c,
    438  1.1  riastrad 	0xf, 0x000f0000, 0x000f0000,
    439  1.1  riastrad 	0x88, 0xffffffff, 0xc060000c,
    440  1.1  riastrad 	0x89, 0xc0000fff, 0x00000100,
    441  1.1  riastrad 	0x3e4, 0xffffffff, 0x00000100,
    442  1.1  riastrad 	0x3e6, 0x00000101, 0x00000000,
    443  1.1  riastrad 	0x82a, 0xffffffff, 0x00000104,
    444  1.1  riastrad 	0x1579, 0xff000fff, 0x00000100,
    445  1.1  riastrad 	0xc33, 0xc0000fff, 0x00000104,
    446  1.1  riastrad 	0x3079, 0x00000001, 0x00000001,
    447  1.1  riastrad 	0x3403, 0xff000ff0, 0x00000100,
    448  1.1  riastrad 	0x3603, 0xff000ff0, 0x00000100
    449  1.1  riastrad };
    450  1.1  riastrad 
    451  1.1  riastrad static const u32 kalindi_golden_spm_registers[] =
    452  1.1  riastrad {
    453  1.1  riastrad 	0xc200, 0xe0ffffff, 0xe0000000
    454  1.1  riastrad };
    455  1.1  riastrad 
    456  1.1  riastrad static const u32 kalindi_golden_common_registers[] =
    457  1.1  riastrad {
    458  1.1  riastrad 	0x31dc, 0xffffffff, 0x00000800,
    459  1.1  riastrad 	0x31dd, 0xffffffff, 0x00000800,
    460  1.1  riastrad 	0x31e6, 0xffffffff, 0x00007fbf,
    461  1.1  riastrad 	0x31e7, 0xffffffff, 0x00007faf
    462  1.1  riastrad };
    463  1.1  riastrad 
    464  1.1  riastrad static const u32 kalindi_golden_registers[] =
    465  1.1  riastrad {
    466  1.1  riastrad 	0xf000, 0xffffdfff, 0x6e944040,
    467  1.1  riastrad 	0x1579, 0xff607fff, 0xfc000100,
    468  1.1  riastrad 	0xf088, 0xff000fff, 0x00000100,
    469  1.1  riastrad 	0xf089, 0xff000fff, 0x00000100,
    470  1.1  riastrad 	0xf080, 0xfffc0fff, 0x00000100,
    471  1.1  riastrad 	0x1bb6, 0x00010101, 0x00010000,
    472  1.1  riastrad 	0x260c, 0xffffffff, 0x00000000,
    473  1.1  riastrad 	0x260d, 0xf00fffff, 0x00000400,
    474  1.1  riastrad 	0x16ec, 0x000000f0, 0x00000070,
    475  1.1  riastrad 	0x16f0, 0xf0311fff, 0x80300000,
    476  1.1  riastrad 	0x263e, 0x73773777, 0x12010001,
    477  1.1  riastrad 	0x263f, 0xffffffff, 0x00000010,
    478  1.1  riastrad 	0x26df, 0x00ff0000, 0x00fc0000,
    479  1.1  riastrad 	0x200c, 0x00001f0f, 0x0000100a,
    480  1.1  riastrad 	0xbd2, 0x73773777, 0x12010001,
    481  1.1  riastrad 	0x902, 0x000fffff, 0x000c007f,
    482  1.1  riastrad 	0x2285, 0xf000003f, 0x00000007,
    483  1.1  riastrad 	0x22c9, 0x3fff3fff, 0x00ffcfff,
    484  1.1  riastrad 	0xc281, 0x0000ff0f, 0x00000000,
    485  1.1  riastrad 	0xa293, 0x07ffffff, 0x06000000,
    486  1.1  riastrad 	0x136, 0x00000fff, 0x00000100,
    487  1.1  riastrad 	0xf9e, 0x00000001, 0x00000002,
    488  1.1  riastrad 	0x31da, 0x00000008, 0x00000008,
    489  1.1  riastrad 	0x2300, 0x000000ff, 0x00000003,
    490  1.1  riastrad 	0x853e, 0x01ff01ff, 0x00000002,
    491  1.1  riastrad 	0x8526, 0x007ff800, 0x00200000,
    492  1.1  riastrad 	0x8057, 0xffffffff, 0x00000f40,
    493  1.1  riastrad 	0x2231, 0x001f3ae3, 0x00000082,
    494  1.1  riastrad 	0x2235, 0x0000001f, 0x00000010,
    495  1.1  riastrad 	0xc24d, 0xffffffff, 0x00000000
    496  1.1  riastrad };
    497  1.1  riastrad 
    498  1.1  riastrad static const u32 kalindi_mgcg_cgcg_init[] =
    499  1.1  riastrad {
    500  1.1  riastrad 	0x3108, 0xffffffff, 0xfffffffc,
    501  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    502  1.1  riastrad 	0xf0a8, 0xffffffff, 0x00000100,
    503  1.1  riastrad 	0xf082, 0xffffffff, 0x00000100,
    504  1.1  riastrad 	0xf0b0, 0xffffffff, 0x00000100,
    505  1.1  riastrad 	0xf0b2, 0xffffffff, 0x00000100,
    506  1.1  riastrad 	0xf0b1, 0xffffffff, 0x00000100,
    507  1.1  riastrad 	0x1579, 0xffffffff, 0x00600100,
    508  1.1  riastrad 	0xf0a0, 0xffffffff, 0x00000100,
    509  1.1  riastrad 	0xf085, 0xffffffff, 0x06000100,
    510  1.1  riastrad 	0xf088, 0xffffffff, 0x00000100,
    511  1.1  riastrad 	0xf086, 0xffffffff, 0x06000100,
    512  1.1  riastrad 	0xf081, 0xffffffff, 0x00000100,
    513  1.1  riastrad 	0xf0b8, 0xffffffff, 0x00000100,
    514  1.1  riastrad 	0xf089, 0xffffffff, 0x00000100,
    515  1.1  riastrad 	0xf080, 0xffffffff, 0x00000100,
    516  1.1  riastrad 	0xf08c, 0xffffffff, 0x00000100,
    517  1.1  riastrad 	0xf08d, 0xffffffff, 0x00000100,
    518  1.1  riastrad 	0xf094, 0xffffffff, 0x00000100,
    519  1.1  riastrad 	0xf095, 0xffffffff, 0x00000100,
    520  1.1  riastrad 	0xf096, 0xffffffff, 0x00000100,
    521  1.1  riastrad 	0xf097, 0xffffffff, 0x00000100,
    522  1.1  riastrad 	0xf098, 0xffffffff, 0x00000100,
    523  1.1  riastrad 	0xf09f, 0xffffffff, 0x00000100,
    524  1.1  riastrad 	0xf09e, 0xffffffff, 0x00000100,
    525  1.1  riastrad 	0xf084, 0xffffffff, 0x06000100,
    526  1.1  riastrad 	0xf0a4, 0xffffffff, 0x00000100,
    527  1.1  riastrad 	0xf09d, 0xffffffff, 0x00000100,
    528  1.1  riastrad 	0xf0ad, 0xffffffff, 0x00000100,
    529  1.1  riastrad 	0xf0ac, 0xffffffff, 0x00000100,
    530  1.1  riastrad 	0xf09c, 0xffffffff, 0x00000100,
    531  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    532  1.1  riastrad 	0xf008, 0xffffffff, 0x00010000,
    533  1.1  riastrad 	0xf009, 0xffffffff, 0x00030002,
    534  1.1  riastrad 	0xf00a, 0xffffffff, 0x00040007,
    535  1.1  riastrad 	0xf00b, 0xffffffff, 0x00060005,
    536  1.1  riastrad 	0xf00c, 0xffffffff, 0x00090008,
    537  1.1  riastrad 	0xf00d, 0xffffffff, 0x00010000,
    538  1.1  riastrad 	0xf00e, 0xffffffff, 0x00030002,
    539  1.1  riastrad 	0xf00f, 0xffffffff, 0x00040007,
    540  1.1  riastrad 	0xf010, 0xffffffff, 0x00060005,
    541  1.1  riastrad 	0xf011, 0xffffffff, 0x00090008,
    542  1.1  riastrad 	0xf000, 0xffffffff, 0x96e00200,
    543  1.1  riastrad 	0x21c2, 0xffffffff, 0x00900100,
    544  1.1  riastrad 	0x3109, 0xffffffff, 0x0020003f,
    545  1.1  riastrad 	0xe, 0xffffffff, 0x0140001c,
    546  1.1  riastrad 	0xf, 0x000f0000, 0x000f0000,
    547  1.1  riastrad 	0x88, 0xffffffff, 0xc060000c,
    548  1.1  riastrad 	0x89, 0xc0000fff, 0x00000100,
    549  1.1  riastrad 	0x82a, 0xffffffff, 0x00000104,
    550  1.1  riastrad 	0x1579, 0xff000fff, 0x00000100,
    551  1.1  riastrad 	0xc33, 0xc0000fff, 0x00000104,
    552  1.1  riastrad 	0x3079, 0x00000001, 0x00000001,
    553  1.1  riastrad 	0x3403, 0xff000ff0, 0x00000100,
    554  1.1  riastrad 	0x3603, 0xff000ff0, 0x00000100
    555  1.1  riastrad };
    556  1.1  riastrad 
    557  1.1  riastrad static const u32 hawaii_golden_spm_registers[] =
    558  1.1  riastrad {
    559  1.1  riastrad 	0xc200, 0xe0ffffff, 0xe0000000
    560  1.1  riastrad };
    561  1.1  riastrad 
    562  1.1  riastrad static const u32 hawaii_golden_common_registers[] =
    563  1.1  riastrad {
    564  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    565  1.1  riastrad 	0xa0d4, 0xffffffff, 0x3a00161a,
    566  1.1  riastrad 	0xa0d5, 0xffffffff, 0x0000002e,
    567  1.1  riastrad 	0x2684, 0xffffffff, 0x00018208,
    568  1.1  riastrad 	0x263e, 0xffffffff, 0x12011003
    569  1.1  riastrad };
    570  1.1  riastrad 
    571  1.1  riastrad static const u32 hawaii_golden_registers[] =
    572  1.1  riastrad {
    573  1.1  riastrad 	0xcd5, 0x00000333, 0x00000333,
    574  1.1  riastrad 	0x2684, 0x00010000, 0x00058208,
    575  1.1  riastrad 	0x260c, 0xffffffff, 0x00000000,
    576  1.1  riastrad 	0x260d, 0xf00fffff, 0x00000400,
    577  1.1  riastrad 	0x260e, 0x0002021c, 0x00020200,
    578  1.1  riastrad 	0x31e, 0x00000080, 0x00000000,
    579  1.1  riastrad 	0x16ec, 0x000000f0, 0x00000070,
    580  1.1  riastrad 	0x16f0, 0xf0311fff, 0x80300000,
    581  1.1  riastrad 	0xd43, 0x00810000, 0x408af000,
    582  1.1  riastrad 	0x1c0c, 0x31000111, 0x00000011,
    583  1.1  riastrad 	0xbd2, 0x73773777, 0x12010001,
    584  1.1  riastrad 	0x848, 0x0000007f, 0x0000001b,
    585  1.1  riastrad 	0x877, 0x00007fb6, 0x00002191,
    586  1.1  riastrad 	0xd8a, 0x0000003f, 0x0000000a,
    587  1.1  riastrad 	0xd8b, 0x0000003f, 0x0000000a,
    588  1.1  riastrad 	0xab9, 0x00073ffe, 0x000022a2,
    589  1.1  riastrad 	0x903, 0x000007ff, 0x00000000,
    590  1.1  riastrad 	0x22fc, 0x00002001, 0x00000001,
    591  1.1  riastrad 	0x22c9, 0xffffffff, 0x00ffffff,
    592  1.1  riastrad 	0xc281, 0x0000ff0f, 0x00000000,
    593  1.1  riastrad 	0xa293, 0x07ffffff, 0x06000000,
    594  1.1  riastrad 	0xf9e, 0x00000001, 0x00000002,
    595  1.1  riastrad 	0x31da, 0x00000008, 0x00000008,
    596  1.1  riastrad 	0x31dc, 0x00000f00, 0x00000800,
    597  1.1  riastrad 	0x31dd, 0x00000f00, 0x00000800,
    598  1.1  riastrad 	0x31e6, 0x00ffffff, 0x00ff7fbf,
    599  1.1  riastrad 	0x31e7, 0x00ffffff, 0x00ff7faf,
    600  1.1  riastrad 	0x2300, 0x000000ff, 0x00000800,
    601  1.1  riastrad 	0x390, 0x00001fff, 0x00001fff,
    602  1.1  riastrad 	0x2418, 0x0000007f, 0x00000020,
    603  1.1  riastrad 	0x2542, 0x00010000, 0x00010000,
    604  1.1  riastrad 	0x2b80, 0x00100000, 0x000ff07c,
    605  1.1  riastrad 	0x2b05, 0x000003ff, 0x0000000f,
    606  1.1  riastrad 	0x2b04, 0xffffffff, 0x7564fdec,
    607  1.1  riastrad 	0x2b03, 0xffffffff, 0x3120b9a8,
    608  1.1  riastrad 	0x2b02, 0x20000000, 0x0f9c0000
    609  1.1  riastrad };
    610  1.1  riastrad 
    611  1.1  riastrad static const u32 hawaii_mgcg_cgcg_init[] =
    612  1.1  riastrad {
    613  1.1  riastrad 	0x3108, 0xffffffff, 0xfffffffd,
    614  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    615  1.1  riastrad 	0xf0a8, 0xffffffff, 0x00000100,
    616  1.1  riastrad 	0xf082, 0xffffffff, 0x00000100,
    617  1.1  riastrad 	0xf0b0, 0xffffffff, 0x00000100,
    618  1.1  riastrad 	0xf0b2, 0xffffffff, 0x00000100,
    619  1.1  riastrad 	0xf0b1, 0xffffffff, 0x00000100,
    620  1.1  riastrad 	0x1579, 0xffffffff, 0x00200100,
    621  1.1  riastrad 	0xf0a0, 0xffffffff, 0x00000100,
    622  1.1  riastrad 	0xf085, 0xffffffff, 0x06000100,
    623  1.1  riastrad 	0xf088, 0xffffffff, 0x00000100,
    624  1.1  riastrad 	0xf086, 0xffffffff, 0x06000100,
    625  1.1  riastrad 	0xf081, 0xffffffff, 0x00000100,
    626  1.1  riastrad 	0xf0b8, 0xffffffff, 0x00000100,
    627  1.1  riastrad 	0xf089, 0xffffffff, 0x00000100,
    628  1.1  riastrad 	0xf080, 0xffffffff, 0x00000100,
    629  1.1  riastrad 	0xf08c, 0xffffffff, 0x00000100,
    630  1.1  riastrad 	0xf08d, 0xffffffff, 0x00000100,
    631  1.1  riastrad 	0xf094, 0xffffffff, 0x00000100,
    632  1.1  riastrad 	0xf095, 0xffffffff, 0x00000100,
    633  1.1  riastrad 	0xf096, 0xffffffff, 0x00000100,
    634  1.1  riastrad 	0xf097, 0xffffffff, 0x00000100,
    635  1.1  riastrad 	0xf098, 0xffffffff, 0x00000100,
    636  1.1  riastrad 	0xf09f, 0xffffffff, 0x00000100,
    637  1.1  riastrad 	0xf09e, 0xffffffff, 0x00000100,
    638  1.1  riastrad 	0xf084, 0xffffffff, 0x06000100,
    639  1.1  riastrad 	0xf0a4, 0xffffffff, 0x00000100,
    640  1.1  riastrad 	0xf09d, 0xffffffff, 0x00000100,
    641  1.1  riastrad 	0xf0ad, 0xffffffff, 0x00000100,
    642  1.1  riastrad 	0xf0ac, 0xffffffff, 0x00000100,
    643  1.1  riastrad 	0xf09c, 0xffffffff, 0x00000100,
    644  1.1  riastrad 	0xc200, 0xffffffff, 0xe0000000,
    645  1.1  riastrad 	0xf008, 0xffffffff, 0x00010000,
    646  1.1  riastrad 	0xf009, 0xffffffff, 0x00030002,
    647  1.1  riastrad 	0xf00a, 0xffffffff, 0x00040007,
    648  1.1  riastrad 	0xf00b, 0xffffffff, 0x00060005,
    649  1.1  riastrad 	0xf00c, 0xffffffff, 0x00090008,
    650  1.1  riastrad 	0xf00d, 0xffffffff, 0x00010000,
    651  1.1  riastrad 	0xf00e, 0xffffffff, 0x00030002,
    652  1.1  riastrad 	0xf00f, 0xffffffff, 0x00040007,
    653  1.1  riastrad 	0xf010, 0xffffffff, 0x00060005,
    654  1.1  riastrad 	0xf011, 0xffffffff, 0x00090008,
    655  1.1  riastrad 	0xf012, 0xffffffff, 0x00010000,
    656  1.1  riastrad 	0xf013, 0xffffffff, 0x00030002,
    657  1.1  riastrad 	0xf014, 0xffffffff, 0x00040007,
    658  1.1  riastrad 	0xf015, 0xffffffff, 0x00060005,
    659  1.1  riastrad 	0xf016, 0xffffffff, 0x00090008,
    660  1.1  riastrad 	0xf017, 0xffffffff, 0x00010000,
    661  1.1  riastrad 	0xf018, 0xffffffff, 0x00030002,
    662  1.1  riastrad 	0xf019, 0xffffffff, 0x00040007,
    663  1.1  riastrad 	0xf01a, 0xffffffff, 0x00060005,
    664  1.1  riastrad 	0xf01b, 0xffffffff, 0x00090008,
    665  1.1  riastrad 	0xf01c, 0xffffffff, 0x00010000,
    666  1.1  riastrad 	0xf01d, 0xffffffff, 0x00030002,
    667  1.1  riastrad 	0xf01e, 0xffffffff, 0x00040007,
    668  1.1  riastrad 	0xf01f, 0xffffffff, 0x00060005,
    669  1.1  riastrad 	0xf020, 0xffffffff, 0x00090008,
    670  1.1  riastrad 	0xf021, 0xffffffff, 0x00010000,
    671  1.1  riastrad 	0xf022, 0xffffffff, 0x00030002,
    672  1.1  riastrad 	0xf023, 0xffffffff, 0x00040007,
    673  1.1  riastrad 	0xf024, 0xffffffff, 0x00060005,
    674  1.1  riastrad 	0xf025, 0xffffffff, 0x00090008,
    675  1.1  riastrad 	0xf026, 0xffffffff, 0x00010000,
    676  1.1  riastrad 	0xf027, 0xffffffff, 0x00030002,
    677  1.1  riastrad 	0xf028, 0xffffffff, 0x00040007,
    678  1.1  riastrad 	0xf029, 0xffffffff, 0x00060005,
    679  1.1  riastrad 	0xf02a, 0xffffffff, 0x00090008,
    680  1.1  riastrad 	0xf02b, 0xffffffff, 0x00010000,
    681  1.1  riastrad 	0xf02c, 0xffffffff, 0x00030002,
    682  1.1  riastrad 	0xf02d, 0xffffffff, 0x00040007,
    683  1.1  riastrad 	0xf02e, 0xffffffff, 0x00060005,
    684  1.1  riastrad 	0xf02f, 0xffffffff, 0x00090008,
    685  1.1  riastrad 	0xf030, 0xffffffff, 0x00010000,
    686  1.1  riastrad 	0xf031, 0xffffffff, 0x00030002,
    687  1.1  riastrad 	0xf032, 0xffffffff, 0x00040007,
    688  1.1  riastrad 	0xf033, 0xffffffff, 0x00060005,
    689  1.1  riastrad 	0xf034, 0xffffffff, 0x00090008,
    690  1.1  riastrad 	0xf035, 0xffffffff, 0x00010000,
    691  1.1  riastrad 	0xf036, 0xffffffff, 0x00030002,
    692  1.1  riastrad 	0xf037, 0xffffffff, 0x00040007,
    693  1.1  riastrad 	0xf038, 0xffffffff, 0x00060005,
    694  1.1  riastrad 	0xf039, 0xffffffff, 0x00090008,
    695  1.1  riastrad 	0xf03a, 0xffffffff, 0x00010000,
    696  1.1  riastrad 	0xf03b, 0xffffffff, 0x00030002,
    697  1.1  riastrad 	0xf03c, 0xffffffff, 0x00040007,
    698  1.1  riastrad 	0xf03d, 0xffffffff, 0x00060005,
    699  1.1  riastrad 	0xf03e, 0xffffffff, 0x00090008,
    700  1.1  riastrad 	0x30c6, 0xffffffff, 0x00020200,
    701  1.1  riastrad 	0xcd4, 0xffffffff, 0x00000200,
    702  1.1  riastrad 	0x570, 0xffffffff, 0x00000400,
    703  1.1  riastrad 	0x157a, 0xffffffff, 0x00000000,
    704  1.1  riastrad 	0xbd4, 0xffffffff, 0x00000902,
    705  1.1  riastrad 	0xf000, 0xffffffff, 0x96940200,
    706  1.1  riastrad 	0x21c2, 0xffffffff, 0x00900100,
    707  1.1  riastrad 	0x3109, 0xffffffff, 0x0020003f,
    708  1.1  riastrad 	0xe, 0xffffffff, 0x0140001c,
    709  1.1  riastrad 	0xf, 0x000f0000, 0x000f0000,
    710  1.1  riastrad 	0x88, 0xffffffff, 0xc060000c,
    711  1.1  riastrad 	0x89, 0xc0000fff, 0x00000100,
    712  1.1  riastrad 	0x3e4, 0xffffffff, 0x00000100,
    713  1.1  riastrad 	0x3e6, 0x00000101, 0x00000000,
    714  1.1  riastrad 	0x82a, 0xffffffff, 0x00000104,
    715  1.1  riastrad 	0x1579, 0xff000fff, 0x00000100,
    716  1.1  riastrad 	0xc33, 0xc0000fff, 0x00000104,
    717  1.1  riastrad 	0x3079, 0x00000001, 0x00000001,
    718  1.1  riastrad 	0x3403, 0xff000ff0, 0x00000100,
    719  1.1  riastrad 	0x3603, 0xff000ff0, 0x00000100
    720  1.1  riastrad };
    721  1.1  riastrad 
    722  1.1  riastrad static const u32 godavari_golden_registers[] =
    723  1.1  riastrad {
    724  1.1  riastrad 	0x1579, 0xff607fff, 0xfc000100,
    725  1.1  riastrad 	0x1bb6, 0x00010101, 0x00010000,
    726  1.1  riastrad 	0x260c, 0xffffffff, 0x00000000,
    727  1.1  riastrad 	0x260c0, 0xf00fffff, 0x00000400,
    728  1.1  riastrad 	0x184c, 0xffffffff, 0x00010000,
    729  1.1  riastrad 	0x16ec, 0x000000f0, 0x00000070,
    730  1.1  riastrad 	0x16f0, 0xf0311fff, 0x80300000,
    731  1.1  riastrad 	0x263e, 0x73773777, 0x12010001,
    732  1.1  riastrad 	0x263f, 0xffffffff, 0x00000010,
    733  1.1  riastrad 	0x200c, 0x00001f0f, 0x0000100a,
    734  1.1  riastrad 	0xbd2, 0x73773777, 0x12010001,
    735  1.1  riastrad 	0x902, 0x000fffff, 0x000c007f,
    736  1.1  riastrad 	0x2285, 0xf000003f, 0x00000007,
    737  1.1  riastrad 	0x22c9, 0xffffffff, 0x00ff0fff,
    738  1.1  riastrad 	0xc281, 0x0000ff0f, 0x00000000,
    739  1.1  riastrad 	0xa293, 0x07ffffff, 0x06000000,
    740  1.1  riastrad 	0x136, 0x00000fff, 0x00000100,
    741  1.1  riastrad 	0x3405, 0x00010000, 0x00810001,
    742  1.1  riastrad 	0x3605, 0x00010000, 0x00810001,
    743  1.1  riastrad 	0xf9e, 0x00000001, 0x00000002,
    744  1.1  riastrad 	0x31da, 0x00000008, 0x00000008,
    745  1.1  riastrad 	0x31dc, 0x00000f00, 0x00000800,
    746  1.1  riastrad 	0x31dd, 0x00000f00, 0x00000800,
    747  1.1  riastrad 	0x31e6, 0x00ffffff, 0x00ff7fbf,
    748  1.1  riastrad 	0x31e7, 0x00ffffff, 0x00ff7faf,
    749  1.1  riastrad 	0x2300, 0x000000ff, 0x00000001,
    750  1.1  riastrad 	0x853e, 0x01ff01ff, 0x00000002,
    751  1.1  riastrad 	0x8526, 0x007ff800, 0x00200000,
    752  1.1  riastrad 	0x8057, 0xffffffff, 0x00000f40,
    753  1.1  riastrad 	0x2231, 0x001f3ae3, 0x00000082,
    754  1.1  riastrad 	0x2235, 0x0000001f, 0x00000010,
    755  1.1  riastrad 	0xc24d, 0xffffffff, 0x00000000
    756  1.1  riastrad };
    757  1.1  riastrad 
    758  1.1  riastrad static void cik_init_golden_registers(struct amdgpu_device *adev)
    759  1.1  riastrad {
    760  1.1  riastrad 	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
    761  1.1  riastrad 	mutex_lock(&adev->grbm_idx_mutex);
    762  1.1  riastrad 
    763  1.1  riastrad 	switch (adev->asic_type) {
    764  1.1  riastrad 	case CHIP_BONAIRE:
    765  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    766  1.4  riastrad 							bonaire_mgcg_cgcg_init,
    767  1.4  riastrad 							ARRAY_SIZE(bonaire_mgcg_cgcg_init));
    768  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    769  1.4  riastrad 							bonaire_golden_registers,
    770  1.4  riastrad 							ARRAY_SIZE(bonaire_golden_registers));
    771  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    772  1.4  riastrad 							bonaire_golden_common_registers,
    773  1.4  riastrad 							ARRAY_SIZE(bonaire_golden_common_registers));
    774  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    775  1.4  riastrad 							bonaire_golden_spm_registers,
    776  1.4  riastrad 							ARRAY_SIZE(bonaire_golden_spm_registers));
    777  1.1  riastrad 		break;
    778  1.1  riastrad 	case CHIP_KABINI:
    779  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    780  1.4  riastrad 							kalindi_mgcg_cgcg_init,
    781  1.4  riastrad 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
    782  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    783  1.4  riastrad 							kalindi_golden_registers,
    784  1.4  riastrad 							ARRAY_SIZE(kalindi_golden_registers));
    785  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    786  1.4  riastrad 							kalindi_golden_common_registers,
    787  1.4  riastrad 							ARRAY_SIZE(kalindi_golden_common_registers));
    788  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    789  1.4  riastrad 							kalindi_golden_spm_registers,
    790  1.4  riastrad 							ARRAY_SIZE(kalindi_golden_spm_registers));
    791  1.1  riastrad 		break;
    792  1.1  riastrad 	case CHIP_MULLINS:
    793  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    794  1.4  riastrad 							kalindi_mgcg_cgcg_init,
    795  1.4  riastrad 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
    796  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    797  1.4  riastrad 							godavari_golden_registers,
    798  1.4  riastrad 							ARRAY_SIZE(godavari_golden_registers));
    799  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    800  1.4  riastrad 							kalindi_golden_common_registers,
    801  1.4  riastrad 							ARRAY_SIZE(kalindi_golden_common_registers));
    802  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    803  1.4  riastrad 							kalindi_golden_spm_registers,
    804  1.4  riastrad 							ARRAY_SIZE(kalindi_golden_spm_registers));
    805  1.1  riastrad 		break;
    806  1.1  riastrad 	case CHIP_KAVERI:
    807  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    808  1.4  riastrad 							spectre_mgcg_cgcg_init,
    809  1.4  riastrad 							ARRAY_SIZE(spectre_mgcg_cgcg_init));
    810  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    811  1.4  riastrad 							spectre_golden_registers,
    812  1.4  riastrad 							ARRAY_SIZE(spectre_golden_registers));
    813  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    814  1.4  riastrad 							spectre_golden_common_registers,
    815  1.4  riastrad 							ARRAY_SIZE(spectre_golden_common_registers));
    816  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    817  1.4  riastrad 							spectre_golden_spm_registers,
    818  1.4  riastrad 							ARRAY_SIZE(spectre_golden_spm_registers));
    819  1.1  riastrad 		break;
    820  1.1  riastrad 	case CHIP_HAWAII:
    821  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    822  1.4  riastrad 							hawaii_mgcg_cgcg_init,
    823  1.4  riastrad 							ARRAY_SIZE(hawaii_mgcg_cgcg_init));
    824  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    825  1.4  riastrad 							hawaii_golden_registers,
    826  1.4  riastrad 							ARRAY_SIZE(hawaii_golden_registers));
    827  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    828  1.4  riastrad 							hawaii_golden_common_registers,
    829  1.4  riastrad 							ARRAY_SIZE(hawaii_golden_common_registers));
    830  1.4  riastrad 		amdgpu_device_program_register_sequence(adev,
    831  1.4  riastrad 							hawaii_golden_spm_registers,
    832  1.4  riastrad 							ARRAY_SIZE(hawaii_golden_spm_registers));
    833  1.1  riastrad 		break;
    834  1.1  riastrad 	default:
    835  1.1  riastrad 		break;
    836  1.1  riastrad 	}
    837  1.1  riastrad 	mutex_unlock(&adev->grbm_idx_mutex);
    838  1.1  riastrad }
    839  1.1  riastrad 
    840  1.1  riastrad /**
    841  1.1  riastrad  * cik_get_xclk - get the xclk
    842  1.1  riastrad  *
    843  1.1  riastrad  * @adev: amdgpu_device pointer
    844  1.1  riastrad  *
    845  1.1  riastrad  * Returns the reference clock used by the gfx engine
    846  1.1  riastrad  * (CIK).
    847  1.1  riastrad  */
    848  1.1  riastrad static u32 cik_get_xclk(struct amdgpu_device *adev)
    849  1.1  riastrad {
    850  1.1  riastrad 	u32 reference_clock = adev->clock.spll.reference_freq;
    851  1.1  riastrad 
    852  1.1  riastrad 	if (adev->flags & AMD_IS_APU) {
    853  1.1  riastrad 		if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
    854  1.1  riastrad 			return reference_clock / 2;
    855  1.1  riastrad 	} else {
    856  1.1  riastrad 		if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
    857  1.1  riastrad 			return reference_clock / 4;
    858  1.1  riastrad 	}
    859  1.1  riastrad 	return reference_clock;
    860  1.1  riastrad }
    861  1.1  riastrad 
    862  1.1  riastrad /**
    863  1.1  riastrad  * cik_srbm_select - select specific register instances
    864  1.1  riastrad  *
    865  1.1  riastrad  * @adev: amdgpu_device pointer
    866  1.1  riastrad  * @me: selected ME (micro engine)
    867  1.1  riastrad  * @pipe: pipe
    868  1.1  riastrad  * @queue: queue
    869  1.1  riastrad  * @vmid: VMID
    870  1.1  riastrad  *
    871  1.1  riastrad  * Switches the currently active registers instances.  Some
    872  1.1  riastrad  * registers are instanced per VMID, others are instanced per
    873  1.1  riastrad  * me/pipe/queue combination.
    874  1.1  riastrad  */
    875  1.1  riastrad void cik_srbm_select(struct amdgpu_device *adev,
    876  1.1  riastrad 		     u32 me, u32 pipe, u32 queue, u32 vmid)
    877  1.1  riastrad {
    878  1.1  riastrad 	u32 srbm_gfx_cntl =
    879  1.1  riastrad 		(((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
    880  1.1  riastrad 		((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
    881  1.1  riastrad 		((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
    882  1.1  riastrad 		((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
    883  1.1  riastrad 	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
    884  1.1  riastrad }
    885  1.1  riastrad 
    886  1.1  riastrad static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
    887  1.1  riastrad {
    888  1.1  riastrad 	uint32_t tmp;
    889  1.1  riastrad 
    890  1.1  riastrad 	tmp = RREG32(mmCONFIG_CNTL);
    891  1.4  riastrad 	if (!state)
    892  1.1  riastrad 		tmp |= CONFIG_CNTL__VGA_DIS_MASK;
    893  1.1  riastrad 	else
    894  1.1  riastrad 		tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
    895  1.1  riastrad 	WREG32(mmCONFIG_CNTL, tmp);
    896  1.1  riastrad }
    897  1.1  riastrad 
    898  1.1  riastrad static bool cik_read_disabled_bios(struct amdgpu_device *adev)
    899  1.1  riastrad {
    900  1.1  riastrad 	u32 bus_cntl;
    901  1.1  riastrad 	u32 d1vga_control = 0;
    902  1.1  riastrad 	u32 d2vga_control = 0;
    903  1.1  riastrad 	u32 vga_render_control = 0;
    904  1.1  riastrad 	u32 rom_cntl;
    905  1.1  riastrad 	bool r;
    906  1.1  riastrad 
    907  1.1  riastrad 	bus_cntl = RREG32(mmBUS_CNTL);
    908  1.1  riastrad 	if (adev->mode_info.num_crtc) {
    909  1.1  riastrad 		d1vga_control = RREG32(mmD1VGA_CONTROL);
    910  1.1  riastrad 		d2vga_control = RREG32(mmD2VGA_CONTROL);
    911  1.1  riastrad 		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
    912  1.1  riastrad 	}
    913  1.1  riastrad 	rom_cntl = RREG32_SMC(ixROM_CNTL);
    914  1.1  riastrad 
    915  1.1  riastrad 	/* enable the rom */
    916  1.1  riastrad 	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
    917  1.1  riastrad 	if (adev->mode_info.num_crtc) {
    918  1.1  riastrad 		/* Disable VGA mode */
    919  1.1  riastrad 		WREG32(mmD1VGA_CONTROL,
    920  1.1  riastrad 		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
    921  1.1  riastrad 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
    922  1.1  riastrad 		WREG32(mmD2VGA_CONTROL,
    923  1.1  riastrad 		       (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
    924  1.1  riastrad 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
    925  1.1  riastrad 		WREG32(mmVGA_RENDER_CONTROL,
    926  1.1  riastrad 		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
    927  1.1  riastrad 	}
    928  1.1  riastrad 	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
    929  1.1  riastrad 
    930  1.1  riastrad 	r = amdgpu_read_bios(adev);
    931  1.1  riastrad 
    932  1.1  riastrad 	/* restore regs */
    933  1.1  riastrad 	WREG32(mmBUS_CNTL, bus_cntl);
    934  1.1  riastrad 	if (adev->mode_info.num_crtc) {
    935  1.1  riastrad 		WREG32(mmD1VGA_CONTROL, d1vga_control);
    936  1.1  riastrad 		WREG32(mmD2VGA_CONTROL, d2vga_control);
    937  1.1  riastrad 		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
    938  1.1  riastrad 	}
    939  1.1  riastrad 	WREG32_SMC(ixROM_CNTL, rom_cntl);
    940  1.1  riastrad 	return r;
    941  1.1  riastrad }
    942  1.1  riastrad 
    943  1.4  riastrad static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
    944  1.4  riastrad 				   u8 *bios, u32 length_bytes)
    945  1.1  riastrad {
    946  1.4  riastrad 	u32 *dw_ptr;
    947  1.4  riastrad 	unsigned long flags;
    948  1.4  riastrad 	u32 i, length_dw;
    949  1.4  riastrad 
    950  1.4  riastrad 	if (bios == NULL)
    951  1.4  riastrad 		return false;
    952  1.4  riastrad 	if (length_bytes == 0)
    953  1.4  riastrad 		return false;
    954  1.4  riastrad 	/* APU vbios image is part of sbios image */
    955  1.4  riastrad 	if (adev->flags & AMD_IS_APU)
    956  1.4  riastrad 		return false;
    957  1.1  riastrad 
    958  1.4  riastrad 	dw_ptr = (u32 *)bios;
    959  1.4  riastrad 	length_dw = ALIGN(length_bytes, 4) / 4;
    960  1.4  riastrad 	/* take the smc lock since we are using the smc index */
    961  1.4  riastrad 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
    962  1.4  riastrad 	/* set rom index to 0 */
    963  1.4  riastrad 	WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
    964  1.4  riastrad 	WREG32(mmSMC_IND_DATA_0, 0);
    965  1.4  riastrad 	/* set index to data for continous read */
    966  1.4  riastrad 	WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
    967  1.4  riastrad 	for (i = 0; i < length_dw; i++)
    968  1.4  riastrad 		dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
    969  1.4  riastrad 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
    970  1.4  riastrad 
    971  1.4  riastrad 	return true;
    972  1.4  riastrad }
    973  1.1  riastrad 
    974  1.4  riastrad static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
    975  1.4  riastrad 	{mmGRBM_STATUS},
    976  1.4  riastrad 	{mmGRBM_STATUS2},
    977  1.4  riastrad 	{mmGRBM_STATUS_SE0},
    978  1.4  riastrad 	{mmGRBM_STATUS_SE1},
    979  1.4  riastrad 	{mmGRBM_STATUS_SE2},
    980  1.4  riastrad 	{mmGRBM_STATUS_SE3},
    981  1.4  riastrad 	{mmSRBM_STATUS},
    982  1.4  riastrad 	{mmSRBM_STATUS2},
    983  1.4  riastrad 	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
    984  1.4  riastrad 	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
    985  1.4  riastrad 	{mmCP_STAT},
    986  1.4  riastrad 	{mmCP_STALLED_STAT1},
    987  1.4  riastrad 	{mmCP_STALLED_STAT2},
    988  1.4  riastrad 	{mmCP_STALLED_STAT3},
    989  1.4  riastrad 	{mmCP_CPF_BUSY_STAT},
    990  1.4  riastrad 	{mmCP_CPF_STALLED_STAT1},
    991  1.4  riastrad 	{mmCP_CPF_STATUS},
    992  1.4  riastrad 	{mmCP_CPC_BUSY_STAT},
    993  1.4  riastrad 	{mmCP_CPC_STALLED_STAT1},
    994  1.4  riastrad 	{mmCP_CPC_STATUS},
    995  1.4  riastrad 	{mmGB_ADDR_CONFIG},
    996  1.4  riastrad 	{mmMC_ARB_RAMCFG},
    997  1.4  riastrad 	{mmGB_TILE_MODE0},
    998  1.4  riastrad 	{mmGB_TILE_MODE1},
    999  1.4  riastrad 	{mmGB_TILE_MODE2},
   1000  1.4  riastrad 	{mmGB_TILE_MODE3},
   1001  1.4  riastrad 	{mmGB_TILE_MODE4},
   1002  1.4  riastrad 	{mmGB_TILE_MODE5},
   1003  1.4  riastrad 	{mmGB_TILE_MODE6},
   1004  1.4  riastrad 	{mmGB_TILE_MODE7},
   1005  1.4  riastrad 	{mmGB_TILE_MODE8},
   1006  1.4  riastrad 	{mmGB_TILE_MODE9},
   1007  1.4  riastrad 	{mmGB_TILE_MODE10},
   1008  1.4  riastrad 	{mmGB_TILE_MODE11},
   1009  1.4  riastrad 	{mmGB_TILE_MODE12},
   1010  1.4  riastrad 	{mmGB_TILE_MODE13},
   1011  1.4  riastrad 	{mmGB_TILE_MODE14},
   1012  1.4  riastrad 	{mmGB_TILE_MODE15},
   1013  1.4  riastrad 	{mmGB_TILE_MODE16},
   1014  1.4  riastrad 	{mmGB_TILE_MODE17},
   1015  1.4  riastrad 	{mmGB_TILE_MODE18},
   1016  1.4  riastrad 	{mmGB_TILE_MODE19},
   1017  1.4  riastrad 	{mmGB_TILE_MODE20},
   1018  1.4  riastrad 	{mmGB_TILE_MODE21},
   1019  1.4  riastrad 	{mmGB_TILE_MODE22},
   1020  1.4  riastrad 	{mmGB_TILE_MODE23},
   1021  1.4  riastrad 	{mmGB_TILE_MODE24},
   1022  1.4  riastrad 	{mmGB_TILE_MODE25},
   1023  1.4  riastrad 	{mmGB_TILE_MODE26},
   1024  1.4  riastrad 	{mmGB_TILE_MODE27},
   1025  1.4  riastrad 	{mmGB_TILE_MODE28},
   1026  1.4  riastrad 	{mmGB_TILE_MODE29},
   1027  1.4  riastrad 	{mmGB_TILE_MODE30},
   1028  1.4  riastrad 	{mmGB_TILE_MODE31},
   1029  1.4  riastrad 	{mmGB_MACROTILE_MODE0},
   1030  1.4  riastrad 	{mmGB_MACROTILE_MODE1},
   1031  1.4  riastrad 	{mmGB_MACROTILE_MODE2},
   1032  1.4  riastrad 	{mmGB_MACROTILE_MODE3},
   1033  1.4  riastrad 	{mmGB_MACROTILE_MODE4},
   1034  1.4  riastrad 	{mmGB_MACROTILE_MODE5},
   1035  1.4  riastrad 	{mmGB_MACROTILE_MODE6},
   1036  1.4  riastrad 	{mmGB_MACROTILE_MODE7},
   1037  1.4  riastrad 	{mmGB_MACROTILE_MODE8},
   1038  1.4  riastrad 	{mmGB_MACROTILE_MODE9},
   1039  1.4  riastrad 	{mmGB_MACROTILE_MODE10},
   1040  1.4  riastrad 	{mmGB_MACROTILE_MODE11},
   1041  1.4  riastrad 	{mmGB_MACROTILE_MODE12},
   1042  1.4  riastrad 	{mmGB_MACROTILE_MODE13},
   1043  1.4  riastrad 	{mmGB_MACROTILE_MODE14},
   1044  1.4  riastrad 	{mmGB_MACROTILE_MODE15},
   1045  1.4  riastrad 	{mmCC_RB_BACKEND_DISABLE, true},
   1046  1.4  riastrad 	{mmGC_USER_RB_BACKEND_DISABLE, true},
   1047  1.4  riastrad 	{mmGB_BACKEND_MAP, false},
   1048  1.4  riastrad 	{mmPA_SC_RASTER_CONFIG, true},
   1049  1.4  riastrad 	{mmPA_SC_RASTER_CONFIG_1, true},
   1050  1.4  riastrad };
   1051  1.4  riastrad 
   1052  1.4  riastrad 
   1053  1.4  riastrad static uint32_t cik_get_register_value(struct amdgpu_device *adev,
   1054  1.4  riastrad 				       bool indexed, u32 se_num,
   1055  1.4  riastrad 				       u32 sh_num, u32 reg_offset)
   1056  1.4  riastrad {
   1057  1.4  riastrad 	if (indexed) {
   1058  1.4  riastrad 		uint32_t val;
   1059  1.4  riastrad 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
   1060  1.4  riastrad 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
   1061  1.4  riastrad 
   1062  1.4  riastrad 		switch (reg_offset) {
   1063  1.4  riastrad 		case mmCC_RB_BACKEND_DISABLE:
   1064  1.4  riastrad 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
   1065  1.4  riastrad 		case mmGC_USER_RB_BACKEND_DISABLE:
   1066  1.4  riastrad 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
   1067  1.4  riastrad 		case mmPA_SC_RASTER_CONFIG:
   1068  1.4  riastrad 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
   1069  1.4  riastrad 		case mmPA_SC_RASTER_CONFIG_1:
   1070  1.4  riastrad 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
   1071  1.4  riastrad 		}
   1072  1.1  riastrad 
   1073  1.4  riastrad 		mutex_lock(&adev->grbm_idx_mutex);
   1074  1.4  riastrad 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
   1075  1.4  riastrad 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
   1076  1.4  riastrad 
   1077  1.4  riastrad 		val = RREG32(reg_offset);
   1078  1.4  riastrad 
   1079  1.4  riastrad 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
   1080  1.4  riastrad 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
   1081  1.4  riastrad 		mutex_unlock(&adev->grbm_idx_mutex);
   1082  1.4  riastrad 		return val;
   1083  1.4  riastrad 	} else {
   1084  1.4  riastrad 		unsigned idx;
   1085  1.4  riastrad 
   1086  1.4  riastrad 		switch (reg_offset) {
   1087  1.4  riastrad 		case mmGB_ADDR_CONFIG:
   1088  1.4  riastrad 			return adev->gfx.config.gb_addr_config;
   1089  1.4  riastrad 		case mmMC_ARB_RAMCFG:
   1090  1.4  riastrad 			return adev->gfx.config.mc_arb_ramcfg;
   1091  1.4  riastrad 		case mmGB_TILE_MODE0:
   1092  1.4  riastrad 		case mmGB_TILE_MODE1:
   1093  1.4  riastrad 		case mmGB_TILE_MODE2:
   1094  1.4  riastrad 		case mmGB_TILE_MODE3:
   1095  1.4  riastrad 		case mmGB_TILE_MODE4:
   1096  1.4  riastrad 		case mmGB_TILE_MODE5:
   1097  1.4  riastrad 		case mmGB_TILE_MODE6:
   1098  1.4  riastrad 		case mmGB_TILE_MODE7:
   1099  1.4  riastrad 		case mmGB_TILE_MODE8:
   1100  1.4  riastrad 		case mmGB_TILE_MODE9:
   1101  1.4  riastrad 		case mmGB_TILE_MODE10:
   1102  1.4  riastrad 		case mmGB_TILE_MODE11:
   1103  1.4  riastrad 		case mmGB_TILE_MODE12:
   1104  1.4  riastrad 		case mmGB_TILE_MODE13:
   1105  1.4  riastrad 		case mmGB_TILE_MODE14:
   1106  1.4  riastrad 		case mmGB_TILE_MODE15:
   1107  1.4  riastrad 		case mmGB_TILE_MODE16:
   1108  1.4  riastrad 		case mmGB_TILE_MODE17:
   1109  1.4  riastrad 		case mmGB_TILE_MODE18:
   1110  1.4  riastrad 		case mmGB_TILE_MODE19:
   1111  1.4  riastrad 		case mmGB_TILE_MODE20:
   1112  1.4  riastrad 		case mmGB_TILE_MODE21:
   1113  1.4  riastrad 		case mmGB_TILE_MODE22:
   1114  1.4  riastrad 		case mmGB_TILE_MODE23:
   1115  1.4  riastrad 		case mmGB_TILE_MODE24:
   1116  1.4  riastrad 		case mmGB_TILE_MODE25:
   1117  1.4  riastrad 		case mmGB_TILE_MODE26:
   1118  1.4  riastrad 		case mmGB_TILE_MODE27:
   1119  1.4  riastrad 		case mmGB_TILE_MODE28:
   1120  1.4  riastrad 		case mmGB_TILE_MODE29:
   1121  1.4  riastrad 		case mmGB_TILE_MODE30:
   1122  1.4  riastrad 		case mmGB_TILE_MODE31:
   1123  1.4  riastrad 			idx = (reg_offset - mmGB_TILE_MODE0);
   1124  1.4  riastrad 			return adev->gfx.config.tile_mode_array[idx];
   1125  1.4  riastrad 		case mmGB_MACROTILE_MODE0:
   1126  1.4  riastrad 		case mmGB_MACROTILE_MODE1:
   1127  1.4  riastrad 		case mmGB_MACROTILE_MODE2:
   1128  1.4  riastrad 		case mmGB_MACROTILE_MODE3:
   1129  1.4  riastrad 		case mmGB_MACROTILE_MODE4:
   1130  1.4  riastrad 		case mmGB_MACROTILE_MODE5:
   1131  1.4  riastrad 		case mmGB_MACROTILE_MODE6:
   1132  1.4  riastrad 		case mmGB_MACROTILE_MODE7:
   1133  1.4  riastrad 		case mmGB_MACROTILE_MODE8:
   1134  1.4  riastrad 		case mmGB_MACROTILE_MODE9:
   1135  1.4  riastrad 		case mmGB_MACROTILE_MODE10:
   1136  1.4  riastrad 		case mmGB_MACROTILE_MODE11:
   1137  1.4  riastrad 		case mmGB_MACROTILE_MODE12:
   1138  1.4  riastrad 		case mmGB_MACROTILE_MODE13:
   1139  1.4  riastrad 		case mmGB_MACROTILE_MODE14:
   1140  1.4  riastrad 		case mmGB_MACROTILE_MODE15:
   1141  1.4  riastrad 			idx = (reg_offset - mmGB_MACROTILE_MODE0);
   1142  1.4  riastrad 			return adev->gfx.config.macrotile_mode_array[idx];
   1143  1.4  riastrad 		default:
   1144  1.4  riastrad 			return RREG32(reg_offset);
   1145  1.4  riastrad 		}
   1146  1.4  riastrad 	}
   1147  1.1  riastrad }
   1148  1.1  riastrad 
   1149  1.1  riastrad static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
   1150  1.1  riastrad 			     u32 sh_num, u32 reg_offset, u32 *value)
   1151  1.1  riastrad {
   1152  1.1  riastrad 	uint32_t i;
   1153  1.1  riastrad 
   1154  1.1  riastrad 	*value = 0;
   1155  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
   1156  1.4  riastrad 		bool indexed = cik_allowed_read_registers[i].grbm_indexed;
   1157  1.4  riastrad 
   1158  1.1  riastrad 		if (reg_offset != cik_allowed_read_registers[i].reg_offset)
   1159  1.1  riastrad 			continue;
   1160  1.1  riastrad 
   1161  1.4  riastrad 		*value = cik_get_register_value(adev, indexed, se_num, sh_num,
   1162  1.4  riastrad 						reg_offset);
   1163  1.1  riastrad 		return 0;
   1164  1.1  riastrad 	}
   1165  1.1  riastrad 	return -EINVAL;
   1166  1.1  riastrad }
   1167  1.1  riastrad 
   1168  1.1  riastrad struct kv_reset_save_regs {
   1169  1.1  riastrad 	u32 gmcon_reng_execute;
   1170  1.1  riastrad 	u32 gmcon_misc;
   1171  1.1  riastrad 	u32 gmcon_misc3;
   1172  1.1  riastrad };
   1173  1.1  riastrad 
   1174  1.1  riastrad static void kv_save_regs_for_reset(struct amdgpu_device *adev,
   1175  1.1  riastrad 				   struct kv_reset_save_regs *save)
   1176  1.1  riastrad {
   1177  1.1  riastrad 	save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
   1178  1.1  riastrad 	save->gmcon_misc = RREG32(mmGMCON_MISC);
   1179  1.1  riastrad 	save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
   1180  1.1  riastrad 
   1181  1.1  riastrad 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
   1182  1.1  riastrad 		~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
   1183  1.1  riastrad 	WREG32(mmGMCON_MISC, save->gmcon_misc &
   1184  1.1  riastrad 		~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
   1185  1.1  riastrad 			GMCON_MISC__STCTRL_STUTTER_EN_MASK));
   1186  1.1  riastrad }
   1187  1.1  riastrad 
   1188  1.1  riastrad static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
   1189  1.1  riastrad 				      struct kv_reset_save_regs *save)
   1190  1.1  riastrad {
   1191  1.1  riastrad 	int i;
   1192  1.1  riastrad 
   1193  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0);
   1194  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
   1195  1.1  riastrad 
   1196  1.1  riastrad 	for (i = 0; i < 5; i++)
   1197  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1198  1.1  riastrad 
   1199  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0);
   1200  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
   1201  1.1  riastrad 
   1202  1.1  riastrad 	for (i = 0; i < 5; i++)
   1203  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1204  1.1  riastrad 
   1205  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
   1206  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
   1207  1.1  riastrad 
   1208  1.1  riastrad 	for (i = 0; i < 5; i++)
   1209  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1210  1.1  riastrad 
   1211  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
   1212  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
   1213  1.1  riastrad 
   1214  1.1  riastrad 	for (i = 0; i < 5; i++)
   1215  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1216  1.1  riastrad 
   1217  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
   1218  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
   1219  1.1  riastrad 
   1220  1.1  riastrad 	for (i = 0; i < 5; i++)
   1221  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1222  1.1  riastrad 
   1223  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0);
   1224  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
   1225  1.1  riastrad 
   1226  1.1  riastrad 	for (i = 0; i < 5; i++)
   1227  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1228  1.1  riastrad 
   1229  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
   1230  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
   1231  1.1  riastrad 
   1232  1.1  riastrad 	for (i = 0; i < 5; i++)
   1233  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1234  1.1  riastrad 
   1235  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
   1236  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
   1237  1.1  riastrad 
   1238  1.1  riastrad 	for (i = 0; i < 5; i++)
   1239  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1240  1.1  riastrad 
   1241  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
   1242  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
   1243  1.1  riastrad 
   1244  1.1  riastrad 	for (i = 0; i < 5; i++)
   1245  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1246  1.1  riastrad 
   1247  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
   1248  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
   1249  1.1  riastrad 
   1250  1.1  riastrad 	for (i = 0; i < 5; i++)
   1251  1.1  riastrad 		WREG32(mmGMCON_PGFSM_WRITE, 0);
   1252  1.1  riastrad 
   1253  1.1  riastrad 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
   1254  1.1  riastrad 	WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
   1255  1.1  riastrad 
   1256  1.1  riastrad 	WREG32(mmGMCON_MISC3, save->gmcon_misc3);
   1257  1.1  riastrad 	WREG32(mmGMCON_MISC, save->gmcon_misc);
   1258  1.1  riastrad 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
   1259  1.1  riastrad }
   1260  1.1  riastrad 
   1261  1.4  riastrad static int cik_gpu_pci_config_reset(struct amdgpu_device *adev)
   1262  1.1  riastrad {
   1263  1.1  riastrad 	struct kv_reset_save_regs kv_save = { 0 };
   1264  1.4  riastrad 	u32 i;
   1265  1.4  riastrad 	int r = -EINVAL;
   1266  1.1  riastrad 
   1267  1.1  riastrad 	dev_info(adev->dev, "GPU pci config reset\n");
   1268  1.1  riastrad 
   1269  1.1  riastrad 	if (adev->flags & AMD_IS_APU)
   1270  1.1  riastrad 		kv_save_regs_for_reset(adev, &kv_save);
   1271  1.1  riastrad 
   1272  1.1  riastrad 	/* disable BM */
   1273  1.1  riastrad 	pci_clear_master(adev->pdev);
   1274  1.1  riastrad 	/* reset */
   1275  1.4  riastrad 	amdgpu_device_pci_config_reset(adev);
   1276  1.1  riastrad 
   1277  1.1  riastrad 	udelay(100);
   1278  1.1  riastrad 
   1279  1.1  riastrad 	/* wait for asic to come out of reset */
   1280  1.1  riastrad 	for (i = 0; i < adev->usec_timeout; i++) {
   1281  1.4  riastrad 		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
   1282  1.4  riastrad 			/* enable BM */
   1283  1.4  riastrad 			pci_set_master(adev->pdev);
   1284  1.4  riastrad 			adev->has_hw_reset = true;
   1285  1.4  riastrad 			r = 0;
   1286  1.1  riastrad 			break;
   1287  1.4  riastrad 		}
   1288  1.1  riastrad 		udelay(1);
   1289  1.1  riastrad 	}
   1290  1.1  riastrad 
   1291  1.1  riastrad 	/* does asic init need to be run first??? */
   1292  1.1  riastrad 	if (adev->flags & AMD_IS_APU)
   1293  1.1  riastrad 		kv_restore_regs_for_reset(adev, &kv_save);
   1294  1.4  riastrad 
   1295  1.4  riastrad 	return r;
   1296  1.1  riastrad }
   1297  1.1  riastrad 
   1298  1.4  riastrad /**
   1299  1.4  riastrad  * cik_asic_pci_config_reset - soft reset GPU
   1300  1.4  riastrad  *
   1301  1.4  riastrad  * @adev: amdgpu_device pointer
   1302  1.4  riastrad  *
   1303  1.4  riastrad  * Use PCI Config method to reset the GPU.
   1304  1.4  riastrad  *
   1305  1.4  riastrad  * Returns 0 for success.
   1306  1.4  riastrad  */
   1307  1.4  riastrad static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
   1308  1.4  riastrad {
   1309  1.4  riastrad 	int r;
   1310  1.4  riastrad 
   1311  1.4  riastrad 	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
   1312  1.4  riastrad 
   1313  1.4  riastrad 	r = cik_gpu_pci_config_reset(adev);
   1314  1.4  riastrad 
   1315  1.4  riastrad 	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
   1316  1.4  riastrad 
   1317  1.4  riastrad 	return r;
   1318  1.4  riastrad }
   1319  1.4  riastrad 
   1320  1.4  riastrad static bool cik_asic_supports_baco(struct amdgpu_device *adev)
   1321  1.4  riastrad {
   1322  1.4  riastrad 	switch (adev->asic_type) {
   1323  1.4  riastrad 	case CHIP_BONAIRE:
   1324  1.4  riastrad 	case CHIP_HAWAII:
   1325  1.4  riastrad 		return amdgpu_dpm_is_baco_supported(adev);
   1326  1.4  riastrad 	default:
   1327  1.4  riastrad 		return false;
   1328  1.4  riastrad 	}
   1329  1.4  riastrad }
   1330  1.4  riastrad 
   1331  1.4  riastrad static enum amd_reset_method
   1332  1.4  riastrad cik_asic_reset_method(struct amdgpu_device *adev)
   1333  1.1  riastrad {
   1334  1.4  riastrad 	bool baco_reset;
   1335  1.4  riastrad 
   1336  1.4  riastrad 	switch (adev->asic_type) {
   1337  1.4  riastrad 	case CHIP_BONAIRE:
   1338  1.4  riastrad 	case CHIP_HAWAII:
   1339  1.4  riastrad 		/* disable baco reset until it works */
   1340  1.4  riastrad 		/* smu7_asic_get_baco_capability(adev, &baco_reset); */
   1341  1.4  riastrad 		baco_reset = false;
   1342  1.4  riastrad 		break;
   1343  1.4  riastrad 	default:
   1344  1.4  riastrad 		baco_reset = false;
   1345  1.4  riastrad 		break;
   1346  1.4  riastrad 	}
   1347  1.1  riastrad 
   1348  1.4  riastrad 	if (baco_reset)
   1349  1.4  riastrad 		return AMD_RESET_METHOD_BACO;
   1350  1.1  riastrad 	else
   1351  1.4  riastrad 		return AMD_RESET_METHOD_LEGACY;
   1352  1.1  riastrad }
   1353  1.1  riastrad 
   1354  1.1  riastrad /**
   1355  1.1  riastrad  * cik_asic_reset - soft reset GPU
   1356  1.1  riastrad  *
   1357  1.1  riastrad  * @adev: amdgpu_device pointer
   1358  1.1  riastrad  *
   1359  1.1  riastrad  * Look up which blocks are hung and attempt
   1360  1.1  riastrad  * to reset them.
   1361  1.1  riastrad  * Returns 0 for success.
   1362  1.1  riastrad  */
   1363  1.1  riastrad static int cik_asic_reset(struct amdgpu_device *adev)
   1364  1.1  riastrad {
   1365  1.4  riastrad 	int r;
   1366  1.1  riastrad 
   1367  1.4  riastrad 	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
   1368  1.4  riastrad 		if (!adev->in_suspend)
   1369  1.4  riastrad 			amdgpu_inc_vram_lost(adev);
   1370  1.4  riastrad 		r = amdgpu_dpm_baco_reset(adev);
   1371  1.4  riastrad 	} else {
   1372  1.4  riastrad 		r = cik_asic_pci_config_reset(adev);
   1373  1.4  riastrad 	}
   1374  1.1  riastrad 
   1375  1.4  riastrad 	return r;
   1376  1.4  riastrad }
   1377  1.1  riastrad 
   1378  1.4  riastrad static u32 cik_get_config_memsize(struct amdgpu_device *adev)
   1379  1.4  riastrad {
   1380  1.4  riastrad 	return RREG32(mmCONFIG_MEMSIZE);
   1381  1.1  riastrad }
   1382  1.1  riastrad 
   1383  1.1  riastrad static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
   1384  1.1  riastrad 			      u32 cntl_reg, u32 status_reg)
   1385  1.1  riastrad {
   1386  1.1  riastrad 	int r, i;
   1387  1.1  riastrad 	struct atom_clock_dividers dividers;
   1388  1.1  riastrad 	uint32_t tmp;
   1389  1.1  riastrad 
   1390  1.1  riastrad 	r = amdgpu_atombios_get_clock_dividers(adev,
   1391  1.1  riastrad 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
   1392  1.1  riastrad 					       clock, false, &dividers);
   1393  1.1  riastrad 	if (r)
   1394  1.1  riastrad 		return r;
   1395  1.1  riastrad 
   1396  1.1  riastrad 	tmp = RREG32_SMC(cntl_reg);
   1397  1.1  riastrad 	tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
   1398  1.1  riastrad 		CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
   1399  1.1  riastrad 	tmp |= dividers.post_divider;
   1400  1.1  riastrad 	WREG32_SMC(cntl_reg, tmp);
   1401  1.1  riastrad 
   1402  1.1  riastrad 	for (i = 0; i < 100; i++) {
   1403  1.1  riastrad 		if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
   1404  1.1  riastrad 			break;
   1405  1.1  riastrad 		mdelay(10);
   1406  1.1  riastrad 	}
   1407  1.1  riastrad 	if (i == 100)
   1408  1.1  riastrad 		return -ETIMEDOUT;
   1409  1.1  riastrad 
   1410  1.1  riastrad 	return 0;
   1411  1.1  riastrad }
   1412  1.1  riastrad 
   1413  1.1  riastrad static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
   1414  1.1  riastrad {
   1415  1.1  riastrad 	int r = 0;
   1416  1.1  riastrad 
   1417  1.1  riastrad 	r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
   1418  1.1  riastrad 	if (r)
   1419  1.1  riastrad 		return r;
   1420  1.1  riastrad 
   1421  1.1  riastrad 	r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
   1422  1.1  riastrad 	return r;
   1423  1.1  riastrad }
   1424  1.1  riastrad 
   1425  1.1  riastrad static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
   1426  1.1  riastrad {
   1427  1.1  riastrad 	int r, i;
   1428  1.1  riastrad 	struct atom_clock_dividers dividers;
   1429  1.1  riastrad 	u32 tmp;
   1430  1.1  riastrad 
   1431  1.1  riastrad 	r = amdgpu_atombios_get_clock_dividers(adev,
   1432  1.1  riastrad 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
   1433  1.1  riastrad 					       ecclk, false, &dividers);
   1434  1.1  riastrad 	if (r)
   1435  1.1  riastrad 		return r;
   1436  1.1  riastrad 
   1437  1.1  riastrad 	for (i = 0; i < 100; i++) {
   1438  1.1  riastrad 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
   1439  1.1  riastrad 			break;
   1440  1.1  riastrad 		mdelay(10);
   1441  1.1  riastrad 	}
   1442  1.1  riastrad 	if (i == 100)
   1443  1.1  riastrad 		return -ETIMEDOUT;
   1444  1.1  riastrad 
   1445  1.1  riastrad 	tmp = RREG32_SMC(ixCG_ECLK_CNTL);
   1446  1.1  riastrad 	tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
   1447  1.1  riastrad 		CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
   1448  1.1  riastrad 	tmp |= dividers.post_divider;
   1449  1.1  riastrad 	WREG32_SMC(ixCG_ECLK_CNTL, tmp);
   1450  1.1  riastrad 
   1451  1.1  riastrad 	for (i = 0; i < 100; i++) {
   1452  1.1  riastrad 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
   1453  1.1  riastrad 			break;
   1454  1.1  riastrad 		mdelay(10);
   1455  1.1  riastrad 	}
   1456  1.1  riastrad 	if (i == 100)
   1457  1.1  riastrad 		return -ETIMEDOUT;
   1458  1.1  riastrad 
   1459  1.1  riastrad 	return 0;
   1460  1.1  riastrad }
   1461  1.1  riastrad 
   1462  1.1  riastrad static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
   1463  1.1  riastrad {
   1464  1.1  riastrad 	struct pci_dev *root = adev->pdev->bus->self;
   1465  1.4  riastrad 	u32 speed_cntl, current_data_rate;
   1466  1.4  riastrad 	int i;
   1467  1.1  riastrad 	u16 tmp16;
   1468  1.1  riastrad 
   1469  1.1  riastrad 	if (pci_is_root_bus(adev->pdev->bus))
   1470  1.1  riastrad 		return;
   1471  1.1  riastrad 
   1472  1.1  riastrad 	if (amdgpu_pcie_gen2 == 0)
   1473  1.1  riastrad 		return;
   1474  1.1  riastrad 
   1475  1.1  riastrad 	if (adev->flags & AMD_IS_APU)
   1476  1.1  riastrad 		return;
   1477  1.1  riastrad 
   1478  1.4  riastrad 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
   1479  1.4  riastrad 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
   1480  1.1  riastrad 		return;
   1481  1.1  riastrad 
   1482  1.1  riastrad 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
   1483  1.1  riastrad 	current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
   1484  1.1  riastrad 		PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
   1485  1.4  riastrad 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
   1486  1.1  riastrad 		if (current_data_rate == 2) {
   1487  1.1  riastrad 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
   1488  1.1  riastrad 			return;
   1489  1.1  riastrad 		}
   1490  1.1  riastrad 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
   1491  1.4  riastrad 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
   1492  1.1  riastrad 		if (current_data_rate == 1) {
   1493  1.1  riastrad 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
   1494  1.1  riastrad 			return;
   1495  1.1  riastrad 		}
   1496  1.1  riastrad 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
   1497  1.1  riastrad 	}
   1498  1.1  riastrad 
   1499  1.4  riastrad 	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
   1500  1.1  riastrad 		return;
   1501  1.1  riastrad 
   1502  1.4  riastrad 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
   1503  1.1  riastrad 		/* re-try equalization if gen3 is not already enabled */
   1504  1.1  riastrad 		if (current_data_rate != 2) {
   1505  1.1  riastrad 			u16 bridge_cfg, gpu_cfg;
   1506  1.1  riastrad 			u16 bridge_cfg2, gpu_cfg2;
   1507  1.1  riastrad 			u32 max_lw, current_lw, tmp;
   1508  1.1  riastrad 
   1509  1.4  riastrad 			pcie_capability_read_word(root, PCI_EXP_LNKCTL,
   1510  1.4  riastrad 						  &bridge_cfg);
   1511  1.4  riastrad 			pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
   1512  1.4  riastrad 						  &gpu_cfg);
   1513  1.1  riastrad 
   1514  1.1  riastrad 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
   1515  1.4  riastrad 			pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
   1516  1.1  riastrad 
   1517  1.1  riastrad 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
   1518  1.4  riastrad 			pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
   1519  1.4  riastrad 						   tmp16);
   1520  1.1  riastrad 
   1521  1.1  riastrad 			tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
   1522  1.1  riastrad 			max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
   1523  1.1  riastrad 				PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
   1524  1.1  riastrad 			current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
   1525  1.1  riastrad 				>> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
   1526  1.1  riastrad 
   1527  1.1  riastrad 			if (current_lw < max_lw) {
   1528  1.1  riastrad 				tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
   1529  1.1  riastrad 				if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
   1530  1.1  riastrad 					tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
   1531  1.1  riastrad 						PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
   1532  1.1  riastrad 					tmp |= (max_lw <<
   1533  1.1  riastrad 						PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
   1534  1.1  riastrad 					tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
   1535  1.1  riastrad 					PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
   1536  1.1  riastrad 					PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
   1537  1.1  riastrad 					WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
   1538  1.1  riastrad 				}
   1539  1.1  riastrad 			}
   1540  1.1  riastrad 
   1541  1.1  riastrad 			for (i = 0; i < 10; i++) {
   1542  1.1  riastrad 				/* check status */
   1543  1.4  riastrad 				pcie_capability_read_word(adev->pdev,
   1544  1.4  riastrad 							  PCI_EXP_DEVSTA,
   1545  1.4  riastrad 							  &tmp16);
   1546  1.1  riastrad 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
   1547  1.1  riastrad 					break;
   1548  1.1  riastrad 
   1549  1.4  riastrad 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
   1550  1.4  riastrad 							  &bridge_cfg);
   1551  1.4  riastrad 				pcie_capability_read_word(adev->pdev,
   1552  1.4  riastrad 							  PCI_EXP_LNKCTL,
   1553  1.4  riastrad 							  &gpu_cfg);
   1554  1.4  riastrad 
   1555  1.4  riastrad 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
   1556  1.4  riastrad 							  &bridge_cfg2);
   1557  1.4  riastrad 				pcie_capability_read_word(adev->pdev,
   1558  1.4  riastrad 							  PCI_EXP_LNKCTL2,
   1559  1.4  riastrad 							  &gpu_cfg2);
   1560  1.1  riastrad 
   1561  1.1  riastrad 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
   1562  1.1  riastrad 				tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
   1563  1.1  riastrad 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
   1564  1.1  riastrad 
   1565  1.1  riastrad 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
   1566  1.1  riastrad 				tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
   1567  1.1  riastrad 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
   1568  1.1  riastrad 
   1569  1.4  riastrad 				msleep(100);
   1570  1.1  riastrad 
   1571  1.1  riastrad 				/* linkctl */
   1572  1.4  riastrad 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
   1573  1.4  riastrad 							  &tmp16);
   1574  1.1  riastrad 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
   1575  1.1  riastrad 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
   1576  1.4  riastrad 				pcie_capability_write_word(root, PCI_EXP_LNKCTL,
   1577  1.4  riastrad 							   tmp16);
   1578  1.1  riastrad 
   1579  1.4  riastrad 				pcie_capability_read_word(adev->pdev,
   1580  1.4  riastrad 							  PCI_EXP_LNKCTL,
   1581  1.4  riastrad 							  &tmp16);
   1582  1.1  riastrad 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
   1583  1.1  riastrad 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
   1584  1.4  riastrad 				pcie_capability_write_word(adev->pdev,
   1585  1.4  riastrad 							   PCI_EXP_LNKCTL,
   1586  1.4  riastrad 							   tmp16);
   1587  1.1  riastrad 
   1588  1.1  riastrad 				/* linkctl2 */
   1589  1.4  riastrad 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
   1590  1.4  riastrad 							  &tmp16);
   1591  1.4  riastrad 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
   1592  1.4  riastrad 					   PCI_EXP_LNKCTL2_TX_MARGIN);
   1593  1.4  riastrad 				tmp16 |= (bridge_cfg2 &
   1594  1.4  riastrad 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
   1595  1.4  riastrad 					   PCI_EXP_LNKCTL2_TX_MARGIN));
   1596  1.4  riastrad 				pcie_capability_write_word(root,
   1597  1.4  riastrad 							   PCI_EXP_LNKCTL2,
   1598  1.4  riastrad 							   tmp16);
   1599  1.4  riastrad 
   1600  1.4  riastrad 				pcie_capability_read_word(adev->pdev,
   1601  1.4  riastrad 							  PCI_EXP_LNKCTL2,
   1602  1.4  riastrad 							  &tmp16);
   1603  1.4  riastrad 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
   1604  1.4  riastrad 					   PCI_EXP_LNKCTL2_TX_MARGIN);
   1605  1.4  riastrad 				tmp16 |= (gpu_cfg2 &
   1606  1.4  riastrad 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
   1607  1.4  riastrad 					   PCI_EXP_LNKCTL2_TX_MARGIN));
   1608  1.4  riastrad 				pcie_capability_write_word(adev->pdev,
   1609  1.4  riastrad 							   PCI_EXP_LNKCTL2,
   1610  1.4  riastrad 							   tmp16);
   1611  1.1  riastrad 
   1612  1.1  riastrad 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
   1613  1.1  riastrad 				tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
   1614  1.1  riastrad 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
   1615  1.1  riastrad 			}
   1616  1.1  riastrad 		}
   1617  1.1  riastrad 	}
   1618  1.1  riastrad 
   1619  1.1  riastrad 	/* set the link speed */
   1620  1.1  riastrad 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
   1621  1.1  riastrad 		PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
   1622  1.1  riastrad 	speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
   1623  1.1  riastrad 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
   1624  1.1  riastrad 
   1625  1.4  riastrad 	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
   1626  1.4  riastrad 	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
   1627  1.4  riastrad 
   1628  1.4  riastrad 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
   1629  1.4  riastrad 		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
   1630  1.4  riastrad 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
   1631  1.4  riastrad 		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
   1632  1.1  riastrad 	else
   1633  1.4  riastrad 		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
   1634  1.4  riastrad 	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
   1635  1.1  riastrad 
   1636  1.1  riastrad 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
   1637  1.1  riastrad 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
   1638  1.1  riastrad 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
   1639  1.1  riastrad 
   1640  1.1  riastrad 	for (i = 0; i < adev->usec_timeout; i++) {
   1641  1.1  riastrad 		speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
   1642  1.1  riastrad 		if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
   1643  1.1  riastrad 			break;
   1644  1.1  riastrad 		udelay(1);
   1645  1.1  riastrad 	}
   1646  1.1  riastrad }
   1647  1.1  riastrad 
   1648  1.1  riastrad static void cik_program_aspm(struct amdgpu_device *adev)
   1649  1.1  riastrad {
   1650  1.1  riastrad 	u32 data, orig;
   1651  1.1  riastrad 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
   1652  1.1  riastrad 	bool disable_clkreq = false;
   1653  1.1  riastrad 
   1654  1.1  riastrad 	if (amdgpu_aspm == 0)
   1655  1.1  riastrad 		return;
   1656  1.1  riastrad 
   1657  1.4  riastrad 	if (pci_is_root_bus(adev->pdev->bus))
   1658  1.4  riastrad 		return;
   1659  1.4  riastrad 
   1660  1.1  riastrad 	/* XXX double check APUs */
   1661  1.1  riastrad 	if (adev->flags & AMD_IS_APU)
   1662  1.1  riastrad 		return;
   1663  1.1  riastrad 
   1664  1.1  riastrad 	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
   1665  1.1  riastrad 	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
   1666  1.1  riastrad 	data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
   1667  1.1  riastrad 		PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
   1668  1.1  riastrad 	if (orig != data)
   1669  1.1  riastrad 		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
   1670  1.1  riastrad 
   1671  1.1  riastrad 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
   1672  1.1  riastrad 	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
   1673  1.1  riastrad 	if (orig != data)
   1674  1.1  riastrad 		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
   1675  1.1  riastrad 
   1676  1.1  riastrad 	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
   1677  1.1  riastrad 	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
   1678  1.1  riastrad 	if (orig != data)
   1679  1.1  riastrad 		WREG32_PCIE(ixPCIE_P_CNTL, data);
   1680  1.1  riastrad 
   1681  1.1  riastrad 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
   1682  1.1  riastrad 	data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
   1683  1.1  riastrad 		PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
   1684  1.1  riastrad 	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
   1685  1.1  riastrad 	if (!disable_l0s)
   1686  1.1  riastrad 		data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
   1687  1.1  riastrad 
   1688  1.1  riastrad 	if (!disable_l1) {
   1689  1.1  riastrad 		data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
   1690  1.1  riastrad 		data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
   1691  1.1  riastrad 		if (orig != data)
   1692  1.1  riastrad 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
   1693  1.1  riastrad 
   1694  1.1  riastrad 		if (!disable_plloff_in_l1) {
   1695  1.1  riastrad 			bool clk_req_support;
   1696  1.1  riastrad 
   1697  1.1  riastrad 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
   1698  1.1  riastrad 			data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
   1699  1.1  riastrad 				PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
   1700  1.1  riastrad 			data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
   1701  1.1  riastrad 				(7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
   1702  1.1  riastrad 			if (orig != data)
   1703  1.1  riastrad 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
   1704  1.1  riastrad 
   1705  1.1  riastrad 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
   1706  1.1  riastrad 			data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
   1707  1.1  riastrad 				PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
   1708  1.1  riastrad 			data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
   1709  1.1  riastrad 				(7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
   1710  1.1  riastrad 			if (orig != data)
   1711  1.1  riastrad 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
   1712  1.1  riastrad 
   1713  1.1  riastrad 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
   1714  1.1  riastrad 			data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
   1715  1.1  riastrad 				PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
   1716  1.1  riastrad 			data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
   1717  1.1  riastrad 				(7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
   1718  1.1  riastrad 			if (orig != data)
   1719  1.1  riastrad 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
   1720  1.1  riastrad 
   1721  1.1  riastrad 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
   1722  1.1  riastrad 			data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
   1723  1.1  riastrad 				PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
   1724  1.1  riastrad 			data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
   1725  1.1  riastrad 				(7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
   1726  1.1  riastrad 			if (orig != data)
   1727  1.1  riastrad 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
   1728  1.1  riastrad 
   1729  1.1  riastrad 			orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
   1730  1.1  riastrad 			data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
   1731  1.1  riastrad 			data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
   1732  1.1  riastrad 			if (orig != data)
   1733  1.1  riastrad 				WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
   1734  1.1  riastrad 
   1735  1.1  riastrad 			if (!disable_clkreq) {
   1736  1.1  riastrad 				struct pci_dev *root = adev->pdev->bus->self;
   1737  1.1  riastrad 				u32 lnkcap;
   1738  1.1  riastrad 
   1739  1.1  riastrad 				clk_req_support = false;
   1740  1.1  riastrad 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
   1741  1.1  riastrad 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
   1742  1.1  riastrad 					clk_req_support = true;
   1743  1.1  riastrad 			} else {
   1744  1.1  riastrad 				clk_req_support = false;
   1745  1.1  riastrad 			}
   1746  1.1  riastrad 
   1747  1.1  riastrad 			if (clk_req_support) {
   1748  1.1  riastrad 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
   1749  1.1  riastrad 				data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
   1750  1.1  riastrad 					PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
   1751  1.1  riastrad 				if (orig != data)
   1752  1.1  riastrad 					WREG32_PCIE(ixPCIE_LC_CNTL2, data);
   1753  1.1  riastrad 
   1754  1.1  riastrad 				orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
   1755  1.1  riastrad 				data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
   1756  1.1  riastrad 					THM_CLK_CNTL__TMON_CLK_SEL_MASK);
   1757  1.1  riastrad 				data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
   1758  1.1  riastrad 					(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
   1759  1.1  riastrad 				if (orig != data)
   1760  1.1  riastrad 					WREG32_SMC(ixTHM_CLK_CNTL, data);
   1761  1.1  riastrad 
   1762  1.1  riastrad 				orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
   1763  1.1  riastrad 				data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
   1764  1.1  riastrad 					MISC_CLK_CTRL__ZCLK_SEL_MASK);
   1765  1.1  riastrad 				data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
   1766  1.1  riastrad 					(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
   1767  1.1  riastrad 				if (orig != data)
   1768  1.1  riastrad 					WREG32_SMC(ixMISC_CLK_CTRL, data);
   1769  1.1  riastrad 
   1770  1.1  riastrad 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
   1771  1.1  riastrad 				data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
   1772  1.1  riastrad 				if (orig != data)
   1773  1.1  riastrad 					WREG32_SMC(ixCG_CLKPIN_CNTL, data);
   1774  1.1  riastrad 
   1775  1.1  riastrad 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
   1776  1.1  riastrad 				data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
   1777  1.1  riastrad 				if (orig != data)
   1778  1.1  riastrad 					WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
   1779  1.1  riastrad 
   1780  1.1  riastrad 				orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
   1781  1.1  riastrad 				data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
   1782  1.1  riastrad 				data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
   1783  1.1  riastrad 				if (orig != data)
   1784  1.1  riastrad 					WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
   1785  1.1  riastrad 			}
   1786  1.1  riastrad 		}
   1787  1.1  riastrad 	} else {
   1788  1.1  riastrad 		if (orig != data)
   1789  1.1  riastrad 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
   1790  1.1  riastrad 	}
   1791  1.1  riastrad 
   1792  1.1  riastrad 	orig = data = RREG32_PCIE(ixPCIE_CNTL2);
   1793  1.1  riastrad 	data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
   1794  1.1  riastrad 		PCIE_CNTL2__MST_MEM_LS_EN_MASK |
   1795  1.1  riastrad 		PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
   1796  1.1  riastrad 	if (orig != data)
   1797  1.1  riastrad 		WREG32_PCIE(ixPCIE_CNTL2, data);
   1798  1.1  riastrad 
   1799  1.1  riastrad 	if (!disable_l0s) {
   1800  1.1  riastrad 		data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
   1801  1.1  riastrad 		if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
   1802  1.1  riastrad 				PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
   1803  1.1  riastrad 			data = RREG32_PCIE(ixPCIE_LC_STATUS1);
   1804  1.1  riastrad 			if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
   1805  1.1  riastrad 			(data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
   1806  1.1  riastrad 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
   1807  1.1  riastrad 				data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
   1808  1.1  riastrad 				if (orig != data)
   1809  1.1  riastrad 					WREG32_PCIE(ixPCIE_LC_CNTL, data);
   1810  1.1  riastrad 			}
   1811  1.1  riastrad 		}
   1812  1.1  riastrad 	}
   1813  1.1  riastrad }
   1814  1.1  riastrad 
   1815  1.1  riastrad static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
   1816  1.1  riastrad {
   1817  1.1  riastrad 	return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
   1818  1.1  riastrad 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
   1819  1.1  riastrad }
   1820  1.1  riastrad 
   1821  1.4  riastrad static void cik_detect_hw_virtualization(struct amdgpu_device *adev)
   1822  1.1  riastrad {
   1823  1.4  riastrad 	if (is_virtual_machine()) /* passthrough mode */
   1824  1.4  riastrad 		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
   1825  1.4  riastrad }
   1826  1.4  riastrad 
   1827  1.4  riastrad static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
   1828  1.4  riastrad {
   1829  1.4  riastrad 	if (!ring || !ring->funcs->emit_wreg) {
   1830  1.4  riastrad 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
   1831  1.4  riastrad 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
   1832  1.4  riastrad 	} else {
   1833  1.4  riastrad 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
   1834  1.4  riastrad 	}
   1835  1.4  riastrad }
   1836  1.1  riastrad 
   1837  1.4  riastrad static void cik_invalidate_hdp(struct amdgpu_device *adev,
   1838  1.4  riastrad 			       struct amdgpu_ring *ring)
   1839  1.1  riastrad {
   1840  1.4  riastrad 	if (!ring || !ring->funcs->emit_wreg) {
   1841  1.4  riastrad 		WREG32(mmHDP_DEBUG0, 1);
   1842  1.4  riastrad 		RREG32(mmHDP_DEBUG0);
   1843  1.4  riastrad 	} else {
   1844  1.4  riastrad 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
   1845  1.1  riastrad 	}
   1846  1.4  riastrad }
   1847  1.4  riastrad 
   1848  1.4  riastrad static bool cik_need_full_reset(struct amdgpu_device *adev)
   1849  1.4  riastrad {
   1850  1.4  riastrad 	/* change this when we support soft reset */
   1851  1.4  riastrad 	return true;
   1852  1.4  riastrad }
   1853  1.4  riastrad 
   1854  1.4  riastrad static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
   1855  1.4  riastrad 			       uint64_t *count1)
   1856  1.4  riastrad {
   1857  1.4  riastrad 	uint32_t perfctr = 0;
   1858  1.4  riastrad 	uint64_t cnt0_of, cnt1_of;
   1859  1.4  riastrad 	int tmp;
   1860  1.4  riastrad 
   1861  1.4  riastrad 	/* This reports 0 on APUs, so return to avoid writing/reading registers
   1862  1.4  riastrad 	 * that may or may not be different from their GPU counterparts
   1863  1.4  riastrad 	 */
   1864  1.4  riastrad 	if (adev->flags & AMD_IS_APU)
   1865  1.4  riastrad 		return;
   1866  1.4  riastrad 
   1867  1.4  riastrad 	/* Set the 2 events that we wish to watch, defined above */
   1868  1.4  riastrad 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
   1869  1.4  riastrad 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
   1870  1.4  riastrad 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
   1871  1.4  riastrad 
   1872  1.4  riastrad 	/* Write to enable desired perf counters */
   1873  1.4  riastrad 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
   1874  1.4  riastrad 	/* Zero out and enable the perf counters
   1875  1.4  riastrad 	 * Write 0x5:
   1876  1.4  riastrad 	 * Bit 0 = Start all counters(1)
   1877  1.4  riastrad 	 * Bit 2 = Global counter reset enable(1)
   1878  1.4  riastrad 	 */
   1879  1.4  riastrad 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
   1880  1.4  riastrad 
   1881  1.4  riastrad 	msleep(1000);
   1882  1.4  riastrad 
   1883  1.4  riastrad 	/* Load the shadow and disable the perf counters
   1884  1.4  riastrad 	 * Write 0x2:
   1885  1.4  riastrad 	 * Bit 0 = Stop counters(0)
   1886  1.4  riastrad 	 * Bit 1 = Load the shadow counters(1)
   1887  1.4  riastrad 	 */
   1888  1.4  riastrad 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
   1889  1.4  riastrad 
   1890  1.4  riastrad 	/* Read register values to get any >32bit overflow */
   1891  1.4  riastrad 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
   1892  1.4  riastrad 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
   1893  1.4  riastrad 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
   1894  1.4  riastrad 
   1895  1.4  riastrad 	/* Get the values and add the overflow */
   1896  1.4  riastrad 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
   1897  1.4  riastrad 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
   1898  1.4  riastrad }
   1899  1.4  riastrad 
   1900  1.4  riastrad static bool cik_need_reset_on_init(struct amdgpu_device *adev)
   1901  1.4  riastrad {
   1902  1.4  riastrad 	u32 clock_cntl, pc;
   1903  1.4  riastrad 
   1904  1.4  riastrad 	if (adev->flags & AMD_IS_APU)
   1905  1.4  riastrad 		return false;
   1906  1.1  riastrad 
   1907  1.4  riastrad 	/* check if the SMC is already running */
   1908  1.4  riastrad 	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
   1909  1.4  riastrad 	pc = RREG32_SMC(ixSMC_PC_C);
   1910  1.4  riastrad 	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
   1911  1.4  riastrad 	    (0x20100 <= pc))
   1912  1.4  riastrad 		return true;
   1913  1.4  riastrad 
   1914  1.4  riastrad 	return false;
   1915  1.4  riastrad }
   1916  1.4  riastrad 
   1917  1.4  riastrad static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
   1918  1.4  riastrad {
   1919  1.4  riastrad 	uint64_t nak_r, nak_g;
   1920  1.4  riastrad 
   1921  1.4  riastrad 	/* Get the number of NAKs received and generated */
   1922  1.4  riastrad 	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
   1923  1.4  riastrad 	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
   1924  1.4  riastrad 
   1925  1.4  riastrad 	/* Add the total number of NAKs, i.e the number of replays */
   1926  1.4  riastrad 	return (nak_r + nak_g);
   1927  1.1  riastrad }
   1928  1.1  riastrad 
   1929  1.1  riastrad static const struct amdgpu_asic_funcs cik_asic_funcs =
   1930  1.1  riastrad {
   1931  1.1  riastrad 	.read_disabled_bios = &cik_read_disabled_bios,
   1932  1.4  riastrad 	.read_bios_from_rom = &cik_read_bios_from_rom,
   1933  1.1  riastrad 	.read_register = &cik_read_register,
   1934  1.1  riastrad 	.reset = &cik_asic_reset,
   1935  1.4  riastrad 	.reset_method = &cik_asic_reset_method,
   1936  1.1  riastrad 	.set_vga_state = &cik_vga_set_state,
   1937  1.1  riastrad 	.get_xclk = &cik_get_xclk,
   1938  1.1  riastrad 	.set_uvd_clocks = &cik_set_uvd_clocks,
   1939  1.1  riastrad 	.set_vce_clocks = &cik_set_vce_clocks,
   1940  1.4  riastrad 	.get_config_memsize = &cik_get_config_memsize,
   1941  1.4  riastrad 	.flush_hdp = &cik_flush_hdp,
   1942  1.4  riastrad 	.invalidate_hdp = &cik_invalidate_hdp,
   1943  1.4  riastrad 	.need_full_reset = &cik_need_full_reset,
   1944  1.4  riastrad 	.init_doorbell_index = &legacy_doorbell_index_init,
   1945  1.4  riastrad 	.get_pcie_usage = &cik_get_pcie_usage,
   1946  1.4  riastrad 	.need_reset_on_init = &cik_need_reset_on_init,
   1947  1.4  riastrad 	.get_pcie_replay_count = &cik_get_pcie_replay_count,
   1948  1.4  riastrad 	.supports_baco = &cik_asic_supports_baco,
   1949  1.1  riastrad };
   1950  1.1  riastrad 
   1951  1.1  riastrad static int cik_common_early_init(void *handle)
   1952  1.1  riastrad {
   1953  1.1  riastrad 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   1954  1.1  riastrad 
   1955  1.1  riastrad 	adev->smc_rreg = &cik_smc_rreg;
   1956  1.1  riastrad 	adev->smc_wreg = &cik_smc_wreg;
   1957  1.1  riastrad 	adev->pcie_rreg = &cik_pcie_rreg;
   1958  1.1  riastrad 	adev->pcie_wreg = &cik_pcie_wreg;
   1959  1.1  riastrad 	adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
   1960  1.1  riastrad 	adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
   1961  1.1  riastrad 	adev->didt_rreg = &cik_didt_rreg;
   1962  1.1  riastrad 	adev->didt_wreg = &cik_didt_wreg;
   1963  1.1  riastrad 
   1964  1.1  riastrad 	adev->asic_funcs = &cik_asic_funcs;
   1965  1.1  riastrad 
   1966  1.1  riastrad 	adev->rev_id = cik_get_rev_id(adev);
   1967  1.1  riastrad 	adev->external_rev_id = 0xFF;
   1968  1.1  riastrad 	switch (adev->asic_type) {
   1969  1.1  riastrad 	case CHIP_BONAIRE:
   1970  1.1  riastrad 		adev->cg_flags =
   1971  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGCG |
   1972  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGLS |
   1973  1.4  riastrad 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
   1974  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGLS |
   1975  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS |
   1976  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS_LS |
   1977  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CP_LS |
   1978  1.4  riastrad 			AMD_CG_SUPPORT_MC_LS |
   1979  1.4  riastrad 			AMD_CG_SUPPORT_MC_MGCG |
   1980  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_MGCG |
   1981  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_LS |
   1982  1.4  riastrad 			AMD_CG_SUPPORT_BIF_LS |
   1983  1.4  riastrad 			AMD_CG_SUPPORT_VCE_MGCG |
   1984  1.4  riastrad 			AMD_CG_SUPPORT_UVD_MGCG |
   1985  1.4  riastrad 			AMD_CG_SUPPORT_HDP_LS |
   1986  1.4  riastrad 			AMD_CG_SUPPORT_HDP_MGCG;
   1987  1.1  riastrad 		adev->pg_flags = 0;
   1988  1.1  riastrad 		adev->external_rev_id = adev->rev_id + 0x14;
   1989  1.1  riastrad 		break;
   1990  1.1  riastrad 	case CHIP_HAWAII:
   1991  1.1  riastrad 		adev->cg_flags =
   1992  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGCG |
   1993  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGLS |
   1994  1.4  riastrad 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
   1995  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGLS |
   1996  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS |
   1997  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CP_LS |
   1998  1.4  riastrad 			AMD_CG_SUPPORT_MC_LS |
   1999  1.4  riastrad 			AMD_CG_SUPPORT_MC_MGCG |
   2000  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_MGCG |
   2001  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_LS |
   2002  1.4  riastrad 			AMD_CG_SUPPORT_BIF_LS |
   2003  1.4  riastrad 			AMD_CG_SUPPORT_VCE_MGCG |
   2004  1.4  riastrad 			AMD_CG_SUPPORT_UVD_MGCG |
   2005  1.4  riastrad 			AMD_CG_SUPPORT_HDP_LS |
   2006  1.4  riastrad 			AMD_CG_SUPPORT_HDP_MGCG;
   2007  1.1  riastrad 		adev->pg_flags = 0;
   2008  1.1  riastrad 		adev->external_rev_id = 0x28;
   2009  1.1  riastrad 		break;
   2010  1.1  riastrad 	case CHIP_KAVERI:
   2011  1.1  riastrad 		adev->cg_flags =
   2012  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGCG |
   2013  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGLS |
   2014  1.4  riastrad 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
   2015  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGLS |
   2016  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS |
   2017  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS_LS |
   2018  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CP_LS |
   2019  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_MGCG |
   2020  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_LS |
   2021  1.4  riastrad 			AMD_CG_SUPPORT_BIF_LS |
   2022  1.4  riastrad 			AMD_CG_SUPPORT_VCE_MGCG |
   2023  1.4  riastrad 			AMD_CG_SUPPORT_UVD_MGCG |
   2024  1.4  riastrad 			AMD_CG_SUPPORT_HDP_LS |
   2025  1.4  riastrad 			AMD_CG_SUPPORT_HDP_MGCG;
   2026  1.1  riastrad 		adev->pg_flags =
   2027  1.4  riastrad 			/*AMD_PG_SUPPORT_GFX_PG |
   2028  1.4  riastrad 			  AMD_PG_SUPPORT_GFX_SMG |
   2029  1.4  riastrad 			  AMD_PG_SUPPORT_GFX_DMG |*/
   2030  1.4  riastrad 			AMD_PG_SUPPORT_UVD |
   2031  1.4  riastrad 			AMD_PG_SUPPORT_VCE |
   2032  1.4  riastrad 			/*  AMD_PG_SUPPORT_CP |
   2033  1.4  riastrad 			  AMD_PG_SUPPORT_GDS |
   2034  1.4  riastrad 			  AMD_PG_SUPPORT_RLC_SMU_HS |
   2035  1.4  riastrad 			  AMD_PG_SUPPORT_ACP |
   2036  1.4  riastrad 			  AMD_PG_SUPPORT_SAMU |*/
   2037  1.1  riastrad 			0;
   2038  1.1  riastrad 		if (adev->pdev->device == 0x1312 ||
   2039  1.1  riastrad 			adev->pdev->device == 0x1316 ||
   2040  1.1  riastrad 			adev->pdev->device == 0x1317)
   2041  1.1  riastrad 			adev->external_rev_id = 0x41;
   2042  1.1  riastrad 		else
   2043  1.1  riastrad 			adev->external_rev_id = 0x1;
   2044  1.1  riastrad 		break;
   2045  1.1  riastrad 	case CHIP_KABINI:
   2046  1.1  riastrad 	case CHIP_MULLINS:
   2047  1.1  riastrad 		adev->cg_flags =
   2048  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGCG |
   2049  1.4  riastrad 			AMD_CG_SUPPORT_GFX_MGLS |
   2050  1.4  riastrad 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
   2051  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGLS |
   2052  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS |
   2053  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CGTS_LS |
   2054  1.4  riastrad 			AMD_CG_SUPPORT_GFX_CP_LS |
   2055  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_MGCG |
   2056  1.4  riastrad 			AMD_CG_SUPPORT_SDMA_LS |
   2057  1.4  riastrad 			AMD_CG_SUPPORT_BIF_LS |
   2058  1.4  riastrad 			AMD_CG_SUPPORT_VCE_MGCG |
   2059  1.4  riastrad 			AMD_CG_SUPPORT_UVD_MGCG |
   2060  1.4  riastrad 			AMD_CG_SUPPORT_HDP_LS |
   2061  1.4  riastrad 			AMD_CG_SUPPORT_HDP_MGCG;
   2062  1.1  riastrad 		adev->pg_flags =
   2063  1.4  riastrad 			/*AMD_PG_SUPPORT_GFX_PG |
   2064  1.4  riastrad 			  AMD_PG_SUPPORT_GFX_SMG | */
   2065  1.4  riastrad 			AMD_PG_SUPPORT_UVD |
   2066  1.4  riastrad 			/*AMD_PG_SUPPORT_VCE |
   2067  1.4  riastrad 			  AMD_PG_SUPPORT_CP |
   2068  1.4  riastrad 			  AMD_PG_SUPPORT_GDS |
   2069  1.4  riastrad 			  AMD_PG_SUPPORT_RLC_SMU_HS |
   2070  1.4  riastrad 			  AMD_PG_SUPPORT_SAMU |*/
   2071  1.1  riastrad 			0;
   2072  1.1  riastrad 		if (adev->asic_type == CHIP_KABINI) {
   2073  1.1  riastrad 			if (adev->rev_id == 0)
   2074  1.1  riastrad 				adev->external_rev_id = 0x81;
   2075  1.1  riastrad 			else if (adev->rev_id == 1)
   2076  1.1  riastrad 				adev->external_rev_id = 0x82;
   2077  1.1  riastrad 			else if (adev->rev_id == 2)
   2078  1.1  riastrad 				adev->external_rev_id = 0x85;
   2079  1.1  riastrad 		} else
   2080  1.1  riastrad 			adev->external_rev_id = adev->rev_id + 0xa1;
   2081  1.1  riastrad 		break;
   2082  1.1  riastrad 	default:
   2083  1.1  riastrad 		/* FIXME: not supported yet */
   2084  1.1  riastrad 		return -EINVAL;
   2085  1.1  riastrad 	}
   2086  1.1  riastrad 
   2087  1.1  riastrad 	return 0;
   2088  1.1  riastrad }
   2089  1.1  riastrad 
   2090  1.1  riastrad static int cik_common_sw_init(void *handle)
   2091  1.1  riastrad {
   2092  1.1  riastrad 	return 0;
   2093  1.1  riastrad }
   2094  1.1  riastrad 
   2095  1.1  riastrad static int cik_common_sw_fini(void *handle)
   2096  1.1  riastrad {
   2097  1.1  riastrad 	return 0;
   2098  1.1  riastrad }
   2099  1.1  riastrad 
   2100  1.1  riastrad static int cik_common_hw_init(void *handle)
   2101  1.1  riastrad {
   2102  1.1  riastrad 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   2103  1.1  riastrad 
   2104  1.1  riastrad 	/* move the golden regs per IP block */
   2105  1.1  riastrad 	cik_init_golden_registers(adev);
   2106  1.1  riastrad 	/* enable pcie gen2/3 link */
   2107  1.1  riastrad 	cik_pcie_gen3_enable(adev);
   2108  1.1  riastrad 	/* enable aspm */
   2109  1.1  riastrad 	cik_program_aspm(adev);
   2110  1.1  riastrad 
   2111  1.1  riastrad 	return 0;
   2112  1.1  riastrad }
   2113  1.1  riastrad 
   2114  1.1  riastrad static int cik_common_hw_fini(void *handle)
   2115  1.1  riastrad {
   2116  1.1  riastrad 	return 0;
   2117  1.1  riastrad }
   2118  1.1  riastrad 
   2119  1.1  riastrad static int cik_common_suspend(void *handle)
   2120  1.1  riastrad {
   2121  1.1  riastrad 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   2122  1.1  riastrad 
   2123  1.1  riastrad 	return cik_common_hw_fini(adev);
   2124  1.1  riastrad }
   2125  1.1  riastrad 
   2126  1.1  riastrad static int cik_common_resume(void *handle)
   2127  1.1  riastrad {
   2128  1.1  riastrad 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
   2129  1.1  riastrad 
   2130  1.4  riastrad 	return cik_common_hw_init(adev);
   2131  1.1  riastrad }
   2132  1.1  riastrad 
   2133  1.1  riastrad static bool cik_common_is_idle(void *handle)
   2134  1.1  riastrad {
   2135  1.1  riastrad 	return true;
   2136  1.1  riastrad }
   2137  1.1  riastrad 
   2138  1.1  riastrad static int cik_common_wait_for_idle(void *handle)
   2139  1.1  riastrad {
   2140  1.1  riastrad 	return 0;
   2141  1.1  riastrad }
   2142  1.1  riastrad 
   2143  1.1  riastrad static int cik_common_soft_reset(void *handle)
   2144  1.1  riastrad {
   2145  1.1  riastrad 	/* XXX hard reset?? */
   2146  1.1  riastrad 	return 0;
   2147  1.1  riastrad }
   2148  1.1  riastrad 
   2149  1.1  riastrad static int cik_common_set_clockgating_state(void *handle,
   2150  1.1  riastrad 					    enum amd_clockgating_state state)
   2151  1.1  riastrad {
   2152  1.1  riastrad 	return 0;
   2153  1.1  riastrad }
   2154  1.1  riastrad 
   2155  1.1  riastrad static int cik_common_set_powergating_state(void *handle,
   2156  1.1  riastrad 					    enum amd_powergating_state state)
   2157  1.1  riastrad {
   2158  1.1  riastrad 	return 0;
   2159  1.1  riastrad }
   2160  1.1  riastrad 
   2161  1.4  riastrad static const struct amd_ip_funcs cik_common_ip_funcs = {
   2162  1.4  riastrad 	.name = "cik_common",
   2163  1.1  riastrad 	.early_init = cik_common_early_init,
   2164  1.1  riastrad 	.late_init = NULL,
   2165  1.1  riastrad 	.sw_init = cik_common_sw_init,
   2166  1.1  riastrad 	.sw_fini = cik_common_sw_fini,
   2167  1.1  riastrad 	.hw_init = cik_common_hw_init,
   2168  1.1  riastrad 	.hw_fini = cik_common_hw_fini,
   2169  1.1  riastrad 	.suspend = cik_common_suspend,
   2170  1.1  riastrad 	.resume = cik_common_resume,
   2171  1.1  riastrad 	.is_idle = cik_common_is_idle,
   2172  1.1  riastrad 	.wait_for_idle = cik_common_wait_for_idle,
   2173  1.1  riastrad 	.soft_reset = cik_common_soft_reset,
   2174  1.1  riastrad 	.set_clockgating_state = cik_common_set_clockgating_state,
   2175  1.1  riastrad 	.set_powergating_state = cik_common_set_powergating_state,
   2176  1.1  riastrad };
   2177  1.4  riastrad 
   2178  1.4  riastrad static const struct amdgpu_ip_block_version cik_common_ip_block =
   2179  1.4  riastrad {
   2180  1.4  riastrad 	.type = AMD_IP_BLOCK_TYPE_COMMON,
   2181  1.4  riastrad 	.major = 1,
   2182  1.4  riastrad 	.minor = 0,
   2183  1.4  riastrad 	.rev = 0,
   2184  1.4  riastrad 	.funcs = &cik_common_ip_funcs,
   2185  1.4  riastrad };
   2186  1.4  riastrad 
   2187  1.4  riastrad int cik_set_ip_blocks(struct amdgpu_device *adev)
   2188  1.4  riastrad {
   2189  1.4  riastrad 	cik_detect_hw_virtualization(adev);
   2190  1.4  riastrad 
   2191  1.4  riastrad 	switch (adev->asic_type) {
   2192  1.4  riastrad 	case CHIP_BONAIRE:
   2193  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
   2194  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
   2195  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
   2196  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
   2197  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
   2198  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
   2199  1.4  riastrad 		if (adev->enable_virtual_display)
   2200  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
   2201  1.4  riastrad #if defined(CONFIG_DRM_AMD_DC)
   2202  1.4  riastrad 		else if (amdgpu_device_has_dc_support(adev))
   2203  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
   2204  1.4  riastrad #endif
   2205  1.4  riastrad 		else
   2206  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
   2207  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
   2208  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
   2209  1.4  riastrad 		break;
   2210  1.4  riastrad 	case CHIP_HAWAII:
   2211  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
   2212  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
   2213  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
   2214  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
   2215  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
   2216  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
   2217  1.4  riastrad 		if (adev->enable_virtual_display)
   2218  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
   2219  1.4  riastrad #if defined(CONFIG_DRM_AMD_DC)
   2220  1.4  riastrad 		else if (amdgpu_device_has_dc_support(adev))
   2221  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
   2222  1.4  riastrad #endif
   2223  1.4  riastrad 		else
   2224  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
   2225  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
   2226  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
   2227  1.4  riastrad 		break;
   2228  1.4  riastrad 	case CHIP_KAVERI:
   2229  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
   2230  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
   2231  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
   2232  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
   2233  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
   2234  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
   2235  1.4  riastrad 		if (adev->enable_virtual_display)
   2236  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
   2237  1.4  riastrad #if defined(CONFIG_DRM_AMD_DC)
   2238  1.4  riastrad 		else if (amdgpu_device_has_dc_support(adev))
   2239  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
   2240  1.4  riastrad #endif
   2241  1.4  riastrad 		else
   2242  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
   2243  1.4  riastrad 
   2244  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
   2245  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
   2246  1.4  riastrad 		break;
   2247  1.4  riastrad 	case CHIP_KABINI:
   2248  1.4  riastrad 	case CHIP_MULLINS:
   2249  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
   2250  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
   2251  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
   2252  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
   2253  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
   2254  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
   2255  1.4  riastrad 		if (adev->enable_virtual_display)
   2256  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
   2257  1.4  riastrad #if defined(CONFIG_DRM_AMD_DC)
   2258  1.4  riastrad 		else if (amdgpu_device_has_dc_support(adev))
   2259  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
   2260  1.4  riastrad #endif
   2261  1.4  riastrad 		else
   2262  1.4  riastrad 			amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
   2263  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
   2264  1.4  riastrad 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
   2265  1.4  riastrad 		break;
   2266  1.4  riastrad 	default:
   2267  1.4  riastrad 		/* FIXME: not supported yet */
   2268  1.4  riastrad 		return -EINVAL;
   2269  1.4  riastrad 	}
   2270  1.4  riastrad 	return 0;
   2271  1.4  riastrad }
   2272