xref: /linux/drivers/gpu/drm/amd/amdgpu/si.c (revision 2d5e0807edf3a3ff44e52ab8ab3cfd675f6c8dad)
162a37553SKen Wang /*
262a37553SKen Wang  * Copyright 2015 Advanced Micro Devices, Inc.
362a37553SKen Wang  *
462a37553SKen Wang  * Permission is hereby granted, free of charge, to any person obtaining a
562a37553SKen Wang  * copy of this software and associated documentation files (the "Software"),
662a37553SKen Wang  * to deal in the Software without restriction, including without limitation
762a37553SKen Wang  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862a37553SKen Wang  * and/or sell copies of the Software, and to permit persons to whom the
962a37553SKen Wang  * Software is furnished to do so, subject to the following conditions:
1062a37553SKen Wang  *
1162a37553SKen Wang  * The above copyright notice and this permission notice shall be included in
1262a37553SKen Wang  * all copies or substantial portions of the Software.
1362a37553SKen Wang  *
1462a37553SKen Wang  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1562a37553SKen Wang  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1662a37553SKen Wang  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1762a37553SKen Wang  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1862a37553SKen Wang  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1962a37553SKen Wang  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2062a37553SKen Wang  * OTHER DEALINGS IN THE SOFTWARE.
2162a37553SKen Wang  *
2262a37553SKen Wang  */
2362a37553SKen Wang 
2462a37553SKen Wang #include <linux/firmware.h>
2562a37553SKen Wang #include <linux/slab.h>
2662a37553SKen Wang #include <linux/module.h>
27248a1d6fSMasahiro Yamada #include <drm/drmP.h>
2862a37553SKen Wang #include "amdgpu.h"
2962a37553SKen Wang #include "amdgpu_atombios.h"
3062a37553SKen Wang #include "amdgpu_ih.h"
3162a37553SKen Wang #include "amdgpu_uvd.h"
3262a37553SKen Wang #include "amdgpu_vce.h"
3362a37553SKen Wang #include "atom.h"
3462a37553SKen Wang #include "amdgpu_powerplay.h"
35689957b1SAlex Deucher #include "sid.h"
3662a37553SKen Wang #include "si_ih.h"
3762a37553SKen Wang #include "gfx_v6_0.h"
3862a37553SKen Wang #include "gmc_v6_0.h"
3962a37553SKen Wang #include "si_dma.h"
4062a37553SKen Wang #include "dce_v6_0.h"
4162a37553SKen Wang #include "si.h"
422120df47SAlex Deucher #include "dce_virtual.h"
4378bbe771STom St Denis #include "gca/gfx_6_0_d.h"
4478bbe771STom St Denis #include "oss/oss_1_0_d.h"
4578bbe771STom St Denis #include "gmc/gmc_6_0_d.h"
4678bbe771STom St Denis #include "dce/dce_6_0_d.h"
4778bbe771STom St Denis #include "uvd/uvd_4_0_d.h"
48bbf282d8SAlex Deucher #include "bif/bif_3_0_d.h"
4962a37553SKen Wang 
5062a37553SKen Wang static const u32 tahiti_golden_registers[] =
5162a37553SKen Wang {
5278bbe771STom St Denis 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
5378bbe771STom St Denis 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
5478bbe771STom St Denis 	mmDB_DEBUG, 0xffffffff, 0x00000000,
5578bbe771STom St Denis 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
5678bbe771STom St Denis 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
5778bbe771STom St Denis 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
587c0a705eSFlora Cui 	0x340c, 0x000000c0, 0x00800040,
597c0a705eSFlora Cui 	0x360c, 0x000000c0, 0x00800040,
6078bbe771STom St Denis 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
6178bbe771STom St Denis 	mmFBC_MISC, 0x00200000, 0x50100000,
6278bbe771STom St Denis 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
6378bbe771STom St Denis 	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
6478bbe771STom St Denis 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
6578bbe771STom St Denis 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
6678bbe771STom St Denis 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
6778bbe771STom St Denis 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
6878bbe771STom St Denis 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
6978bbe771STom St Denis 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
707c0a705eSFlora Cui 	0x000c, 0xffffffff, 0x0040,
7162a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
7278bbe771STom St Denis 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
7378bbe771STom St Denis 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
7478bbe771STom St Denis 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
7578bbe771STom St Denis 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
7678bbe771STom St Denis 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
7778bbe771STom St Denis 	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
7878bbe771STom St Denis 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
7978bbe771STom St Denis 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
8078bbe771STom St Denis 	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
8178bbe771STom St Denis 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
8278bbe771STom St Denis 	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
8378bbe771STom St Denis 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
8478bbe771STom St Denis 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
8578bbe771STom St Denis 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
8678bbe771STom St Denis 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
8778bbe771STom St Denis 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
8862a37553SKen Wang };
8962a37553SKen Wang 
9062a37553SKen Wang static const u32 tahiti_golden_registers2[] =
9162a37553SKen Wang {
9278bbe771STom St Denis 	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
9362a37553SKen Wang };
9462a37553SKen Wang 
9562a37553SKen Wang static const u32 tahiti_golden_rlc_registers[] =
9662a37553SKen Wang {
9778bbe771STom St Denis 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
9878bbe771STom St Denis 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
9962a37553SKen Wang 	0x311f, 0xffffffff, 0x10104040,
10062a37553SKen Wang 	0x3122, 0xffffffff, 0x0100000a,
10178bbe771STom St Denis 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
10278bbe771STom St Denis 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
10378bbe771STom St Denis 	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
10462a37553SKen Wang };
10562a37553SKen Wang 
10662a37553SKen Wang static const u32 pitcairn_golden_registers[] =
10762a37553SKen Wang {
10878bbe771STom St Denis 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
10978bbe771STom St Denis 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
11078bbe771STom St Denis 	mmDB_DEBUG, 0xffffffff, 0x00000000,
11178bbe771STom St Denis 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
11278bbe771STom St Denis 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
11378bbe771STom St Denis 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
11462a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
11562a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
11678bbe771STom St Denis 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
11778bbe771STom St Denis 	mmFBC_MISC, 0x00200000, 0x50100000,
11878bbe771STom St Denis 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
11978bbe771STom St Denis 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
12078bbe771STom St Denis 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
12178bbe771STom St Denis 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
12278bbe771STom St Denis 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
12378bbe771STom St Denis 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
12478bbe771STom St Denis 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
12578bbe771STom St Denis 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
1261245a694SFlora Cui 	0x000c, 0xffffffff, 0x0040,
12762a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
12878bbe771STom St Denis 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
12978bbe771STom St Denis 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
13078bbe771STom St Denis 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
13178bbe771STom St Denis 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
13278bbe771STom St Denis 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
13378bbe771STom St Denis 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
13478bbe771STom St Denis 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
13578bbe771STom St Denis 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
13678bbe771STom St Denis 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
13778bbe771STom St Denis 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
13878bbe771STom St Denis 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
13978bbe771STom St Denis 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
14062a37553SKen Wang };
14162a37553SKen Wang 
14262a37553SKen Wang static const u32 pitcairn_golden_rlc_registers[] =
14362a37553SKen Wang {
14478bbe771STom St Denis 	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
14578bbe771STom St Denis 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
14662a37553SKen Wang 	0x311f, 0xffffffff, 0x10102020,
14762a37553SKen Wang 	0x3122, 0xffffffff, 0x01000020,
14878bbe771STom St Denis 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
14978bbe771STom St Denis 	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
15062a37553SKen Wang };
15162a37553SKen Wang 
15262a37553SKen Wang static const u32 verde_pg_init[] =
15362a37553SKen Wang {
15478bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
15578bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
15678bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
15778bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
15878bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
15978bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16078bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16178bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
16278bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
16378bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16478bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16578bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16678bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16778bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16878bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
16978bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
17078bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17178bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17278bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17378bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17478bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17578bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
17678bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
17778bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17878bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17978bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18078bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18178bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18278bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
18378bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
18478bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18578bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18678bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18778bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18878bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18978bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
19078bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
19178bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19278bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19378bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19478bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19578bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19678bbe771STom St Denis 	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19778bbe771STom St Denis 	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
19878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
19978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
20078bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
20178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
20278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
20378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
20478bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
20578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
20678bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
20778bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
20878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
20978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
21078bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
21178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
21278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
21378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
21478bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
21578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
21678bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
21778bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
21878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
21978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
22078bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
22178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
22278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
22378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
22478bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
22578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
22678bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
22778bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
22878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
22978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
23078bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
23178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
23278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
23378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
23478bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
23578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
23678bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
23778bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
23878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
23978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
24078bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
24178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
24278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
24378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
24478bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
24578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
24678bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
24778bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
24878bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
24978bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
25078bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
25178bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
25278bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
25378bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
25478bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
25578bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
25678bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
25778bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
25878bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
25978bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
26078bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
26178bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
26278bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
26378bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
26478bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
26578bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
26678bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
26778bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
26878bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
26978bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
27078bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
27178bbe771STom St Denis 	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
27278bbe771STom St Denis 	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
27378bbe771STom St Denis 	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
27478bbe771STom St Denis 	mmGMCON_MISC2, 0xfc00, 0x2000,
27578bbe771STom St Denis 	mmGMCON_MISC3, 0xffffffff, 0xfc0,
27678bbe771STom St Denis 	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
27762a37553SKen Wang };
27862a37553SKen Wang 
27962a37553SKen Wang static const u32 verde_golden_rlc_registers[] =
28062a37553SKen Wang {
28178bbe771STom St Denis 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
28278bbe771STom St Denis 	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
28362a37553SKen Wang 	0x311f, 0xffffffff, 0x10808020,
28462a37553SKen Wang 	0x3122, 0xffffffff, 0x00800008,
28578bbe771STom St Denis 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
28678bbe771STom St Denis 	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
28762a37553SKen Wang };
28862a37553SKen Wang 
28962a37553SKen Wang static const u32 verde_golden_registers[] =
29062a37553SKen Wang {
29178bbe771STom St Denis 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
29278bbe771STom St Denis 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
29378bbe771STom St Denis 	mmDB_DEBUG, 0xffffffff, 0x00000000,
29478bbe771STom St Denis 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
29578bbe771STom St Denis 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
29678bbe771STom St Denis 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
29762a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
29862a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
29978bbe771STom St Denis 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
30078bbe771STom St Denis 	mmFBC_MISC, 0x00200000, 0x50100000,
30178bbe771STom St Denis 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
30278bbe771STom St Denis 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
30378bbe771STom St Denis 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
30478bbe771STom St Denis 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
30578bbe771STom St Denis 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
30678bbe771STom St Denis 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
30778bbe771STom St Denis 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
30878bbe771STom St Denis 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
309dae5c298SFlora Cui 	0x000c, 0xffffffff, 0x0040,
31062a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
31178bbe771STom St Denis 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
31278bbe771STom St Denis 	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
31378bbe771STom St Denis 	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
31478bbe771STom St Denis 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
31578bbe771STom St Denis 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
31678bbe771STom St Denis 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
31778bbe771STom St Denis 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
31878bbe771STom St Denis 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
31978bbe771STom St Denis 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
32078bbe771STom St Denis 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
32178bbe771STom St Denis 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
32278bbe771STom St Denis 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
32378bbe771STom St Denis 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
32478bbe771STom St Denis 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
32562a37553SKen Wang };
32662a37553SKen Wang 
32762a37553SKen Wang static const u32 oland_golden_registers[] =
32862a37553SKen Wang {
32978bbe771STom St Denis 	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
33078bbe771STom St Denis 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
33178bbe771STom St Denis 	mmDB_DEBUG, 0xffffffff, 0x00000000,
33278bbe771STom St Denis 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
33378bbe771STom St Denis 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
33478bbe771STom St Denis 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
33562a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
33662a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
33778bbe771STom St Denis 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
33878bbe771STom St Denis 	mmFBC_MISC, 0x00200000, 0x50100000,
33978bbe771STom St Denis 	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
34078bbe771STom St Denis 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
34178bbe771STom St Denis 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
34278bbe771STom St Denis 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
34378bbe771STom St Denis 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
34478bbe771STom St Denis 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
34578bbe771STom St Denis 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
34678bbe771STom St Denis 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
3476b7985efSFlora Cui 	0x000c, 0xffffffff, 0x0040,
34862a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
34978bbe771STom St Denis 	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
35078bbe771STom St Denis 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
35178bbe771STom St Denis 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
35278bbe771STom St Denis 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
35378bbe771STom St Denis 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
35478bbe771STom St Denis 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
35578bbe771STom St Denis 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
35678bbe771STom St Denis 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
35778bbe771STom St Denis 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
35878bbe771STom St Denis 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
35978bbe771STom St Denis 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
36078bbe771STom St Denis 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
36178bbe771STom St Denis 
36262a37553SKen Wang };
36362a37553SKen Wang 
36462a37553SKen Wang static const u32 oland_golden_rlc_registers[] =
36562a37553SKen Wang {
36678bbe771STom St Denis 	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
36778bbe771STom St Denis 	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
36862a37553SKen Wang 	0x311f, 0xffffffff, 0x10104040,
36962a37553SKen Wang 	0x3122, 0xffffffff, 0x0100000a,
37078bbe771STom St Denis 	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
37178bbe771STom St Denis 	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
37262a37553SKen Wang };
37362a37553SKen Wang 
37462a37553SKen Wang static const u32 hainan_golden_registers[] =
37562a37553SKen Wang {
376bd27b678SFlora Cui 	0x17bc, 0x00000030, 0x00000011,
37778bbe771STom St Denis 	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
37878bbe771STom St Denis 	mmDB_DEBUG, 0xffffffff, 0x00000000,
37978bbe771STom St Denis 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
38078bbe771STom St Denis 	mmDB_DEBUG3, 0x0002021c, 0x00020200,
381bd27b678SFlora Cui 	0x031e, 0x00000080, 0x00000000,
382bd27b678SFlora Cui 	0x3430, 0xff000fff, 0x00000100,
38362a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
38462a37553SKen Wang 	0x3630, 0xff000fff, 0x00000100,
38562a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
386bd27b678SFlora Cui 	0x16ec, 0x000000f0, 0x00000070,
387bd27b678SFlora Cui 	0x16f0, 0x00200000, 0x50100000,
388bd27b678SFlora Cui 	0x1c0c, 0x31000311, 0x00000011,
38978bbe771STom St Denis 	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
39078bbe771STom St Denis 	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
39178bbe771STom St Denis 	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
39278bbe771STom St Denis 	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
39378bbe771STom St Denis 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
39478bbe771STom St Denis 	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
39578bbe771STom St Denis 	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
396bd27b678SFlora Cui 	0x000c, 0xffffffff, 0x0040,
39762a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
39878bbe771STom St Denis 	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
39978bbe771STom St Denis 	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
40078bbe771STom St Denis 	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
40178bbe771STom St Denis 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
40278bbe771STom St Denis 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
40378bbe771STom St Denis 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
40478bbe771STom St Denis 	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
40578bbe771STom St Denis 	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
40678bbe771STom St Denis 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
40778bbe771STom St Denis 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
40878bbe771STom St Denis 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
40978bbe771STom St Denis 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
41062a37553SKen Wang };
41162a37553SKen Wang 
41262a37553SKen Wang static const u32 hainan_golden_registers2[] =
41362a37553SKen Wang {
41478bbe771STom St Denis 	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
41562a37553SKen Wang };
41662a37553SKen Wang 
41762a37553SKen Wang static const u32 tahiti_mgcg_cgcg_init[] =
41862a37553SKen Wang {
41978bbe771STom St Denis 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
42078bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
42178bbe771STom St Denis 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
42278bbe771STom St Denis 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
42378bbe771STom St Denis 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
42478bbe771STom St Denis 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
42578bbe771STom St Denis 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
42678bbe771STom St Denis 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
42778bbe771STom St Denis 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
42878bbe771STom St Denis 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
42978bbe771STom St Denis 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
43078bbe771STom St Denis 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
43178bbe771STom St Denis 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
43278bbe771STom St Denis 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
43378bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
43478bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
43578bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
43678bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
43778bbe771STom St Denis 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
43878bbe771STom St Denis 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
43978bbe771STom St Denis 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
44078bbe771STom St Denis 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
44178bbe771STom St Denis 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
44278bbe771STom St Denis 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
44378bbe771STom St Denis 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
44478bbe771STom St Denis 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
44578bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
44662a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
44762a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
44862a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
44962a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
45062a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
45162a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
45262a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
45362a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
45462a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
45562a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
45662a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
45762a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
45862a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
45962a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
46062a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
46162a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
46262a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
46362a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
46462a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
46562a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
46662a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
46762a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
46862a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
46962a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
47062a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
47162a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
47262a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
47362a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
47462a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
47562a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
47662a37553SKen Wang 	0x2476, 0xffffffff, 0x00070006,
47762a37553SKen Wang 	0x2477, 0xffffffff, 0x00090008,
47862a37553SKen Wang 	0x2478, 0xffffffff, 0x0000000c,
47962a37553SKen Wang 	0x2479, 0xffffffff, 0x000b000a,
48062a37553SKen Wang 	0x247a, 0xffffffff, 0x000e000d,
48162a37553SKen Wang 	0x247b, 0xffffffff, 0x00080007,
48262a37553SKen Wang 	0x247c, 0xffffffff, 0x000a0009,
48362a37553SKen Wang 	0x247d, 0xffffffff, 0x0000000d,
48462a37553SKen Wang 	0x247e, 0xffffffff, 0x000c000b,
48562a37553SKen Wang 	0x247f, 0xffffffff, 0x000f000e,
48662a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
48762a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
48862a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
48962a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
49062a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
49162a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
49262a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
49362a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
49462a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
49562a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
49662a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
49762a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
49862a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
49962a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
50062a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
50162a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
50262a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
50362a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
50462a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
50562a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
50662a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
50762a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
50862a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
50962a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
51062a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
51162a37553SKen Wang 	0x2499, 0xffffffff, 0x000e000d,
51262a37553SKen Wang 	0x249a, 0xffffffff, 0x0010000f,
51362a37553SKen Wang 	0x249b, 0xffffffff, 0x00000013,
51462a37553SKen Wang 	0x249c, 0xffffffff, 0x00120011,
51562a37553SKen Wang 	0x249d, 0xffffffff, 0x00150014,
51662a37553SKen Wang 	0x249e, 0xffffffff, 0x000f000e,
51762a37553SKen Wang 	0x249f, 0xffffffff, 0x00110010,
51862a37553SKen Wang 	0x24a0, 0xffffffff, 0x00000014,
51962a37553SKen Wang 	0x24a1, 0xffffffff, 0x00130012,
52062a37553SKen Wang 	0x24a2, 0xffffffff, 0x00160015,
52162a37553SKen Wang 	0x24a3, 0xffffffff, 0x0010000f,
52262a37553SKen Wang 	0x24a4, 0xffffffff, 0x00120011,
52362a37553SKen Wang 	0x24a5, 0xffffffff, 0x00000015,
52462a37553SKen Wang 	0x24a6, 0xffffffff, 0x00140013,
52562a37553SKen Wang 	0x24a7, 0xffffffff, 0x00170016,
52678bbe771STom St Denis 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
52778bbe771STom St Denis 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
52878bbe771STom St Denis 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
52978bbe771STom St Denis 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
5307c0a705eSFlora Cui 	0x000c, 0xffffffff, 0x0000001c,
5317c0a705eSFlora Cui 	0x000d, 0x000f0000, 0x000f0000,
5327c0a705eSFlora Cui 	0x0583, 0xffffffff, 0x00000100,
53378bbe771STom St Denis 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
53478bbe771STom St Denis 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
53578bbe771STom St Denis 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
53678bbe771STom St Denis 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
53778bbe771STom St Denis 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
53878bbe771STom St Denis 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
53962a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
54078bbe771STom St Denis 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
54178bbe771STom St Denis 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
54278bbe771STom St Denis 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
54362a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
54478bbe771STom St Denis 	0x3630, 0xfffffff0, 0x00000100,
54562a37553SKen Wang };
54662a37553SKen Wang static const u32 pitcairn_mgcg_cgcg_init[] =
54762a37553SKen Wang {
54878bbe771STom St Denis 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
54978bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
55078bbe771STom St Denis 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
55178bbe771STom St Denis 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
55278bbe771STom St Denis 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
55378bbe771STom St Denis 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
55478bbe771STom St Denis 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
55578bbe771STom St Denis 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
55678bbe771STom St Denis 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
55778bbe771STom St Denis 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
55878bbe771STom St Denis 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
55978bbe771STom St Denis 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
56078bbe771STom St Denis 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
56178bbe771STom St Denis 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
56278bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
56378bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
56478bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
56578bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
56678bbe771STom St Denis 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
56778bbe771STom St Denis 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
56878bbe771STom St Denis 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
56978bbe771STom St Denis 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
57078bbe771STom St Denis 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
57178bbe771STom St Denis 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
57278bbe771STom St Denis 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
57378bbe771STom St Denis 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
57478bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
57562a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
57662a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
57762a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
57862a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
57962a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
58062a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
58162a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
58262a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
58362a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
58462a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
58562a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
58662a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
58762a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
58862a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
58962a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
59062a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
59162a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
59262a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
59362a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
59462a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
59562a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
59662a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
59762a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
59862a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
59962a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
60062a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
60162a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
60262a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
60362a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
60462a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
60562a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
60662a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
60762a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
60862a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
60962a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
61062a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
61162a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
61262a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
61362a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
61462a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
61562a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
61662a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
61762a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
61862a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
61962a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
62062a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
62162a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
62262a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
62362a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
62462a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
62578bbe771STom St Denis 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
62678bbe771STom St Denis 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
62778bbe771STom St Denis 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
62878bbe771STom St Denis 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
6291245a694SFlora Cui 	0x000c, 0xffffffff, 0x0000001c,
6301245a694SFlora Cui 	0x000d, 0x000f0000, 0x000f0000,
6311245a694SFlora Cui 	0x0583, 0xffffffff, 0x00000100,
63278bbe771STom St Denis 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
63378bbe771STom St Denis 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
63478bbe771STom St Denis 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
63578bbe771STom St Denis 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
63662a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
63778bbe771STom St Denis 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
63878bbe771STom St Denis 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
63978bbe771STom St Denis 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
64062a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
64178bbe771STom St Denis 	0x3630, 0xfffffff0, 0x00000100,
64262a37553SKen Wang };
64378bbe771STom St Denis 
64462a37553SKen Wang static const u32 verde_mgcg_cgcg_init[] =
64562a37553SKen Wang {
64678bbe771STom St Denis 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
64778bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
64878bbe771STom St Denis 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
64978bbe771STom St Denis 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
65078bbe771STom St Denis 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
65178bbe771STom St Denis 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
65278bbe771STom St Denis 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
65378bbe771STom St Denis 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
65478bbe771STom St Denis 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
65578bbe771STom St Denis 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
65678bbe771STom St Denis 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
65778bbe771STom St Denis 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
65878bbe771STom St Denis 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
65978bbe771STom St Denis 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
66078bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
66178bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
66278bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
66378bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
66478bbe771STom St Denis 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
66578bbe771STom St Denis 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
66678bbe771STom St Denis 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
66778bbe771STom St Denis 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
66878bbe771STom St Denis 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
66978bbe771STom St Denis 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
67078bbe771STom St Denis 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
67178bbe771STom St Denis 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
67278bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
67362a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
67462a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
67562a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
67662a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
67762a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
67862a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
67962a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
68062a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
68162a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
68262a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
68362a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
68462a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
68562a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
68662a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
68762a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
68862a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
68962a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
69062a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
69162a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
69262a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
69362a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
69462a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
69562a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
69662a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
69762a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
69862a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
69962a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
70062a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
70162a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
70262a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
70362a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
70462a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
70562a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
70662a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
70762a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
70862a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
70962a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
71062a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
71162a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
71262a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
71362a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
71462a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
71562a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
71662a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
71762a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
71862a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
71962a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
72062a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
72162a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
72262a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
72378bbe771STom St Denis 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
72478bbe771STom St Denis 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
72578bbe771STom St Denis 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
72678bbe771STom St Denis 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
727dae5c298SFlora Cui 	0x000c, 0xffffffff, 0x0000001c,
728dae5c298SFlora Cui 	0x000d, 0x000f0000, 0x000f0000,
729dae5c298SFlora Cui 	0x0583, 0xffffffff, 0x00000100,
73078bbe771STom St Denis 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
73178bbe771STom St Denis 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
73278bbe771STom St Denis 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
73378bbe771STom St Denis 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
73478bbe771STom St Denis 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
73578bbe771STom St Denis 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
73662a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
73778bbe771STom St Denis 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
73878bbe771STom St Denis 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
73978bbe771STom St Denis 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
74062a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
74178bbe771STom St Denis 	0x3630, 0xfffffff0, 0x00000100,
74262a37553SKen Wang };
74378bbe771STom St Denis 
74462a37553SKen Wang static const u32 oland_mgcg_cgcg_init[] =
74562a37553SKen Wang {
74678bbe771STom St Denis 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
74778bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
74878bbe771STom St Denis 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
74978bbe771STom St Denis 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
75078bbe771STom St Denis 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
75178bbe771STom St Denis 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
75278bbe771STom St Denis 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
75378bbe771STom St Denis 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
75478bbe771STom St Denis 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
75578bbe771STom St Denis 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
75678bbe771STom St Denis 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
75778bbe771STom St Denis 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
75878bbe771STom St Denis 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
75978bbe771STom St Denis 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
76078bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
76178bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
76278bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
76378bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
76478bbe771STom St Denis 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
76578bbe771STom St Denis 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
76678bbe771STom St Denis 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
76778bbe771STom St Denis 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
76878bbe771STom St Denis 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
76978bbe771STom St Denis 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
77078bbe771STom St Denis 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
77178bbe771STom St Denis 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
77278bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
77362a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
77462a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
77562a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
77662a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
77762a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
77862a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
77962a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
78062a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
78162a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
78262a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
78362a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
78462a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
78562a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
78662a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
78762a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
78862a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
78962a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
79062a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
79162a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
79262a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
79362a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
79462a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
79562a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
79662a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
79762a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
79862a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
79962a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
80062a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
80162a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
80262a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
80378bbe771STom St Denis 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
80478bbe771STom St Denis 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
80578bbe771STom St Denis 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
80678bbe771STom St Denis 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
8076b7985efSFlora Cui 	0x000c, 0xffffffff, 0x0000001c,
8086b7985efSFlora Cui 	0x000d, 0x000f0000, 0x000f0000,
8096b7985efSFlora Cui 	0x0583, 0xffffffff, 0x00000100,
81078bbe771STom St Denis 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
81178bbe771STom St Denis 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
81278bbe771STom St Denis 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
81378bbe771STom St Denis 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
81478bbe771STom St Denis 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
81578bbe771STom St Denis 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
81662a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
81778bbe771STom St Denis 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
81878bbe771STom St Denis 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
81978bbe771STom St Denis 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
82062a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
82178bbe771STom St Denis 	0x3630, 0xfffffff0, 0x00000100,
82262a37553SKen Wang };
82378bbe771STom St Denis 
82462a37553SKen Wang static const u32 hainan_mgcg_cgcg_init[] =
82562a37553SKen Wang {
82678bbe771STom St Denis 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
82778bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
82878bbe771STom St Denis 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
82978bbe771STom St Denis 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
83078bbe771STom St Denis 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
83178bbe771STom St Denis 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
83278bbe771STom St Denis 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
83378bbe771STom St Denis 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
83478bbe771STom St Denis 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
83578bbe771STom St Denis 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
83678bbe771STom St Denis 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
83778bbe771STom St Denis 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
83878bbe771STom St Denis 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
83978bbe771STom St Denis 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
84078bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
84178bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
84278bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
84378bbe771STom St Denis 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
84478bbe771STom St Denis 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
84578bbe771STom St Denis 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
84678bbe771STom St Denis 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
84778bbe771STom St Denis 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
84878bbe771STom St Denis 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
84978bbe771STom St Denis 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
85078bbe771STom St Denis 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
85178bbe771STom St Denis 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
85278bbe771STom St Denis 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
85362a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
85462a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
85562a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
85662a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
85762a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
85862a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
85962a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
86062a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
86162a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
86262a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
86362a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
86462a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
86562a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
86662a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
86762a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
86862a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
86962a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
87062a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
87162a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
87262a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
87362a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
87462a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
87562a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
87662a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
87762a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
87862a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
87962a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
88062a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
88162a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
88262a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
88378bbe771STom St Denis 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
88478bbe771STom St Denis 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
88578bbe771STom St Denis 	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
88678bbe771STom St Denis 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
887bd27b678SFlora Cui 	0x000c, 0xffffffff, 0x0000001c,
888bd27b678SFlora Cui 	0x000d, 0x000f0000, 0x000f0000,
889bd27b678SFlora Cui 	0x0583, 0xffffffff, 0x00000100,
890bd27b678SFlora Cui 	0x0409, 0xffffffff, 0x00000100,
89178bbe771STom St Denis 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
89278bbe771STom St Denis 	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
89378bbe771STom St Denis 	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
89478bbe771STom St Denis 	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
89578bbe771STom St Denis 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
89678bbe771STom St Denis 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
89762a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
89878bbe771STom St Denis 	0x3630, 0xfffffff0, 0x00000100,
89962a37553SKen Wang };
90062a37553SKen Wang 
90162a37553SKen Wang static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
90262a37553SKen Wang {
90362a37553SKen Wang 	unsigned long flags;
90462a37553SKen Wang 	u32 r;
90562a37553SKen Wang 
90662a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
90762a37553SKen Wang 	WREG32(AMDGPU_PCIE_INDEX, reg);
90862a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_INDEX);
90962a37553SKen Wang 	r = RREG32(AMDGPU_PCIE_DATA);
91062a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
91162a37553SKen Wang 	return r;
91262a37553SKen Wang }
91362a37553SKen Wang 
91462a37553SKen Wang static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
91562a37553SKen Wang {
91662a37553SKen Wang 	unsigned long flags;
91762a37553SKen Wang 
91862a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
91962a37553SKen Wang 	WREG32(AMDGPU_PCIE_INDEX, reg);
92062a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_INDEX);
92162a37553SKen Wang 	WREG32(AMDGPU_PCIE_DATA, v);
92262a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_DATA);
92362a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
92462a37553SKen Wang }
92562a37553SKen Wang 
926d1936cc2SBaoyou Xie static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
92736b9a952SHuang Rui {
92836b9a952SHuang Rui 	unsigned long flags;
92936b9a952SHuang Rui 	u32 r;
93036b9a952SHuang Rui 
93136b9a952SHuang Rui 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
93236b9a952SHuang Rui 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
93336b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_INDEX);
93436b9a952SHuang Rui 	r = RREG32(PCIE_PORT_DATA);
93536b9a952SHuang Rui 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
93636b9a952SHuang Rui 	return r;
93736b9a952SHuang Rui }
93836b9a952SHuang Rui 
939d1936cc2SBaoyou Xie static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
94036b9a952SHuang Rui {
94136b9a952SHuang Rui 	unsigned long flags;
94236b9a952SHuang Rui 
94336b9a952SHuang Rui 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
94436b9a952SHuang Rui 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
94536b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_INDEX);
94636b9a952SHuang Rui 	WREG32(PCIE_PORT_DATA, (v));
94736b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_DATA);
94836b9a952SHuang Rui 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
94936b9a952SHuang Rui }
95036b9a952SHuang Rui 
95162a37553SKen Wang static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
95262a37553SKen Wang {
95362a37553SKen Wang 	unsigned long flags;
95462a37553SKen Wang 	u32 r;
95562a37553SKen Wang 
95662a37553SKen Wang 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
95762a37553SKen Wang 	WREG32(SMC_IND_INDEX_0, (reg));
95862a37553SKen Wang 	r = RREG32(SMC_IND_DATA_0);
95962a37553SKen Wang 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
96062a37553SKen Wang 	return r;
96162a37553SKen Wang }
96262a37553SKen Wang 
96362a37553SKen Wang static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
96462a37553SKen Wang {
96562a37553SKen Wang 	unsigned long flags;
96662a37553SKen Wang 
96762a37553SKen Wang 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
96862a37553SKen Wang 	WREG32(SMC_IND_INDEX_0, (reg));
96962a37553SKen Wang 	WREG32(SMC_IND_DATA_0, (v));
97062a37553SKen Wang 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
97162a37553SKen Wang }
97262a37553SKen Wang 
97362a37553SKen Wang static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
97497fcc76bSChristian König 	{GRBM_STATUS},
97597fcc76bSChristian König 	{GB_ADDR_CONFIG},
97697fcc76bSChristian König 	{MC_ARB_RAMCFG},
97797fcc76bSChristian König 	{GB_TILE_MODE0},
97897fcc76bSChristian König 	{GB_TILE_MODE1},
97997fcc76bSChristian König 	{GB_TILE_MODE2},
98097fcc76bSChristian König 	{GB_TILE_MODE3},
98197fcc76bSChristian König 	{GB_TILE_MODE4},
98297fcc76bSChristian König 	{GB_TILE_MODE5},
98397fcc76bSChristian König 	{GB_TILE_MODE6},
98497fcc76bSChristian König 	{GB_TILE_MODE7},
98597fcc76bSChristian König 	{GB_TILE_MODE8},
98697fcc76bSChristian König 	{GB_TILE_MODE9},
98797fcc76bSChristian König 	{GB_TILE_MODE10},
98897fcc76bSChristian König 	{GB_TILE_MODE11},
98997fcc76bSChristian König 	{GB_TILE_MODE12},
99097fcc76bSChristian König 	{GB_TILE_MODE13},
99197fcc76bSChristian König 	{GB_TILE_MODE14},
99297fcc76bSChristian König 	{GB_TILE_MODE15},
99397fcc76bSChristian König 	{GB_TILE_MODE16},
99497fcc76bSChristian König 	{GB_TILE_MODE17},
99597fcc76bSChristian König 	{GB_TILE_MODE18},
99697fcc76bSChristian König 	{GB_TILE_MODE19},
99797fcc76bSChristian König 	{GB_TILE_MODE20},
99897fcc76bSChristian König 	{GB_TILE_MODE21},
99997fcc76bSChristian König 	{GB_TILE_MODE22},
100097fcc76bSChristian König 	{GB_TILE_MODE23},
100197fcc76bSChristian König 	{GB_TILE_MODE24},
100297fcc76bSChristian König 	{GB_TILE_MODE25},
100397fcc76bSChristian König 	{GB_TILE_MODE26},
100497fcc76bSChristian König 	{GB_TILE_MODE27},
100597fcc76bSChristian König 	{GB_TILE_MODE28},
100697fcc76bSChristian König 	{GB_TILE_MODE29},
100797fcc76bSChristian König 	{GB_TILE_MODE30},
100897fcc76bSChristian König 	{GB_TILE_MODE31},
100997fcc76bSChristian König 	{CC_RB_BACKEND_DISABLE, true},
101097fcc76bSChristian König 	{GC_USER_RB_BACKEND_DISABLE, true},
101197fcc76bSChristian König 	{PA_SC_RASTER_CONFIG, true},
101262a37553SKen Wang };
101362a37553SKen Wang 
1014dd5dfa61SFlora Cui static uint32_t si_get_register_value(struct amdgpu_device *adev,
1015dd5dfa61SFlora Cui 				      bool indexed, u32 se_num,
1016dd5dfa61SFlora Cui 				      u32 sh_num, u32 reg_offset)
101762a37553SKen Wang {
1018dd5dfa61SFlora Cui 	if (indexed) {
101962a37553SKen Wang 		uint32_t val;
1020dd5dfa61SFlora Cui 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1021dd5dfa61SFlora Cui 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1022dd5dfa61SFlora Cui 
1023dd5dfa61SFlora Cui 		switch (reg_offset) {
1024dd5dfa61SFlora Cui 		case mmCC_RB_BACKEND_DISABLE:
1025dd5dfa61SFlora Cui 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1026dd5dfa61SFlora Cui 		case mmGC_USER_RB_BACKEND_DISABLE:
1027dd5dfa61SFlora Cui 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1028dd5dfa61SFlora Cui 		case mmPA_SC_RASTER_CONFIG:
1029dd5dfa61SFlora Cui 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1030dd5dfa61SFlora Cui 		}
103162a37553SKen Wang 
103262a37553SKen Wang 		mutex_lock(&adev->grbm_idx_mutex);
103362a37553SKen Wang 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
103462a37553SKen Wang 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
103562a37553SKen Wang 
103662a37553SKen Wang 		val = RREG32(reg_offset);
103762a37553SKen Wang 
103862a37553SKen Wang 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
103962a37553SKen Wang 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
104062a37553SKen Wang 		mutex_unlock(&adev->grbm_idx_mutex);
104162a37553SKen Wang 		return val;
1042dd5dfa61SFlora Cui 	} else {
1043dd5dfa61SFlora Cui 		unsigned idx;
104462a37553SKen Wang 
1045dd5dfa61SFlora Cui 		switch (reg_offset) {
1046dd5dfa61SFlora Cui 		case mmGB_ADDR_CONFIG:
1047dd5dfa61SFlora Cui 			return adev->gfx.config.gb_addr_config;
1048dd5dfa61SFlora Cui 		case mmMC_ARB_RAMCFG:
1049dd5dfa61SFlora Cui 			return adev->gfx.config.mc_arb_ramcfg;
1050dd5dfa61SFlora Cui 		case mmGB_TILE_MODE0:
1051dd5dfa61SFlora Cui 		case mmGB_TILE_MODE1:
1052dd5dfa61SFlora Cui 		case mmGB_TILE_MODE2:
1053dd5dfa61SFlora Cui 		case mmGB_TILE_MODE3:
1054dd5dfa61SFlora Cui 		case mmGB_TILE_MODE4:
1055dd5dfa61SFlora Cui 		case mmGB_TILE_MODE5:
1056dd5dfa61SFlora Cui 		case mmGB_TILE_MODE6:
1057dd5dfa61SFlora Cui 		case mmGB_TILE_MODE7:
1058dd5dfa61SFlora Cui 		case mmGB_TILE_MODE8:
1059dd5dfa61SFlora Cui 		case mmGB_TILE_MODE9:
1060dd5dfa61SFlora Cui 		case mmGB_TILE_MODE10:
1061dd5dfa61SFlora Cui 		case mmGB_TILE_MODE11:
1062dd5dfa61SFlora Cui 		case mmGB_TILE_MODE12:
1063dd5dfa61SFlora Cui 		case mmGB_TILE_MODE13:
1064dd5dfa61SFlora Cui 		case mmGB_TILE_MODE14:
1065dd5dfa61SFlora Cui 		case mmGB_TILE_MODE15:
1066dd5dfa61SFlora Cui 		case mmGB_TILE_MODE16:
1067dd5dfa61SFlora Cui 		case mmGB_TILE_MODE17:
1068dd5dfa61SFlora Cui 		case mmGB_TILE_MODE18:
1069dd5dfa61SFlora Cui 		case mmGB_TILE_MODE19:
1070dd5dfa61SFlora Cui 		case mmGB_TILE_MODE20:
1071dd5dfa61SFlora Cui 		case mmGB_TILE_MODE21:
1072dd5dfa61SFlora Cui 		case mmGB_TILE_MODE22:
1073dd5dfa61SFlora Cui 		case mmGB_TILE_MODE23:
1074dd5dfa61SFlora Cui 		case mmGB_TILE_MODE24:
1075dd5dfa61SFlora Cui 		case mmGB_TILE_MODE25:
1076dd5dfa61SFlora Cui 		case mmGB_TILE_MODE26:
1077dd5dfa61SFlora Cui 		case mmGB_TILE_MODE27:
1078dd5dfa61SFlora Cui 		case mmGB_TILE_MODE28:
1079dd5dfa61SFlora Cui 		case mmGB_TILE_MODE29:
1080dd5dfa61SFlora Cui 		case mmGB_TILE_MODE30:
1081dd5dfa61SFlora Cui 		case mmGB_TILE_MODE31:
1082dd5dfa61SFlora Cui 			idx = (reg_offset - mmGB_TILE_MODE0);
1083dd5dfa61SFlora Cui 			return adev->gfx.config.tile_mode_array[idx];
1084dd5dfa61SFlora Cui 		default:
1085dd5dfa61SFlora Cui 			return RREG32(reg_offset);
1086dd5dfa61SFlora Cui 		}
1087dd5dfa61SFlora Cui 	}
1088dd5dfa61SFlora Cui }
108962a37553SKen Wang static int si_read_register(struct amdgpu_device *adev, u32 se_num,
109062a37553SKen Wang 			     u32 sh_num, u32 reg_offset, u32 *value)
109162a37553SKen Wang {
109262a37553SKen Wang 	uint32_t i;
109362a37553SKen Wang 
109462a37553SKen Wang 	*value = 0;
109562a37553SKen Wang 	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
109697fcc76bSChristian König 		bool indexed = si_allowed_read_registers[i].grbm_indexed;
109797fcc76bSChristian König 
109862a37553SKen Wang 		if (reg_offset != si_allowed_read_registers[i].reg_offset)
109962a37553SKen Wang 			continue;
110062a37553SKen Wang 
110197fcc76bSChristian König 		*value = si_get_register_value(adev, indexed, se_num, sh_num,
110297fcc76bSChristian König 					       reg_offset);
110362a37553SKen Wang 		return 0;
110462a37553SKen Wang 	}
110562a37553SKen Wang 	return -EINVAL;
110662a37553SKen Wang }
110762a37553SKen Wang 
110862a37553SKen Wang static bool si_read_disabled_bios(struct amdgpu_device *adev)
110962a37553SKen Wang {
111062a37553SKen Wang 	u32 bus_cntl;
111162a37553SKen Wang 	u32 d1vga_control = 0;
111262a37553SKen Wang 	u32 d2vga_control = 0;
111362a37553SKen Wang 	u32 vga_render_control = 0;
111462a37553SKen Wang 	u32 rom_cntl;
111562a37553SKen Wang 	bool r;
111662a37553SKen Wang 
111762a37553SKen Wang 	bus_cntl = RREG32(R600_BUS_CNTL);
111862a37553SKen Wang 	if (adev->mode_info.num_crtc) {
111962a37553SKen Wang 		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
112062a37553SKen Wang 		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
112162a37553SKen Wang 		vga_render_control = RREG32(VGA_RENDER_CONTROL);
112262a37553SKen Wang 	}
112362a37553SKen Wang 	rom_cntl = RREG32(R600_ROM_CNTL);
112462a37553SKen Wang 
112562a37553SKen Wang 	/* enable the rom */
112662a37553SKen Wang 	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
112762a37553SKen Wang 	if (adev->mode_info.num_crtc) {
112862a37553SKen Wang 		/* Disable VGA mode */
112962a37553SKen Wang 		WREG32(AVIVO_D1VGA_CONTROL,
113062a37553SKen Wang 		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
113162a37553SKen Wang 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
113262a37553SKen Wang 		WREG32(AVIVO_D2VGA_CONTROL,
113362a37553SKen Wang 		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
113462a37553SKen Wang 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
113562a37553SKen Wang 		WREG32(VGA_RENDER_CONTROL,
113662a37553SKen Wang 		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
113762a37553SKen Wang 	}
113862a37553SKen Wang 	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
113962a37553SKen Wang 
114062a37553SKen Wang 	r = amdgpu_read_bios(adev);
114162a37553SKen Wang 
114262a37553SKen Wang 	/* restore regs */
114362a37553SKen Wang 	WREG32(R600_BUS_CNTL, bus_cntl);
114462a37553SKen Wang 	if (adev->mode_info.num_crtc) {
114562a37553SKen Wang 		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
114662a37553SKen Wang 		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
114762a37553SKen Wang 		WREG32(VGA_RENDER_CONTROL, vga_render_control);
114862a37553SKen Wang 	}
114962a37553SKen Wang 	WREG32(R600_ROM_CNTL, rom_cntl);
115062a37553SKen Wang 	return r;
115162a37553SKen Wang }
115262a37553SKen Wang 
11536d949d24SAlex Deucher #define mmROM_INDEX 0x2A
11546d949d24SAlex Deucher #define mmROM_DATA  0x2B
11556d949d24SAlex Deucher 
11566d949d24SAlex Deucher static bool si_read_bios_from_rom(struct amdgpu_device *adev,
11576d949d24SAlex Deucher 				  u8 *bios, u32 length_bytes)
11586d949d24SAlex Deucher {
11596d949d24SAlex Deucher 	u32 *dw_ptr;
11606d949d24SAlex Deucher 	u32 i, length_dw;
11616d949d24SAlex Deucher 
11626d949d24SAlex Deucher 	if (bios == NULL)
11636d949d24SAlex Deucher 		return false;
11646d949d24SAlex Deucher 	if (length_bytes == 0)
11656d949d24SAlex Deucher 		return false;
11666d949d24SAlex Deucher 	/* APU vbios image is part of sbios image */
11676d949d24SAlex Deucher 	if (adev->flags & AMD_IS_APU)
11686d949d24SAlex Deucher 		return false;
11696d949d24SAlex Deucher 
11706d949d24SAlex Deucher 	dw_ptr = (u32 *)bios;
11716d949d24SAlex Deucher 	length_dw = ALIGN(length_bytes, 4) / 4;
11726d949d24SAlex Deucher 	/* set rom index to 0 */
11736d949d24SAlex Deucher 	WREG32(mmROM_INDEX, 0);
11746d949d24SAlex Deucher 	for (i = 0; i < length_dw; i++)
11756d949d24SAlex Deucher 		dw_ptr[i] = RREG32(mmROM_DATA);
11766d949d24SAlex Deucher 
11776d949d24SAlex Deucher 	return true;
11786d949d24SAlex Deucher }
11796d949d24SAlex Deucher 
118062a37553SKen Wang //xxx: not implemented
118162a37553SKen Wang static int si_asic_reset(struct amdgpu_device *adev)
118262a37553SKen Wang {
118362a37553SKen Wang 	return 0;
118462a37553SKen Wang }
118562a37553SKen Wang 
1186bbf282d8SAlex Deucher static u32 si_get_config_memsize(struct amdgpu_device *adev)
1187bbf282d8SAlex Deucher {
1188bbf282d8SAlex Deucher 	return RREG32(mmCONFIG_MEMSIZE);
1189bbf282d8SAlex Deucher }
1190bbf282d8SAlex Deucher 
119162a37553SKen Wang static void si_vga_set_state(struct amdgpu_device *adev, bool state)
119262a37553SKen Wang {
119362a37553SKen Wang 	uint32_t temp;
119462a37553SKen Wang 
119562a37553SKen Wang 	temp = RREG32(CONFIG_CNTL);
119662a37553SKen Wang 	if (state == false) {
119762a37553SKen Wang 		temp &= ~(1<<0);
119862a37553SKen Wang 		temp |= (1<<1);
119962a37553SKen Wang 	} else {
120062a37553SKen Wang 		temp &= ~(1<<1);
120162a37553SKen Wang 	}
120262a37553SKen Wang 	WREG32(CONFIG_CNTL, temp);
120362a37553SKen Wang }
120462a37553SKen Wang 
120562a37553SKen Wang static u32 si_get_xclk(struct amdgpu_device *adev)
120662a37553SKen Wang {
120762a37553SKen Wang         u32 reference_clock = adev->clock.spll.reference_freq;
120862a37553SKen Wang 	u32 tmp;
120962a37553SKen Wang 
121062a37553SKen Wang 	tmp = RREG32(CG_CLKPIN_CNTL_2);
121162a37553SKen Wang 	if (tmp & MUX_TCLK_TO_XCLK)
121262a37553SKen Wang 		return TCLK;
121362a37553SKen Wang 
121462a37553SKen Wang 	tmp = RREG32(CG_CLKPIN_CNTL);
121562a37553SKen Wang 	if (tmp & XTALIN_DIVIDE)
121662a37553SKen Wang 		return reference_clock / 4;
121762a37553SKen Wang 
121862a37553SKen Wang 	return reference_clock;
121962a37553SKen Wang }
12201919696eSMaruthi Srinivas Bayyavarapu 
122162a37553SKen Wang //xxx:not implemented
122262a37553SKen Wang static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
122362a37553SKen Wang {
122462a37553SKen Wang 	return 0;
122562a37553SKen Wang }
122662a37553SKen Wang 
12274e99a44eSMonk Liu static void si_detect_hw_virtualization(struct amdgpu_device *adev)
12284e99a44eSMonk Liu {
12294e99a44eSMonk Liu 	if (is_virtual_machine()) /* passthrough mode */
12305a5099cbSXiangliang Yu 		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
12314e99a44eSMonk Liu }
12324e99a44eSMonk Liu 
1233*2d5e0807SAlex Deucher static void si_flush_hdp(struct amdgpu_device *adev)
1234*2d5e0807SAlex Deucher {
1235*2d5e0807SAlex Deucher 	WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1236*2d5e0807SAlex Deucher 	RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1237*2d5e0807SAlex Deucher }
1238*2d5e0807SAlex Deucher 
1239*2d5e0807SAlex Deucher static void si_invalidate_hdp(struct amdgpu_device *adev)
1240*2d5e0807SAlex Deucher {
1241*2d5e0807SAlex Deucher 	WREG32(mmHDP_DEBUG0, 1);
1242*2d5e0807SAlex Deucher 	RREG32(mmHDP_DEBUG0);
1243*2d5e0807SAlex Deucher }
1244*2d5e0807SAlex Deucher 
124562a37553SKen Wang static const struct amdgpu_asic_funcs si_asic_funcs =
124662a37553SKen Wang {
124762a37553SKen Wang 	.read_disabled_bios = &si_read_disabled_bios,
12486d949d24SAlex Deucher 	.read_bios_from_rom = &si_read_bios_from_rom,
124962a37553SKen Wang 	.read_register = &si_read_register,
125062a37553SKen Wang 	.reset = &si_asic_reset,
125162a37553SKen Wang 	.set_vga_state = &si_vga_set_state,
125262a37553SKen Wang 	.get_xclk = &si_get_xclk,
125362a37553SKen Wang 	.set_uvd_clocks = &si_set_uvd_clocks,
125462a37553SKen Wang 	.set_vce_clocks = NULL,
1255bbf282d8SAlex Deucher 	.get_config_memsize = &si_get_config_memsize,
1256*2d5e0807SAlex Deucher 	.flush_hdp = &si_flush_hdp,
1257*2d5e0807SAlex Deucher 	.invalidate_hdp = &si_invalidate_hdp,
125862a37553SKen Wang };
125962a37553SKen Wang 
126062a37553SKen Wang static uint32_t si_get_rev_id(struct amdgpu_device *adev)
126162a37553SKen Wang {
126262a37553SKen Wang 	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
126362a37553SKen Wang 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
126462a37553SKen Wang }
126562a37553SKen Wang 
126662a37553SKen Wang static int si_common_early_init(void *handle)
126762a37553SKen Wang {
126862a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
126962a37553SKen Wang 
127062a37553SKen Wang 	adev->smc_rreg = &si_smc_rreg;
127162a37553SKen Wang 	adev->smc_wreg = &si_smc_wreg;
127262a37553SKen Wang 	adev->pcie_rreg = &si_pcie_rreg;
127362a37553SKen Wang 	adev->pcie_wreg = &si_pcie_wreg;
127436b9a952SHuang Rui 	adev->pciep_rreg = &si_pciep_rreg;
127536b9a952SHuang Rui 	adev->pciep_wreg = &si_pciep_wreg;
127662a37553SKen Wang 	adev->uvd_ctx_rreg = NULL;
127762a37553SKen Wang 	adev->uvd_ctx_wreg = NULL;
127862a37553SKen Wang 	adev->didt_rreg = NULL;
127962a37553SKen Wang 	adev->didt_wreg = NULL;
128062a37553SKen Wang 
128162a37553SKen Wang 	adev->asic_funcs = &si_asic_funcs;
128262a37553SKen Wang 
128362a37553SKen Wang 	adev->rev_id = si_get_rev_id(adev);
128462a37553SKen Wang 	adev->external_rev_id = 0xFF;
128562a37553SKen Wang 	switch (adev->asic_type) {
128662a37553SKen Wang 	case CHIP_TAHITI:
128762a37553SKen Wang 		adev->cg_flags =
128862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
128962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
129062a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
129162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
129262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
129362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
129462a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
129562a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
129662a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
129762a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
129862a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
129962a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
130062a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
130162a37553SKen Wang 			adev->pg_flags = 0;
13027c0a705eSFlora Cui 		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
13037c0a705eSFlora Cui 					(adev->rev_id == 1) ? 5 : 6;
130462a37553SKen Wang 		break;
130562a37553SKen Wang 	case CHIP_PITCAIRN:
130662a37553SKen Wang 		adev->cg_flags =
130762a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
130862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
130962a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
131062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
131162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
131262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
131362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
131462a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
131562a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
131662a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
131762a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
131862a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
131962a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
132062a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
132162a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
132262a37553SKen Wang 		adev->pg_flags = 0;
1323e285a9a6SFlora Cui 		adev->external_rev_id = adev->rev_id + 20;
132462a37553SKen Wang 		break;
132562a37553SKen Wang 
132662a37553SKen Wang 	case CHIP_VERDE:
132762a37553SKen Wang 		adev->cg_flags =
132862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
132962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
133062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
133162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
133262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS_LS |
133362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
133462a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
133562a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
133662a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
133762a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_LS |
133862a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
133962a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
134062a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
134162a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
134262a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
134362a37553SKen Wang 		adev->pg_flags = 0;
134462a37553SKen Wang 		//???
1345f815b29cSFlora Cui 		adev->external_rev_id = adev->rev_id + 40;
134662a37553SKen Wang 		break;
134762a37553SKen Wang 	case CHIP_OLAND:
134862a37553SKen Wang 		adev->cg_flags =
134962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
135062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
135162a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
135262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
135362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
135462a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
135562a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
135662a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
135762a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
135862a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
135962a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
136062a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
136162a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
136262a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
136362a37553SKen Wang 		adev->pg_flags = 0;
13648fd74cb4SFlora Cui 		adev->external_rev_id = 60;
136562a37553SKen Wang 		break;
136662a37553SKen Wang 	case CHIP_HAINAN:
136762a37553SKen Wang 		adev->cg_flags =
136862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
136962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
137062a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
137162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
137262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
137362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
137462a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
137562a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
137662a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
137762a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
137862a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
137962a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
138062a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
138162a37553SKen Wang 		adev->pg_flags = 0;
138205319478SFlora Cui 		adev->external_rev_id = 70;
138362a37553SKen Wang 		break;
138462a37553SKen Wang 
138562a37553SKen Wang 	default:
138662a37553SKen Wang 		return -EINVAL;
138762a37553SKen Wang 	}
138862a37553SKen Wang 
138962a37553SKen Wang 	return 0;
139062a37553SKen Wang }
139162a37553SKen Wang 
139262a37553SKen Wang static int si_common_sw_init(void *handle)
139362a37553SKen Wang {
139462a37553SKen Wang 	return 0;
139562a37553SKen Wang }
139662a37553SKen Wang 
139762a37553SKen Wang static int si_common_sw_fini(void *handle)
139862a37553SKen Wang {
139962a37553SKen Wang 	return 0;
140062a37553SKen Wang }
140162a37553SKen Wang 
140262a37553SKen Wang 
140362a37553SKen Wang static void si_init_golden_registers(struct amdgpu_device *adev)
140462a37553SKen Wang {
140562a37553SKen Wang 	switch (adev->asic_type) {
140662a37553SKen Wang 	case CHIP_TAHITI:
14079c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
140862a37553SKen Wang 							tahiti_golden_registers,
1409c47b41a7SChristian König 							ARRAY_SIZE(tahiti_golden_registers));
14109c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
141162a37553SKen Wang 							tahiti_golden_rlc_registers,
1412c47b41a7SChristian König 							ARRAY_SIZE(tahiti_golden_rlc_registers));
14139c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
141462a37553SKen Wang 							tahiti_mgcg_cgcg_init,
1415c47b41a7SChristian König 							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
14169c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
141762a37553SKen Wang 							tahiti_golden_registers2,
1418c47b41a7SChristian König 							ARRAY_SIZE(tahiti_golden_registers2));
141962a37553SKen Wang 		break;
142062a37553SKen Wang 	case CHIP_PITCAIRN:
14219c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
142262a37553SKen Wang 							pitcairn_golden_registers,
1423c47b41a7SChristian König 							ARRAY_SIZE(pitcairn_golden_registers));
14249c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
142562a37553SKen Wang 							pitcairn_golden_rlc_registers,
1426c47b41a7SChristian König 							ARRAY_SIZE(pitcairn_golden_rlc_registers));
14279c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
142862a37553SKen Wang 							pitcairn_mgcg_cgcg_init,
1429c47b41a7SChristian König 							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
14305694785cSJean Delvare 		break;
143162a37553SKen Wang 	case CHIP_VERDE:
14329c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
143362a37553SKen Wang 							verde_golden_registers,
1434c47b41a7SChristian König 							ARRAY_SIZE(verde_golden_registers));
14359c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
143662a37553SKen Wang 							verde_golden_rlc_registers,
1437c47b41a7SChristian König 							ARRAY_SIZE(verde_golden_rlc_registers));
14389c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
143962a37553SKen Wang 							verde_mgcg_cgcg_init,
1440c47b41a7SChristian König 							ARRAY_SIZE(verde_mgcg_cgcg_init));
14419c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
144262a37553SKen Wang 							verde_pg_init,
1443c47b41a7SChristian König 							ARRAY_SIZE(verde_pg_init));
144462a37553SKen Wang 		break;
144562a37553SKen Wang 	case CHIP_OLAND:
14469c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
144762a37553SKen Wang 							oland_golden_registers,
1448c47b41a7SChristian König 							ARRAY_SIZE(oland_golden_registers));
14499c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
145062a37553SKen Wang 							oland_golden_rlc_registers,
1451c47b41a7SChristian König 							ARRAY_SIZE(oland_golden_rlc_registers));
14529c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
145362a37553SKen Wang 							oland_mgcg_cgcg_init,
1454c47b41a7SChristian König 							ARRAY_SIZE(oland_mgcg_cgcg_init));
14555694785cSJean Delvare 		break;
145662a37553SKen Wang 	case CHIP_HAINAN:
14579c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
145862a37553SKen Wang 							hainan_golden_registers,
1459c47b41a7SChristian König 							ARRAY_SIZE(hainan_golden_registers));
14609c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
146162a37553SKen Wang 							hainan_golden_registers2,
1462c47b41a7SChristian König 							ARRAY_SIZE(hainan_golden_registers2));
14639c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
146462a37553SKen Wang 							hainan_mgcg_cgcg_init,
1465c47b41a7SChristian König 							ARRAY_SIZE(hainan_mgcg_cgcg_init));
146662a37553SKen Wang 		break;
146762a37553SKen Wang 
146862a37553SKen Wang 
146962a37553SKen Wang 	default:
147062a37553SKen Wang 		BUG();
147162a37553SKen Wang 	}
147262a37553SKen Wang }
147362a37553SKen Wang 
147462a37553SKen Wang static void si_pcie_gen3_enable(struct amdgpu_device *adev)
147562a37553SKen Wang {
147662a37553SKen Wang 	struct pci_dev *root = adev->pdev->bus->self;
147762a37553SKen Wang 	int bridge_pos, gpu_pos;
147862a37553SKen Wang 	u32 speed_cntl, mask, current_data_rate;
147962a37553SKen Wang 	int ret, i;
148062a37553SKen Wang 	u16 tmp16;
148162a37553SKen Wang 
148262a37553SKen Wang 	if (pci_is_root_bus(adev->pdev->bus))
148362a37553SKen Wang 		return;
148462a37553SKen Wang 
148562a37553SKen Wang 	if (amdgpu_pcie_gen2 == 0)
148662a37553SKen Wang 		return;
148762a37553SKen Wang 
148862a37553SKen Wang 	if (adev->flags & AMD_IS_APU)
148962a37553SKen Wang 		return;
149062a37553SKen Wang 
149162a37553SKen Wang 	ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
149262a37553SKen Wang 	if (ret != 0)
149362a37553SKen Wang 		return;
149462a37553SKen Wang 
149562a37553SKen Wang 	if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
149662a37553SKen Wang 		return;
149762a37553SKen Wang 
149836b9a952SHuang Rui 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
149962a37553SKen Wang 	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
150062a37553SKen Wang 		LC_CURRENT_DATA_RATE_SHIFT;
150162a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80) {
150262a37553SKen Wang 		if (current_data_rate == 2) {
150362a37553SKen Wang 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
150462a37553SKen Wang 			return;
150562a37553SKen Wang 		}
150662a37553SKen Wang 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
150762a37553SKen Wang 	} else if (mask & DRM_PCIE_SPEED_50) {
150862a37553SKen Wang 		if (current_data_rate == 1) {
150962a37553SKen Wang 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
151062a37553SKen Wang 			return;
151162a37553SKen Wang 		}
151262a37553SKen Wang 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
151362a37553SKen Wang 	}
151462a37553SKen Wang 
151562a37553SKen Wang 	bridge_pos = pci_pcie_cap(root);
151662a37553SKen Wang 	if (!bridge_pos)
151762a37553SKen Wang 		return;
151862a37553SKen Wang 
151962a37553SKen Wang 	gpu_pos = pci_pcie_cap(adev->pdev);
152062a37553SKen Wang 	if (!gpu_pos)
152162a37553SKen Wang 		return;
152262a37553SKen Wang 
152362a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80) {
152462a37553SKen Wang 		if (current_data_rate != 2) {
152562a37553SKen Wang 			u16 bridge_cfg, gpu_cfg;
152662a37553SKen Wang 			u16 bridge_cfg2, gpu_cfg2;
152762a37553SKen Wang 			u32 max_lw, current_lw, tmp;
152862a37553SKen Wang 
152962a37553SKen Wang 			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
153062a37553SKen Wang 			pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
153162a37553SKen Wang 
153262a37553SKen Wang 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
153362a37553SKen Wang 			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
153462a37553SKen Wang 
153562a37553SKen Wang 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
153662a37553SKen Wang 			pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
153762a37553SKen Wang 
153862a37553SKen Wang 			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
153962a37553SKen Wang 			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
154062a37553SKen Wang 			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
154162a37553SKen Wang 
154262a37553SKen Wang 			if (current_lw < max_lw) {
154336b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
154462a37553SKen Wang 				if (tmp & LC_RENEGOTIATION_SUPPORT) {
154562a37553SKen Wang 					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
154662a37553SKen Wang 					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
154762a37553SKen Wang 					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
154836b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
154962a37553SKen Wang 				}
155062a37553SKen Wang 			}
155162a37553SKen Wang 
155262a37553SKen Wang 			for (i = 0; i < 10; i++) {
155362a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
155462a37553SKen Wang 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
155562a37553SKen Wang 					break;
155662a37553SKen Wang 
155762a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
155862a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
155962a37553SKen Wang 
156062a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
156162a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
156262a37553SKen Wang 
156336b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
156462a37553SKen Wang 				tmp |= LC_SET_QUIESCE;
156536b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
156662a37553SKen Wang 
156736b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
156862a37553SKen Wang 				tmp |= LC_REDO_EQ;
156936b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
157062a37553SKen Wang 
157162a37553SKen Wang 				mdelay(100);
157262a37553SKen Wang 
157362a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
157462a37553SKen Wang 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
157562a37553SKen Wang 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
157662a37553SKen Wang 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
157762a37553SKen Wang 
157862a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
157962a37553SKen Wang 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
158062a37553SKen Wang 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
158162a37553SKen Wang 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
158262a37553SKen Wang 
158362a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
158462a37553SKen Wang 				tmp16 &= ~((1 << 4) | (7 << 9));
158562a37553SKen Wang 				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
158662a37553SKen Wang 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
158762a37553SKen Wang 
158862a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
158962a37553SKen Wang 				tmp16 &= ~((1 << 4) | (7 << 9));
159062a37553SKen Wang 				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
159162a37553SKen Wang 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
159262a37553SKen Wang 
159336b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
159462a37553SKen Wang 				tmp &= ~LC_SET_QUIESCE;
159536b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
159662a37553SKen Wang 			}
159762a37553SKen Wang 		}
159862a37553SKen Wang 	}
159962a37553SKen Wang 
160062a37553SKen Wang 	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
160162a37553SKen Wang 	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
160236b9a952SHuang Rui 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
160362a37553SKen Wang 
160462a37553SKen Wang 	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
160562a37553SKen Wang 	tmp16 &= ~0xf;
160662a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80)
160762a37553SKen Wang 		tmp16 |= 3;
160862a37553SKen Wang 	else if (mask & DRM_PCIE_SPEED_50)
160962a37553SKen Wang 		tmp16 |= 2;
161062a37553SKen Wang 	else
161162a37553SKen Wang 		tmp16 |= 1;
161262a37553SKen Wang 	pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
161362a37553SKen Wang 
161436b9a952SHuang Rui 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
161562a37553SKen Wang 	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
161636b9a952SHuang Rui 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
161762a37553SKen Wang 
161862a37553SKen Wang 	for (i = 0; i < adev->usec_timeout; i++) {
161936b9a952SHuang Rui 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
162062a37553SKen Wang 		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
162162a37553SKen Wang 			break;
162262a37553SKen Wang 		udelay(1);
162362a37553SKen Wang 	}
162462a37553SKen Wang }
162562a37553SKen Wang 
162662a37553SKen Wang static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
162762a37553SKen Wang {
162862a37553SKen Wang 	unsigned long flags;
162962a37553SKen Wang 	u32 r;
163062a37553SKen Wang 
163162a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
163262a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
163362a37553SKen Wang 	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
163462a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
163562a37553SKen Wang 	return r;
163662a37553SKen Wang }
163762a37553SKen Wang 
163862a37553SKen Wang static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
163962a37553SKen Wang {
164062a37553SKen Wang 	unsigned long flags;
164162a37553SKen Wang 
164262a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
164362a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
164462a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
164562a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
164662a37553SKen Wang }
164762a37553SKen Wang 
164862a37553SKen Wang static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
164962a37553SKen Wang {
165062a37553SKen Wang 	unsigned long flags;
165162a37553SKen Wang 	u32 r;
165262a37553SKen Wang 
165362a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
165462a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
165562a37553SKen Wang 	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
165662a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
165762a37553SKen Wang 	return r;
165862a37553SKen Wang }
165962a37553SKen Wang 
166062a37553SKen Wang static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
166162a37553SKen Wang {
166262a37553SKen Wang 	unsigned long flags;
166362a37553SKen Wang 
166462a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
166562a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
166662a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
166762a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
166862a37553SKen Wang }
166962a37553SKen Wang static void si_program_aspm(struct amdgpu_device *adev)
167062a37553SKen Wang {
167162a37553SKen Wang 	u32 data, orig;
167262a37553SKen Wang 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
167362a37553SKen Wang 	bool disable_clkreq = false;
167462a37553SKen Wang 
167562a37553SKen Wang 	if (amdgpu_aspm == 0)
167662a37553SKen Wang 		return;
167762a37553SKen Wang 
167862a37553SKen Wang 	if (adev->flags & AMD_IS_APU)
167962a37553SKen Wang 		return;
168036b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
168162a37553SKen Wang 	data &= ~LC_XMIT_N_FTS_MASK;
168262a37553SKen Wang 	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
168362a37553SKen Wang 	if (orig != data)
168436b9a952SHuang Rui 		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
168562a37553SKen Wang 
168636b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
168762a37553SKen Wang 	data |= LC_GO_TO_RECOVERY;
168862a37553SKen Wang 	if (orig != data)
168936b9a952SHuang Rui 		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
169062a37553SKen Wang 
169162a37553SKen Wang 	orig = data = RREG32_PCIE(PCIE_P_CNTL);
169262a37553SKen Wang 	data |= P_IGNORE_EDB_ERR;
169362a37553SKen Wang 	if (orig != data)
169462a37553SKen Wang 		WREG32_PCIE(PCIE_P_CNTL, data);
169562a37553SKen Wang 
169636b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
169762a37553SKen Wang 	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
169862a37553SKen Wang 	data |= LC_PMI_TO_L1_DIS;
169962a37553SKen Wang 	if (!disable_l0s)
170062a37553SKen Wang 		data |= LC_L0S_INACTIVITY(7);
170162a37553SKen Wang 
170262a37553SKen Wang 	if (!disable_l1) {
170362a37553SKen Wang 		data |= LC_L1_INACTIVITY(7);
170462a37553SKen Wang 		data &= ~LC_PMI_TO_L1_DIS;
170562a37553SKen Wang 		if (orig != data)
170636b9a952SHuang Rui 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
170762a37553SKen Wang 
170862a37553SKen Wang 		if (!disable_plloff_in_l1) {
170962a37553SKen Wang 			bool clk_req_support;
171062a37553SKen Wang 
171162a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
171262a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
171362a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
171462a37553SKen Wang 			if (orig != data)
171562a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
171662a37553SKen Wang 
171762a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
171862a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
171962a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
172062a37553SKen Wang 			if (orig != data)
172162a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
172262a37553SKen Wang 
172362a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
172462a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
172562a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
172662a37553SKen Wang 			if (orig != data)
172762a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
172862a37553SKen Wang 
172962a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
173062a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
173162a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
173262a37553SKen Wang 			if (orig != data)
173362a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
173462a37553SKen Wang 
173562a37553SKen Wang 			if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
173662a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
173762a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
173862a37553SKen Wang 				if (orig != data)
173962a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
174062a37553SKen Wang 
174162a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
174262a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
174362a37553SKen Wang 				if (orig != data)
174462a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
174562a37553SKen Wang 
174662a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
174762a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
174862a37553SKen Wang 				if (orig != data)
174962a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
175062a37553SKen Wang 
175162a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
175262a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
175362a37553SKen Wang 				if (orig != data)
175462a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
175562a37553SKen Wang 
175662a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
175762a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
175862a37553SKen Wang 				if (orig != data)
175962a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
176062a37553SKen Wang 
176162a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
176262a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
176362a37553SKen Wang 				if (orig != data)
176462a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
176562a37553SKen Wang 
176662a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
176762a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
176862a37553SKen Wang 				if (orig != data)
176962a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
177062a37553SKen Wang 
177162a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
177262a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
177362a37553SKen Wang 				if (orig != data)
177462a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
177562a37553SKen Wang 			}
177636b9a952SHuang Rui 			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
177762a37553SKen Wang 			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
177862a37553SKen Wang 			data |= LC_DYN_LANES_PWR_STATE(3);
177962a37553SKen Wang 			if (orig != data)
178036b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
178162a37553SKen Wang 
178262a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
178362a37553SKen Wang 			data &= ~LS2_EXIT_TIME_MASK;
178462a37553SKen Wang 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
178562a37553SKen Wang 				data |= LS2_EXIT_TIME(5);
178662a37553SKen Wang 			if (orig != data)
178762a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
178862a37553SKen Wang 
178962a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
179062a37553SKen Wang 			data &= ~LS2_EXIT_TIME_MASK;
179162a37553SKen Wang 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
179262a37553SKen Wang 				data |= LS2_EXIT_TIME(5);
179362a37553SKen Wang 			if (orig != data)
179462a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
179562a37553SKen Wang 
179662a37553SKen Wang 			if (!disable_clkreq &&
179762a37553SKen Wang 			    !pci_is_root_bus(adev->pdev->bus)) {
179862a37553SKen Wang 				struct pci_dev *root = adev->pdev->bus->self;
179962a37553SKen Wang 				u32 lnkcap;
180062a37553SKen Wang 
180162a37553SKen Wang 				clk_req_support = false;
180262a37553SKen Wang 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
180362a37553SKen Wang 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
180462a37553SKen Wang 					clk_req_support = true;
180562a37553SKen Wang 			} else {
180662a37553SKen Wang 				clk_req_support = false;
180762a37553SKen Wang 			}
180862a37553SKen Wang 
180962a37553SKen Wang 			if (clk_req_support) {
181036b9a952SHuang Rui 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
181162a37553SKen Wang 				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
181262a37553SKen Wang 				if (orig != data)
181336b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
181462a37553SKen Wang 
181562a37553SKen Wang 				orig = data = RREG32(THM_CLK_CNTL);
181662a37553SKen Wang 				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
181762a37553SKen Wang 				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
181862a37553SKen Wang 				if (orig != data)
181962a37553SKen Wang 					WREG32(THM_CLK_CNTL, data);
182062a37553SKen Wang 
182162a37553SKen Wang 				orig = data = RREG32(MISC_CLK_CNTL);
182262a37553SKen Wang 				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
182362a37553SKen Wang 				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
182462a37553SKen Wang 				if (orig != data)
182562a37553SKen Wang 					WREG32(MISC_CLK_CNTL, data);
182662a37553SKen Wang 
182762a37553SKen Wang 				orig = data = RREG32(CG_CLKPIN_CNTL);
182862a37553SKen Wang 				data &= ~BCLK_AS_XCLK;
182962a37553SKen Wang 				if (orig != data)
183062a37553SKen Wang 					WREG32(CG_CLKPIN_CNTL, data);
183162a37553SKen Wang 
183262a37553SKen Wang 				orig = data = RREG32(CG_CLKPIN_CNTL_2);
183362a37553SKen Wang 				data &= ~FORCE_BIF_REFCLK_EN;
183462a37553SKen Wang 				if (orig != data)
183562a37553SKen Wang 					WREG32(CG_CLKPIN_CNTL_2, data);
183662a37553SKen Wang 
183762a37553SKen Wang 				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
183862a37553SKen Wang 				data &= ~MPLL_CLKOUT_SEL_MASK;
183962a37553SKen Wang 				data |= MPLL_CLKOUT_SEL(4);
184062a37553SKen Wang 				if (orig != data)
184162a37553SKen Wang 					WREG32(MPLL_BYPASSCLK_SEL, data);
184262a37553SKen Wang 
184362a37553SKen Wang 				orig = data = RREG32(SPLL_CNTL_MODE);
184462a37553SKen Wang 				data &= ~SPLL_REFCLK_SEL_MASK;
184562a37553SKen Wang 				if (orig != data)
184662a37553SKen Wang 					WREG32(SPLL_CNTL_MODE, data);
184762a37553SKen Wang 			}
184862a37553SKen Wang 		}
184962a37553SKen Wang 	} else {
185062a37553SKen Wang 		if (orig != data)
185136b9a952SHuang Rui 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
185262a37553SKen Wang 	}
185362a37553SKen Wang 
185462a37553SKen Wang 	orig = data = RREG32_PCIE(PCIE_CNTL2);
185562a37553SKen Wang 	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
185662a37553SKen Wang 	if (orig != data)
185762a37553SKen Wang 		WREG32_PCIE(PCIE_CNTL2, data);
185862a37553SKen Wang 
185962a37553SKen Wang 	if (!disable_l0s) {
186036b9a952SHuang Rui 		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
186162a37553SKen Wang 		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
186262a37553SKen Wang 			data = RREG32_PCIE(PCIE_LC_STATUS1);
186362a37553SKen Wang 			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
186436b9a952SHuang Rui 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
186562a37553SKen Wang 				data &= ~LC_L0S_INACTIVITY_MASK;
186662a37553SKen Wang 				if (orig != data)
186736b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
186862a37553SKen Wang 			}
186962a37553SKen Wang 		}
187062a37553SKen Wang 	}
187162a37553SKen Wang }
187262a37553SKen Wang 
187362a37553SKen Wang static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
187462a37553SKen Wang {
187562a37553SKen Wang 	int readrq;
187662a37553SKen Wang 	u16 v;
187762a37553SKen Wang 
187862a37553SKen Wang 	readrq = pcie_get_readrq(adev->pdev);
187962a37553SKen Wang 	v = ffs(readrq) - 8;
188062a37553SKen Wang 	if ((v == 0) || (v == 6) || (v == 7))
188162a37553SKen Wang 		pcie_set_readrq(adev->pdev, 512);
188262a37553SKen Wang }
188362a37553SKen Wang 
188462a37553SKen Wang static int si_common_hw_init(void *handle)
188562a37553SKen Wang {
188662a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
188762a37553SKen Wang 
188862a37553SKen Wang 	si_fix_pci_max_read_req_size(adev);
188962a37553SKen Wang 	si_init_golden_registers(adev);
189062a37553SKen Wang 	si_pcie_gen3_enable(adev);
189162a37553SKen Wang 	si_program_aspm(adev);
189262a37553SKen Wang 
189362a37553SKen Wang 	return 0;
189462a37553SKen Wang }
189562a37553SKen Wang 
189662a37553SKen Wang static int si_common_hw_fini(void *handle)
189762a37553SKen Wang {
189862a37553SKen Wang 	return 0;
189962a37553SKen Wang }
190062a37553SKen Wang 
190162a37553SKen Wang static int si_common_suspend(void *handle)
190262a37553SKen Wang {
190362a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
190462a37553SKen Wang 
190562a37553SKen Wang 	return si_common_hw_fini(adev);
190662a37553SKen Wang }
190762a37553SKen Wang 
190862a37553SKen Wang static int si_common_resume(void *handle)
190962a37553SKen Wang {
191062a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
191162a37553SKen Wang 
191262a37553SKen Wang 	return si_common_hw_init(adev);
191362a37553SKen Wang }
191462a37553SKen Wang 
191562a37553SKen Wang static bool si_common_is_idle(void *handle)
191662a37553SKen Wang {
191762a37553SKen Wang 	return true;
191862a37553SKen Wang }
191962a37553SKen Wang 
192062a37553SKen Wang static int si_common_wait_for_idle(void *handle)
192162a37553SKen Wang {
192262a37553SKen Wang 	return 0;
192362a37553SKen Wang }
192462a37553SKen Wang 
192562a37553SKen Wang static int si_common_soft_reset(void *handle)
192662a37553SKen Wang {
192762a37553SKen Wang 	return 0;
192862a37553SKen Wang }
192962a37553SKen Wang 
193062a37553SKen Wang static int si_common_set_clockgating_state(void *handle,
193162a37553SKen Wang 					    enum amd_clockgating_state state)
193262a37553SKen Wang {
193362a37553SKen Wang 	return 0;
193462a37553SKen Wang }
193562a37553SKen Wang 
193662a37553SKen Wang static int si_common_set_powergating_state(void *handle,
193762a37553SKen Wang 					    enum amd_powergating_state state)
193862a37553SKen Wang {
193962a37553SKen Wang 	return 0;
194062a37553SKen Wang }
194162a37553SKen Wang 
1942a1255107SAlex Deucher static const struct amd_ip_funcs si_common_ip_funcs = {
194362a37553SKen Wang 	.name = "si_common",
194462a37553SKen Wang 	.early_init = si_common_early_init,
194562a37553SKen Wang 	.late_init = NULL,
194662a37553SKen Wang 	.sw_init = si_common_sw_init,
194762a37553SKen Wang 	.sw_fini = si_common_sw_fini,
194862a37553SKen Wang 	.hw_init = si_common_hw_init,
194962a37553SKen Wang 	.hw_fini = si_common_hw_fini,
195062a37553SKen Wang 	.suspend = si_common_suspend,
195162a37553SKen Wang 	.resume = si_common_resume,
195262a37553SKen Wang 	.is_idle = si_common_is_idle,
195362a37553SKen Wang 	.wait_for_idle = si_common_wait_for_idle,
195462a37553SKen Wang 	.soft_reset = si_common_soft_reset,
195562a37553SKen Wang 	.set_clockgating_state = si_common_set_clockgating_state,
195662a37553SKen Wang 	.set_powergating_state = si_common_set_powergating_state,
195762a37553SKen Wang };
195862a37553SKen Wang 
1959a1255107SAlex Deucher static const struct amdgpu_ip_block_version si_common_ip_block =
196062a37553SKen Wang {
196162a37553SKen Wang 	.type = AMD_IP_BLOCK_TYPE_COMMON,
196262a37553SKen Wang 	.major = 1,
196362a37553SKen Wang 	.minor = 0,
196462a37553SKen Wang 	.rev = 0,
196562a37553SKen Wang 	.funcs = &si_common_ip_funcs,
19662120df47SAlex Deucher };
19672120df47SAlex Deucher 
196862a37553SKen Wang int si_set_ip_blocks(struct amdgpu_device *adev)
196962a37553SKen Wang {
1970c8394f38SXiangliang Yu 	si_detect_hw_virtualization(adev);
1971c8394f38SXiangliang Yu 
197262a37553SKen Wang 	switch (adev->asic_type) {
197362a37553SKen Wang 	case CHIP_VERDE:
197462a37553SKen Wang 	case CHIP_TAHITI:
197562a37553SKen Wang 	case CHIP_PITCAIRN:
19762990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
19772990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
19782990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
19792990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
1980a1255107SAlex Deucher 		if (adev->enable_virtual_display)
19812990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
1982a1255107SAlex Deucher 		else
19832990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
19842990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
19852990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
19862990a1fcSAlex Deucher 		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
19872990a1fcSAlex Deucher 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
1988a1255107SAlex Deucher 		break;
198962a37553SKen Wang 	case CHIP_OLAND:
19902990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
19912990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
19922990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
19932990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
1994a1255107SAlex Deucher 		if (adev->enable_virtual_display)
19952990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
1996a1255107SAlex Deucher 		else
19972990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
19982990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
19992990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
20002990a1fcSAlex Deucher 		/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
20012990a1fcSAlex Deucher 		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
200262a37553SKen Wang 		break;
200362a37553SKen Wang 	case CHIP_HAINAN:
20042990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
20052990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
20062990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
20072990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
2008a1255107SAlex Deucher 		if (adev->enable_virtual_display)
20092990a1fcSAlex Deucher 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
20102990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
20112990a1fcSAlex Deucher 		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
201262a37553SKen Wang 		break;
201362a37553SKen Wang 	default:
201462a37553SKen Wang 		BUG();
201562a37553SKen Wang 	}
201662a37553SKen Wang 	return 0;
201762a37553SKen Wang }
201862a37553SKen Wang 
2019