xref: /linux/drivers/gpu/drm/amd/amdgpu/si.c (revision 4e99a44e37bfed8c4f25c94687e8e4ac4ae65086)
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>
2762a37553SKen Wang #include "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"
3562a37553SKen Wang #include "si/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"
4262a37553SKen Wang 
4362a37553SKen Wang static const u32 tahiti_golden_registers[] =
4462a37553SKen Wang {
4562a37553SKen Wang 	0x2684, 0x00010000, 0x00018208,
4662a37553SKen Wang 	0x260c, 0xffffffff, 0x00000000,
4762a37553SKen Wang 	0x260d, 0xf00fffff, 0x00000400,
4862a37553SKen Wang 	0x260e, 0x0002021c, 0x00020200,
4962a37553SKen Wang 	0x031e, 0x00000080, 0x00000000,
5062a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
5162a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
5262a37553SKen Wang 	0x16ec, 0x000000f0, 0x00000070,
5362a37553SKen Wang 	0x16f0, 0x00200000, 0x50100000,
5462a37553SKen Wang 	0x1c0c, 0x31000311, 0x00000011,
5562a37553SKen Wang 	0x09df, 0x00000003, 0x000007ff,
5662a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
5762a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
5862a37553SKen Wang 	0x22c9, 0xffffffff, 0x00ffffff,
5962a37553SKen Wang 	0x22c4, 0x0000ff0f, 0x00000000,
6062a37553SKen Wang 	0xa293, 0x07ffffff, 0x4e000000,
6162a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x2a00126a,
6262a37553SKen Wang 	0x000c, 0x000000ff, 0x0040,
6362a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
6462a37553SKen Wang 	0x2440, 0x07ffffff, 0x03000000,
6562a37553SKen Wang 	0x23a2, 0x01ff1f3f, 0x00000000,
6662a37553SKen Wang 	0x23a1, 0x01ff1f3f, 0x00000000,
6762a37553SKen Wang 	0x2418, 0x0000007f, 0x00000020,
6862a37553SKen Wang 	0x2542, 0x00010000, 0x00010000,
6962a37553SKen Wang 	0x2b05, 0x00000200, 0x000002fb,
7062a37553SKen Wang 	0x2b04, 0xffffffff, 0x0000543b,
7162a37553SKen Wang 	0x2b03, 0xffffffff, 0xa9210876,
7262a37553SKen Wang 	0x2234, 0xffffffff, 0x000fff40,
7362a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
7462a37553SKen Wang 	0x0504, 0x20000000, 0x20fffed8,
7562a37553SKen Wang 	0x0570, 0x000c0fc0, 0x000c0400
7662a37553SKen Wang };
7762a37553SKen Wang 
7862a37553SKen Wang static const u32 tahiti_golden_registers2[] =
7962a37553SKen Wang {
8062a37553SKen Wang 	0x0319, 0x00000001, 0x00000001
8162a37553SKen Wang };
8262a37553SKen Wang 
8362a37553SKen Wang static const u32 tahiti_golden_rlc_registers[] =
8462a37553SKen Wang {
8562a37553SKen Wang 	0x3109, 0xffffffff, 0x00601005,
8662a37553SKen Wang 	0x311f, 0xffffffff, 0x10104040,
8762a37553SKen Wang 	0x3122, 0xffffffff, 0x0100000a,
8862a37553SKen Wang 	0x30c5, 0xffffffff, 0x00000800,
8962a37553SKen Wang 	0x30c3, 0xffffffff, 0x800000f4,
9062a37553SKen Wang 	0x3d2a, 0xffffffff, 0x00000000
9162a37553SKen Wang };
9262a37553SKen Wang 
9362a37553SKen Wang static const u32 pitcairn_golden_registers[] =
9462a37553SKen Wang {
9562a37553SKen Wang 	0x2684, 0x00010000, 0x00018208,
9662a37553SKen Wang 	0x260c, 0xffffffff, 0x00000000,
9762a37553SKen Wang 	0x260d, 0xf00fffff, 0x00000400,
9862a37553SKen Wang 	0x260e, 0x0002021c, 0x00020200,
9962a37553SKen Wang 	0x031e, 0x00000080, 0x00000000,
10062a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
10162a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
10262a37553SKen Wang 	0x16ec, 0x000000f0, 0x00000070,
10362a37553SKen Wang 	0x16f0, 0x00200000, 0x50100000,
10462a37553SKen Wang 	0x1c0c, 0x31000311, 0x00000011,
10562a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
10662a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
10762a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
10862a37553SKen Wang 	0x22c9, 0xffffffff, 0x00ffffff,
10962a37553SKen Wang 	0x22c4, 0x0000ff0f, 0x00000000,
11062a37553SKen Wang 	0xa293, 0x07ffffff, 0x4e000000,
11162a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x2a00126a,
11262a37553SKen Wang 	0x000c, 0x000000ff, 0x0040,
11362a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
11462a37553SKen Wang 	0x2440, 0x07ffffff, 0x03000000,
11562a37553SKen Wang 	0x2418, 0x0000007f, 0x00000020,
11662a37553SKen Wang 	0x2542, 0x00010000, 0x00010000,
11762a37553SKen Wang 	0x2b05, 0x000003ff, 0x000000f7,
11862a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
11962a37553SKen Wang 	0x2b03, 0xffffffff, 0x32761054,
12062a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
12162a37553SKen Wang 	0x0570, 0x000c0fc0, 0x000c0400
12262a37553SKen Wang };
12362a37553SKen Wang 
12462a37553SKen Wang static const u32 pitcairn_golden_rlc_registers[] =
12562a37553SKen Wang {
12662a37553SKen Wang 	0x3109, 0xffffffff, 0x00601004,
12762a37553SKen Wang 	0x311f, 0xffffffff, 0x10102020,
12862a37553SKen Wang 	0x3122, 0xffffffff, 0x01000020,
12962a37553SKen Wang 	0x30c5, 0xffffffff, 0x00000800,
13062a37553SKen Wang 	0x30c3, 0xffffffff, 0x800000a4
13162a37553SKen Wang };
13262a37553SKen Wang 
13362a37553SKen Wang static const u32 verde_pg_init[] =
13462a37553SKen Wang {
13562a37553SKen Wang 	0xd4f, 0xffffffff, 0x40000,
13662a37553SKen Wang 	0xd4e, 0xffffffff, 0x200010ff,
13762a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
13862a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
13962a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14062a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14162a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14262a37553SKen Wang 	0xd4f, 0xffffffff, 0x7007,
14362a37553SKen Wang 	0xd4e, 0xffffffff, 0x300010ff,
14462a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14562a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14662a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14762a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14862a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
14962a37553SKen Wang 	0xd4f, 0xffffffff, 0x400000,
15062a37553SKen Wang 	0xd4e, 0xffffffff, 0x100010ff,
15162a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15262a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15362a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15462a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15562a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15662a37553SKen Wang 	0xd4f, 0xffffffff, 0x120200,
15762a37553SKen Wang 	0xd4e, 0xffffffff, 0x500010ff,
15862a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
15962a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16062a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16162a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16262a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16362a37553SKen Wang 	0xd4f, 0xffffffff, 0x1e1e16,
16462a37553SKen Wang 	0xd4e, 0xffffffff, 0x600010ff,
16562a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16662a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16762a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16862a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
16962a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17062a37553SKen Wang 	0xd4f, 0xffffffff, 0x171f1e,
17162a37553SKen Wang 	0xd4e, 0xffffffff, 0x700010ff,
17262a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17362a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17462a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17562a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17662a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17762a37553SKen Wang 	0xd4f, 0xffffffff, 0x0,
17862a37553SKen Wang 	0xd4e, 0xffffffff, 0x9ff,
17962a37553SKen Wang 	0xd40, 0xffffffff, 0x0,
18062a37553SKen Wang 	0xd41, 0xffffffff, 0x10000800,
18162a37553SKen Wang 	0xd41, 0xffffffff, 0xf,
18262a37553SKen Wang 	0xd41, 0xffffffff, 0xf,
18362a37553SKen Wang 	0xd40, 0xffffffff, 0x4,
18462a37553SKen Wang 	0xd41, 0xffffffff, 0x1000051e,
18562a37553SKen Wang 	0xd41, 0xffffffff, 0xffff,
18662a37553SKen Wang 	0xd41, 0xffffffff, 0xffff,
18762a37553SKen Wang 	0xd40, 0xffffffff, 0x8,
18862a37553SKen Wang 	0xd41, 0xffffffff, 0x80500,
18962a37553SKen Wang 	0xd40, 0xffffffff, 0x12,
19062a37553SKen Wang 	0xd41, 0xffffffff, 0x9050c,
19162a37553SKen Wang 	0xd40, 0xffffffff, 0x1d,
19262a37553SKen Wang 	0xd41, 0xffffffff, 0xb052c,
19362a37553SKen Wang 	0xd40, 0xffffffff, 0x2a,
19462a37553SKen Wang 	0xd41, 0xffffffff, 0x1053e,
19562a37553SKen Wang 	0xd40, 0xffffffff, 0x2d,
19662a37553SKen Wang 	0xd41, 0xffffffff, 0x10546,
19762a37553SKen Wang 	0xd40, 0xffffffff, 0x30,
19862a37553SKen Wang 	0xd41, 0xffffffff, 0xa054e,
19962a37553SKen Wang 	0xd40, 0xffffffff, 0x3c,
20062a37553SKen Wang 	0xd41, 0xffffffff, 0x1055f,
20162a37553SKen Wang 	0xd40, 0xffffffff, 0x3f,
20262a37553SKen Wang 	0xd41, 0xffffffff, 0x10567,
20362a37553SKen Wang 	0xd40, 0xffffffff, 0x42,
20462a37553SKen Wang 	0xd41, 0xffffffff, 0x1056f,
20562a37553SKen Wang 	0xd40, 0xffffffff, 0x45,
20662a37553SKen Wang 	0xd41, 0xffffffff, 0x10572,
20762a37553SKen Wang 	0xd40, 0xffffffff, 0x48,
20862a37553SKen Wang 	0xd41, 0xffffffff, 0x20575,
20962a37553SKen Wang 	0xd40, 0xffffffff, 0x4c,
21062a37553SKen Wang 	0xd41, 0xffffffff, 0x190801,
21162a37553SKen Wang 	0xd40, 0xffffffff, 0x67,
21262a37553SKen Wang 	0xd41, 0xffffffff, 0x1082a,
21362a37553SKen Wang 	0xd40, 0xffffffff, 0x6a,
21462a37553SKen Wang 	0xd41, 0xffffffff, 0x1b082d,
21562a37553SKen Wang 	0xd40, 0xffffffff, 0x87,
21662a37553SKen Wang 	0xd41, 0xffffffff, 0x310851,
21762a37553SKen Wang 	0xd40, 0xffffffff, 0xba,
21862a37553SKen Wang 	0xd41, 0xffffffff, 0x891,
21962a37553SKen Wang 	0xd40, 0xffffffff, 0xbc,
22062a37553SKen Wang 	0xd41, 0xffffffff, 0x893,
22162a37553SKen Wang 	0xd40, 0xffffffff, 0xbe,
22262a37553SKen Wang 	0xd41, 0xffffffff, 0x20895,
22362a37553SKen Wang 	0xd40, 0xffffffff, 0xc2,
22462a37553SKen Wang 	0xd41, 0xffffffff, 0x20899,
22562a37553SKen Wang 	0xd40, 0xffffffff, 0xc6,
22662a37553SKen Wang 	0xd41, 0xffffffff, 0x2089d,
22762a37553SKen Wang 	0xd40, 0xffffffff, 0xca,
22862a37553SKen Wang 	0xd41, 0xffffffff, 0x8a1,
22962a37553SKen Wang 	0xd40, 0xffffffff, 0xcc,
23062a37553SKen Wang 	0xd41, 0xffffffff, 0x8a3,
23162a37553SKen Wang 	0xd40, 0xffffffff, 0xce,
23262a37553SKen Wang 	0xd41, 0xffffffff, 0x308a5,
23362a37553SKen Wang 	0xd40, 0xffffffff, 0xd3,
23462a37553SKen Wang 	0xd41, 0xffffffff, 0x6d08cd,
23562a37553SKen Wang 	0xd40, 0xffffffff, 0x142,
23662a37553SKen Wang 	0xd41, 0xffffffff, 0x2000095a,
23762a37553SKen Wang 	0xd41, 0xffffffff, 0x1,
23862a37553SKen Wang 	0xd40, 0xffffffff, 0x144,
23962a37553SKen Wang 	0xd41, 0xffffffff, 0x301f095b,
24062a37553SKen Wang 	0xd40, 0xffffffff, 0x165,
24162a37553SKen Wang 	0xd41, 0xffffffff, 0xc094d,
24262a37553SKen Wang 	0xd40, 0xffffffff, 0x173,
24362a37553SKen Wang 	0xd41, 0xffffffff, 0xf096d,
24462a37553SKen Wang 	0xd40, 0xffffffff, 0x184,
24562a37553SKen Wang 	0xd41, 0xffffffff, 0x15097f,
24662a37553SKen Wang 	0xd40, 0xffffffff, 0x19b,
24762a37553SKen Wang 	0xd41, 0xffffffff, 0xc0998,
24862a37553SKen Wang 	0xd40, 0xffffffff, 0x1a9,
24962a37553SKen Wang 	0xd41, 0xffffffff, 0x409a7,
25062a37553SKen Wang 	0xd40, 0xffffffff, 0x1af,
25162a37553SKen Wang 	0xd41, 0xffffffff, 0xcdc,
25262a37553SKen Wang 	0xd40, 0xffffffff, 0x1b1,
25362a37553SKen Wang 	0xd41, 0xffffffff, 0x800,
25462a37553SKen Wang 	0xd42, 0xffffffff, 0x6c9b2000,
25562a37553SKen Wang 	0xd44, 0xfc00, 0x2000,
25662a37553SKen Wang 	0xd51, 0xffffffff, 0xfc0,
25762a37553SKen Wang 	0xa35, 0x00000100, 0x100
25862a37553SKen Wang };
25962a37553SKen Wang 
26062a37553SKen Wang static const u32 verde_golden_rlc_registers[] =
26162a37553SKen Wang {
26262a37553SKen Wang 	0x3109, 0xffffffff, 0x033f1005,
26362a37553SKen Wang 	0x311f, 0xffffffff, 0x10808020,
26462a37553SKen Wang 	0x3122, 0xffffffff, 0x00800008,
26562a37553SKen Wang 	0x30c5, 0xffffffff, 0x00001000,
26662a37553SKen Wang 	0x30c3, 0xffffffff, 0x80010014
26762a37553SKen Wang };
26862a37553SKen Wang 
26962a37553SKen Wang static const u32 verde_golden_registers[] =
27062a37553SKen Wang {
27162a37553SKen Wang 	0x2684, 0x00010000, 0x00018208,
27262a37553SKen Wang 	0x260c, 0xffffffff, 0x00000000,
27362a37553SKen Wang 	0x260d, 0xf00fffff, 0x00000400,
27462a37553SKen Wang 	0x260e, 0x0002021c, 0x00020200,
27562a37553SKen Wang 	0x031e, 0x00000080, 0x00000000,
27662a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
27762a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
27862a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
27962a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
28062a37553SKen Wang 	0x16ec, 0x000000f0, 0x00000070,
28162a37553SKen Wang 	0x16f0, 0x00200000, 0x50100000,
28262a37553SKen Wang 
28362a37553SKen Wang 	0x1c0c, 0x31000311, 0x00000011,
28462a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
28562a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
28662a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
28762a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
28862a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
28962a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
29062a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
29162a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
29262a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
29362a37553SKen Wang 	0x2285, 0xffffffff, 0x00ffffff,
29462a37553SKen Wang 	0x22c4, 0x0000ff0f, 0x00000000,
29562a37553SKen Wang 
29662a37553SKen Wang 	0xa293, 0x07ffffff, 0x4e000000,
29762a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x0000124a,
29862a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x0000124a,
29962a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x0000124a,
30062a37553SKen Wang 	0x000c, 0x000000ff, 0x0040,
30162a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
30262a37553SKen Wang 	0x2440, 0x07ffffff, 0x03000000,
30362a37553SKen Wang 	0x2440, 0x07ffffff, 0x03000000,
30462a37553SKen Wang 	0x23a2, 0x01ff1f3f, 0x00000000,
30562a37553SKen Wang 	0x23a3, 0x01ff1f3f, 0x00000000,
30662a37553SKen Wang 	0x23a2, 0x01ff1f3f, 0x00000000,
30762a37553SKen Wang 	0x23a1, 0x01ff1f3f, 0x00000000,
30862a37553SKen Wang 	0x23a1, 0x01ff1f3f, 0x00000000,
30962a37553SKen Wang 
31062a37553SKen Wang 	0x23a1, 0x01ff1f3f, 0x00000000,
31162a37553SKen Wang 	0x2418, 0x0000007f, 0x00000020,
31262a37553SKen Wang 	0x2542, 0x00010000, 0x00010000,
31362a37553SKen Wang 	0x2b01, 0x000003ff, 0x00000003,
31462a37553SKen Wang 	0x2b05, 0x000003ff, 0x00000003,
31562a37553SKen Wang 	0x2b05, 0x000003ff, 0x00000003,
31662a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
31762a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
31862a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
31962a37553SKen Wang 	0x2b03, 0xffffffff, 0x00001032,
32062a37553SKen Wang 	0x2b03, 0xffffffff, 0x00001032,
32162a37553SKen Wang 	0x2b03, 0xffffffff, 0x00001032,
32262a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
32362a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
32462a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
32562a37553SKen Wang 	0x0570, 0x000c0fc0, 0x000c0400
32662a37553SKen Wang };
32762a37553SKen Wang 
32862a37553SKen Wang static const u32 oland_golden_registers[] =
32962a37553SKen Wang {
33062a37553SKen Wang 	0x2684, 0x00010000, 0x00018208,
33162a37553SKen Wang 	0x260c, 0xffffffff, 0x00000000,
33262a37553SKen Wang 	0x260d, 0xf00fffff, 0x00000400,
33362a37553SKen Wang 	0x260e, 0x0002021c, 0x00020200,
33462a37553SKen Wang 	0x031e, 0x00000080, 0x00000000,
33562a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
33662a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
33762a37553SKen Wang 	0x16ec, 0x000000f0, 0x00000070,
33862a37553SKen Wang 	0x16f9, 0x00200000, 0x50100000,
33962a37553SKen Wang 	0x1c0c, 0x31000311, 0x00000011,
34062a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
34162a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
34262a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
34362a37553SKen Wang 	0x22c9, 0xffffffff, 0x00ffffff,
34462a37553SKen Wang 	0x22c4, 0x0000ff0f, 0x00000000,
34562a37553SKen Wang 	0xa293, 0x07ffffff, 0x4e000000,
34662a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x00000082,
34762a37553SKen Wang 	0x000c, 0x000000ff, 0x0040,
34862a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
34962a37553SKen Wang 	0x2440, 0x07ffffff, 0x03000000,
35062a37553SKen Wang 	0x2418, 0x0000007f, 0x00000020,
35162a37553SKen Wang 	0x2542, 0x00010000, 0x00010000,
35262a37553SKen Wang 	0x2b05, 0x000003ff, 0x000000f3,
35362a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
35462a37553SKen Wang 	0x2b03, 0xffffffff, 0x00003210,
35562a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
35662a37553SKen Wang 	0x0570, 0x000c0fc0, 0x000c0400
35762a37553SKen Wang };
35862a37553SKen Wang 
35962a37553SKen Wang static const u32 oland_golden_rlc_registers[] =
36062a37553SKen Wang {
36162a37553SKen Wang 	0x3109, 0xffffffff, 0x00601005,
36262a37553SKen Wang 	0x311f, 0xffffffff, 0x10104040,
36362a37553SKen Wang 	0x3122, 0xffffffff, 0x0100000a,
36462a37553SKen Wang 	0x30c5, 0xffffffff, 0x00000800,
36562a37553SKen Wang 	0x30c3, 0xffffffff, 0x800000f4
36662a37553SKen Wang };
36762a37553SKen Wang 
36862a37553SKen Wang static const u32 hainan_golden_registers[] =
36962a37553SKen Wang {
37062a37553SKen Wang 	0x2684, 0x00010000, 0x00018208,
37162a37553SKen Wang 	0x260c, 0xffffffff, 0x00000000,
37262a37553SKen Wang 	0x260d, 0xf00fffff, 0x00000400,
37362a37553SKen Wang 	0x260e, 0x0002021c, 0x00020200,
37462a37553SKen Wang 	0x4595, 0xff000fff, 0x00000100,
37562a37553SKen Wang 	0x340c, 0x000300c0, 0x00800040,
37662a37553SKen Wang 	0x3630, 0xff000fff, 0x00000100,
37762a37553SKen Wang 	0x360c, 0x000300c0, 0x00800040,
37862a37553SKen Wang 	0x0ab9, 0x00073ffe, 0x000022a2,
37962a37553SKen Wang 	0x0903, 0x000007ff, 0x00000000,
38062a37553SKen Wang 	0x2285, 0xf000001f, 0x00000007,
38162a37553SKen Wang 	0x22c9, 0xffffffff, 0x00ffffff,
38262a37553SKen Wang 	0x22c4, 0x0000ff0f, 0x00000000,
38362a37553SKen Wang 	0xa393, 0x07ffffff, 0x4e000000,
38462a37553SKen Wang 	0xa0d4, 0x3f3f3fff, 0x00000000,
38562a37553SKen Wang 	0x000c, 0x000000ff, 0x0040,
38662a37553SKen Wang 	0x000d, 0x00000040, 0x00004040,
38762a37553SKen Wang 	0x2440, 0x03e00000, 0x03600000,
38862a37553SKen Wang 	0x2418, 0x0000007f, 0x00000020,
38962a37553SKen Wang 	0x2542, 0x00010000, 0x00010000,
39062a37553SKen Wang 	0x2b05, 0x000003ff, 0x000000f1,
39162a37553SKen Wang 	0x2b04, 0xffffffff, 0x00000000,
39262a37553SKen Wang 	0x2b03, 0xffffffff, 0x00003210,
39362a37553SKen Wang 	0x2235, 0x0000001f, 0x00000010,
39462a37553SKen Wang 	0x0570, 0x000c0fc0, 0x000c0400
39562a37553SKen Wang };
39662a37553SKen Wang 
39762a37553SKen Wang static const u32 hainan_golden_registers2[] =
39862a37553SKen Wang {
39962a37553SKen Wang 	0x263e, 0xffffffff, 0x02010001
40062a37553SKen Wang };
40162a37553SKen Wang 
40262a37553SKen Wang static const u32 tahiti_mgcg_cgcg_init[] =
40362a37553SKen Wang {
40462a37553SKen Wang 	0x3100, 0xffffffff, 0xfffffffc,
40562a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
40662a37553SKen Wang 	0x2698, 0xffffffff, 0x00000100,
40762a37553SKen Wang 	0x24a9, 0xffffffff, 0x00000100,
40862a37553SKen Wang 	0x3059, 0xffffffff, 0x00000100,
40962a37553SKen Wang 	0x25dd, 0xffffffff, 0x00000100,
41062a37553SKen Wang 	0x2261, 0xffffffff, 0x06000100,
41162a37553SKen Wang 	0x2286, 0xffffffff, 0x00000100,
41262a37553SKen Wang 	0x24a8, 0xffffffff, 0x00000100,
41362a37553SKen Wang 	0x30e0, 0xffffffff, 0x00000100,
41462a37553SKen Wang 	0x22ca, 0xffffffff, 0x00000100,
41562a37553SKen Wang 	0x2451, 0xffffffff, 0x00000100,
41662a37553SKen Wang 	0x2362, 0xffffffff, 0x00000100,
41762a37553SKen Wang 	0x2363, 0xffffffff, 0x00000100,
41862a37553SKen Wang 	0x240c, 0xffffffff, 0x00000100,
41962a37553SKen Wang 	0x240d, 0xffffffff, 0x00000100,
42062a37553SKen Wang 	0x240e, 0xffffffff, 0x00000100,
42162a37553SKen Wang 	0x240f, 0xffffffff, 0x00000100,
42262a37553SKen Wang 	0x2b60, 0xffffffff, 0x00000100,
42362a37553SKen Wang 	0x2b15, 0xffffffff, 0x00000100,
42462a37553SKen Wang 	0x225f, 0xffffffff, 0x06000100,
42562a37553SKen Wang 	0x261a, 0xffffffff, 0x00000100,
42662a37553SKen Wang 	0x2544, 0xffffffff, 0x00000100,
42762a37553SKen Wang 	0x2bc1, 0xffffffff, 0x00000100,
42862a37553SKen Wang 	0x2b81, 0xffffffff, 0x00000100,
42962a37553SKen Wang 	0x2527, 0xffffffff, 0x00000100,
43062a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
43162a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
43262a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
43362a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
43462a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
43562a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
43662a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
43762a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
43862a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
43962a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
44062a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
44162a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
44262a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
44362a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
44462a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
44562a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
44662a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
44762a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
44862a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
44962a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
45062a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
45162a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
45262a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
45362a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
45462a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
45562a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
45662a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
45762a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
45862a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
45962a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
46062a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
46162a37553SKen Wang 	0x2476, 0xffffffff, 0x00070006,
46262a37553SKen Wang 	0x2477, 0xffffffff, 0x00090008,
46362a37553SKen Wang 	0x2478, 0xffffffff, 0x0000000c,
46462a37553SKen Wang 	0x2479, 0xffffffff, 0x000b000a,
46562a37553SKen Wang 	0x247a, 0xffffffff, 0x000e000d,
46662a37553SKen Wang 	0x247b, 0xffffffff, 0x00080007,
46762a37553SKen Wang 	0x247c, 0xffffffff, 0x000a0009,
46862a37553SKen Wang 	0x247d, 0xffffffff, 0x0000000d,
46962a37553SKen Wang 	0x247e, 0xffffffff, 0x000c000b,
47062a37553SKen Wang 	0x247f, 0xffffffff, 0x000f000e,
47162a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
47262a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
47362a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
47462a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
47562a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
47662a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
47762a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
47862a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
47962a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
48062a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
48162a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
48262a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
48362a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
48462a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
48562a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
48662a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
48762a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
48862a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
48962a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
49062a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
49162a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
49262a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
49362a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
49462a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
49562a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
49662a37553SKen Wang 	0x2499, 0xffffffff, 0x000e000d,
49762a37553SKen Wang 	0x249a, 0xffffffff, 0x0010000f,
49862a37553SKen Wang 	0x249b, 0xffffffff, 0x00000013,
49962a37553SKen Wang 	0x249c, 0xffffffff, 0x00120011,
50062a37553SKen Wang 	0x249d, 0xffffffff, 0x00150014,
50162a37553SKen Wang 	0x249e, 0xffffffff, 0x000f000e,
50262a37553SKen Wang 	0x249f, 0xffffffff, 0x00110010,
50362a37553SKen Wang 	0x24a0, 0xffffffff, 0x00000014,
50462a37553SKen Wang 	0x24a1, 0xffffffff, 0x00130012,
50562a37553SKen Wang 	0x24a2, 0xffffffff, 0x00160015,
50662a37553SKen Wang 	0x24a3, 0xffffffff, 0x0010000f,
50762a37553SKen Wang 	0x24a4, 0xffffffff, 0x00120011,
50862a37553SKen Wang 	0x24a5, 0xffffffff, 0x00000015,
50962a37553SKen Wang 	0x24a6, 0xffffffff, 0x00140013,
51062a37553SKen Wang 	0x24a7, 0xffffffff, 0x00170016,
51162a37553SKen Wang 	0x2454, 0xffffffff, 0x96940200,
51262a37553SKen Wang 	0x21c2, 0xffffffff, 0x00900100,
51362a37553SKen Wang 	0x311e, 0xffffffff, 0x00000080,
51462a37553SKen Wang 	0x3101, 0xffffffff, 0x0020003f,
51562a37553SKen Wang 	0xc, 0xffffffff, 0x0000001c,
51662a37553SKen Wang 	0xd, 0x000f0000, 0x000f0000,
51762a37553SKen Wang 	0x583, 0xffffffff, 0x00000100,
51862a37553SKen Wang 	0x409, 0xffffffff, 0x00000100,
51962a37553SKen Wang 	0x40b, 0x00000101, 0x00000000,
52062a37553SKen Wang 	0x82a, 0xffffffff, 0x00000104,
52162a37553SKen Wang 	0x993, 0x000c0000, 0x000c0000,
52262a37553SKen Wang 	0x992, 0x000c0000, 0x000c0000,
52362a37553SKen Wang 	0x1579, 0xff000fff, 0x00000100,
52462a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
52562a37553SKen Wang 	0xbd4, 0x00000001, 0x00000001,
52662a37553SKen Wang 	0xc33, 0xc0000fff, 0x00000104,
52762a37553SKen Wang 	0x3079, 0x00000001, 0x00000001,
52862a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
52962a37553SKen Wang 	0x3630, 0xfffffff0, 0x00000100
53062a37553SKen Wang };
53162a37553SKen Wang static const u32 pitcairn_mgcg_cgcg_init[] =
53262a37553SKen Wang {
53362a37553SKen Wang 	0x3100, 0xffffffff, 0xfffffffc,
53462a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
53562a37553SKen Wang 	0x2698, 0xffffffff, 0x00000100,
53662a37553SKen Wang 	0x24a9, 0xffffffff, 0x00000100,
53762a37553SKen Wang 	0x3059, 0xffffffff, 0x00000100,
53862a37553SKen Wang 	0x25dd, 0xffffffff, 0x00000100,
53962a37553SKen Wang 	0x2261, 0xffffffff, 0x06000100,
54062a37553SKen Wang 	0x2286, 0xffffffff, 0x00000100,
54162a37553SKen Wang 	0x24a8, 0xffffffff, 0x00000100,
54262a37553SKen Wang 	0x30e0, 0xffffffff, 0x00000100,
54362a37553SKen Wang 	0x22ca, 0xffffffff, 0x00000100,
54462a37553SKen Wang 	0x2451, 0xffffffff, 0x00000100,
54562a37553SKen Wang 	0x2362, 0xffffffff, 0x00000100,
54662a37553SKen Wang 	0x2363, 0xffffffff, 0x00000100,
54762a37553SKen Wang 	0x240c, 0xffffffff, 0x00000100,
54862a37553SKen Wang 	0x240d, 0xffffffff, 0x00000100,
54962a37553SKen Wang 	0x240e, 0xffffffff, 0x00000100,
55062a37553SKen Wang 	0x240f, 0xffffffff, 0x00000100,
55162a37553SKen Wang 	0x2b60, 0xffffffff, 0x00000100,
55262a37553SKen Wang 	0x2b15, 0xffffffff, 0x00000100,
55362a37553SKen Wang 	0x225f, 0xffffffff, 0x06000100,
55462a37553SKen Wang 	0x261a, 0xffffffff, 0x00000100,
55562a37553SKen Wang 	0x2544, 0xffffffff, 0x00000100,
55662a37553SKen Wang 	0x2bc1, 0xffffffff, 0x00000100,
55762a37553SKen Wang 	0x2b81, 0xffffffff, 0x00000100,
55862a37553SKen Wang 	0x2527, 0xffffffff, 0x00000100,
55962a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
56062a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
56162a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
56262a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
56362a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
56462a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
56562a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
56662a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
56762a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
56862a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
56962a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
57062a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
57162a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
57262a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
57362a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
57462a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
57562a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
57662a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
57762a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
57862a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
57962a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
58062a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
58162a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
58262a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
58362a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
58462a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
58562a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
58662a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
58762a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
58862a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
58962a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
59062a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
59162a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
59262a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
59362a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
59462a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
59562a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
59662a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
59762a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
59862a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
59962a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
60062a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
60162a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
60262a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
60362a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
60462a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
60562a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
60662a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
60762a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
60862a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
60962a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
61062a37553SKen Wang 	0x2454, 0xffffffff, 0x96940200,
61162a37553SKen Wang 	0x21c2, 0xffffffff, 0x00900100,
61262a37553SKen Wang 	0x311e, 0xffffffff, 0x00000080,
61362a37553SKen Wang 	0x3101, 0xffffffff, 0x0020003f,
61462a37553SKen Wang 	0xc, 0xffffffff, 0x0000001c,
61562a37553SKen Wang 	0xd, 0x000f0000, 0x000f0000,
61662a37553SKen Wang 	0x583, 0xffffffff, 0x00000100,
61762a37553SKen Wang 	0x409, 0xffffffff, 0x00000100,
61862a37553SKen Wang 	0x40b, 0x00000101, 0x00000000,
61962a37553SKen Wang 	0x82a, 0xffffffff, 0x00000104,
62062a37553SKen Wang 	0x1579, 0xff000fff, 0x00000100,
62162a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
62262a37553SKen Wang 	0xbd4, 0x00000001, 0x00000001,
62362a37553SKen Wang 	0xc33, 0xc0000fff, 0x00000104,
62462a37553SKen Wang 	0x3079, 0x00000001, 0x00000001,
62562a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
62662a37553SKen Wang 	0x3630, 0xfffffff0, 0x00000100
62762a37553SKen Wang };
62862a37553SKen Wang static const u32 verde_mgcg_cgcg_init[] =
62962a37553SKen Wang {
63062a37553SKen Wang 	0x3100, 0xffffffff, 0xfffffffc,
63162a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
63262a37553SKen Wang 	0x2698, 0xffffffff, 0x00000100,
63362a37553SKen Wang 	0x24a9, 0xffffffff, 0x00000100,
63462a37553SKen Wang 	0x3059, 0xffffffff, 0x00000100,
63562a37553SKen Wang 	0x25dd, 0xffffffff, 0x00000100,
63662a37553SKen Wang 	0x2261, 0xffffffff, 0x06000100,
63762a37553SKen Wang 	0x2286, 0xffffffff, 0x00000100,
63862a37553SKen Wang 	0x24a8, 0xffffffff, 0x00000100,
63962a37553SKen Wang 	0x30e0, 0xffffffff, 0x00000100,
64062a37553SKen Wang 	0x22ca, 0xffffffff, 0x00000100,
64162a37553SKen Wang 	0x2451, 0xffffffff, 0x00000100,
64262a37553SKen Wang 	0x2362, 0xffffffff, 0x00000100,
64362a37553SKen Wang 	0x2363, 0xffffffff, 0x00000100,
64462a37553SKen Wang 	0x240c, 0xffffffff, 0x00000100,
64562a37553SKen Wang 	0x240d, 0xffffffff, 0x00000100,
64662a37553SKen Wang 	0x240e, 0xffffffff, 0x00000100,
64762a37553SKen Wang 	0x240f, 0xffffffff, 0x00000100,
64862a37553SKen Wang 	0x2b60, 0xffffffff, 0x00000100,
64962a37553SKen Wang 	0x2b15, 0xffffffff, 0x00000100,
65062a37553SKen Wang 	0x225f, 0xffffffff, 0x06000100,
65162a37553SKen Wang 	0x261a, 0xffffffff, 0x00000100,
65262a37553SKen Wang 	0x2544, 0xffffffff, 0x00000100,
65362a37553SKen Wang 	0x2bc1, 0xffffffff, 0x00000100,
65462a37553SKen Wang 	0x2b81, 0xffffffff, 0x00000100,
65562a37553SKen Wang 	0x2527, 0xffffffff, 0x00000100,
65662a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
65762a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
65862a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
65962a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
66062a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
66162a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
66262a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
66362a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
66462a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
66562a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
66662a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
66762a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
66862a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
66962a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
67062a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
67162a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
67262a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
67362a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
67462a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
67562a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
67662a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
67762a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
67862a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
67962a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
68062a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
68162a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
68262a37553SKen Wang 	0x2480, 0xffffffff, 0x00090008,
68362a37553SKen Wang 	0x2481, 0xffffffff, 0x000b000a,
68462a37553SKen Wang 	0x2482, 0xffffffff, 0x000c000f,
68562a37553SKen Wang 	0x2483, 0xffffffff, 0x000e000d,
68662a37553SKen Wang 	0x2484, 0xffffffff, 0x00110010,
68762a37553SKen Wang 	0x2485, 0xffffffff, 0x000a0009,
68862a37553SKen Wang 	0x2486, 0xffffffff, 0x000c000b,
68962a37553SKen Wang 	0x2487, 0xffffffff, 0x0000000f,
69062a37553SKen Wang 	0x2488, 0xffffffff, 0x000e000d,
69162a37553SKen Wang 	0x2489, 0xffffffff, 0x00110010,
69262a37553SKen Wang 	0x248a, 0xffffffff, 0x000b000a,
69362a37553SKen Wang 	0x248b, 0xffffffff, 0x000d000c,
69462a37553SKen Wang 	0x248c, 0xffffffff, 0x00000010,
69562a37553SKen Wang 	0x248d, 0xffffffff, 0x000f000e,
69662a37553SKen Wang 	0x248e, 0xffffffff, 0x00120011,
69762a37553SKen Wang 	0x248f, 0xffffffff, 0x000c000b,
69862a37553SKen Wang 	0x2490, 0xffffffff, 0x000e000d,
69962a37553SKen Wang 	0x2491, 0xffffffff, 0x00000011,
70062a37553SKen Wang 	0x2492, 0xffffffff, 0x0010000f,
70162a37553SKen Wang 	0x2493, 0xffffffff, 0x00130012,
70262a37553SKen Wang 	0x2494, 0xffffffff, 0x000d000c,
70362a37553SKen Wang 	0x2495, 0xffffffff, 0x000f000e,
70462a37553SKen Wang 	0x2496, 0xffffffff, 0x00100013,
70562a37553SKen Wang 	0x2497, 0xffffffff, 0x00120011,
70662a37553SKen Wang 	0x2498, 0xffffffff, 0x00150014,
70762a37553SKen Wang 	0x2454, 0xffffffff, 0x96940200,
70862a37553SKen Wang 	0x21c2, 0xffffffff, 0x00900100,
70962a37553SKen Wang 	0x311e, 0xffffffff, 0x00000080,
71062a37553SKen Wang 	0x3101, 0xffffffff, 0x0020003f,
71162a37553SKen Wang 	0xc, 0xffffffff, 0x0000001c,
71262a37553SKen Wang 	0xd, 0x000f0000, 0x000f0000,
71362a37553SKen Wang 	0x583, 0xffffffff, 0x00000100,
71462a37553SKen Wang 	0x409, 0xffffffff, 0x00000100,
71562a37553SKen Wang 	0x40b, 0x00000101, 0x00000000,
71662a37553SKen Wang 	0x82a, 0xffffffff, 0x00000104,
71762a37553SKen Wang 	0x993, 0x000c0000, 0x000c0000,
71862a37553SKen Wang 	0x992, 0x000c0000, 0x000c0000,
71962a37553SKen Wang 	0x1579, 0xff000fff, 0x00000100,
72062a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
72162a37553SKen Wang 	0xbd4, 0x00000001, 0x00000001,
72262a37553SKen Wang 	0xc33, 0xc0000fff, 0x00000104,
72362a37553SKen Wang 	0x3079, 0x00000001, 0x00000001,
72462a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
72562a37553SKen Wang 	0x3630, 0xfffffff0, 0x00000100
72662a37553SKen Wang };
72762a37553SKen Wang static const u32 oland_mgcg_cgcg_init[] =
72862a37553SKen Wang {
72962a37553SKen Wang 	0x3100, 0xffffffff, 0xfffffffc,
73062a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
73162a37553SKen Wang 	0x2698, 0xffffffff, 0x00000100,
73262a37553SKen Wang 	0x24a9, 0xffffffff, 0x00000100,
73362a37553SKen Wang 	0x3059, 0xffffffff, 0x00000100,
73462a37553SKen Wang 	0x25dd, 0xffffffff, 0x00000100,
73562a37553SKen Wang 	0x2261, 0xffffffff, 0x06000100,
73662a37553SKen Wang 	0x2286, 0xffffffff, 0x00000100,
73762a37553SKen Wang 	0x24a8, 0xffffffff, 0x00000100,
73862a37553SKen Wang 	0x30e0, 0xffffffff, 0x00000100,
73962a37553SKen Wang 	0x22ca, 0xffffffff, 0x00000100,
74062a37553SKen Wang 	0x2451, 0xffffffff, 0x00000100,
74162a37553SKen Wang 	0x2362, 0xffffffff, 0x00000100,
74262a37553SKen Wang 	0x2363, 0xffffffff, 0x00000100,
74362a37553SKen Wang 	0x240c, 0xffffffff, 0x00000100,
74462a37553SKen Wang 	0x240d, 0xffffffff, 0x00000100,
74562a37553SKen Wang 	0x240e, 0xffffffff, 0x00000100,
74662a37553SKen Wang 	0x240f, 0xffffffff, 0x00000100,
74762a37553SKen Wang 	0x2b60, 0xffffffff, 0x00000100,
74862a37553SKen Wang 	0x2b15, 0xffffffff, 0x00000100,
74962a37553SKen Wang 	0x225f, 0xffffffff, 0x06000100,
75062a37553SKen Wang 	0x261a, 0xffffffff, 0x00000100,
75162a37553SKen Wang 	0x2544, 0xffffffff, 0x00000100,
75262a37553SKen Wang 	0x2bc1, 0xffffffff, 0x00000100,
75362a37553SKen Wang 	0x2b81, 0xffffffff, 0x00000100,
75462a37553SKen Wang 	0x2527, 0xffffffff, 0x00000100,
75562a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
75662a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
75762a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
75862a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
75962a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
76062a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
76162a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
76262a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
76362a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
76462a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
76562a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
76662a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
76762a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
76862a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
76962a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
77062a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
77162a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
77262a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
77362a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
77462a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
77562a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
77662a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
77762a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
77862a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
77962a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
78062a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
78162a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
78262a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
78362a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
78462a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
78562a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
78662a37553SKen Wang 	0x2454, 0xffffffff, 0x96940200,
78762a37553SKen Wang 	0x21c2, 0xffffffff, 0x00900100,
78862a37553SKen Wang 	0x311e, 0xffffffff, 0x00000080,
78962a37553SKen Wang 	0x3101, 0xffffffff, 0x0020003f,
79062a37553SKen Wang 	0xc, 0xffffffff, 0x0000001c,
79162a37553SKen Wang 	0xd, 0x000f0000, 0x000f0000,
79262a37553SKen Wang 	0x583, 0xffffffff, 0x00000100,
79362a37553SKen Wang 	0x409, 0xffffffff, 0x00000100,
79462a37553SKen Wang 	0x40b, 0x00000101, 0x00000000,
79562a37553SKen Wang 	0x82a, 0xffffffff, 0x00000104,
79662a37553SKen Wang 	0x993, 0x000c0000, 0x000c0000,
79762a37553SKen Wang 	0x992, 0x000c0000, 0x000c0000,
79862a37553SKen Wang 	0x1579, 0xff000fff, 0x00000100,
79962a37553SKen Wang 	0x157a, 0x00000001, 0x00000001,
80062a37553SKen Wang 	0xbd4, 0x00000001, 0x00000001,
80162a37553SKen Wang 	0xc33, 0xc0000fff, 0x00000104,
80262a37553SKen Wang 	0x3079, 0x00000001, 0x00000001,
80362a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
80462a37553SKen Wang 	0x3630, 0xfffffff0, 0x00000100
80562a37553SKen Wang };
80662a37553SKen Wang static const u32 hainan_mgcg_cgcg_init[] =
80762a37553SKen Wang {
80862a37553SKen Wang 	0x3100, 0xffffffff, 0xfffffffc,
80962a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
81062a37553SKen Wang 	0x2698, 0xffffffff, 0x00000100,
81162a37553SKen Wang 	0x24a9, 0xffffffff, 0x00000100,
81262a37553SKen Wang 	0x3059, 0xffffffff, 0x00000100,
81362a37553SKen Wang 	0x25dd, 0xffffffff, 0x00000100,
81462a37553SKen Wang 	0x2261, 0xffffffff, 0x06000100,
81562a37553SKen Wang 	0x2286, 0xffffffff, 0x00000100,
81662a37553SKen Wang 	0x24a8, 0xffffffff, 0x00000100,
81762a37553SKen Wang 	0x30e0, 0xffffffff, 0x00000100,
81862a37553SKen Wang 	0x22ca, 0xffffffff, 0x00000100,
81962a37553SKen Wang 	0x2451, 0xffffffff, 0x00000100,
82062a37553SKen Wang 	0x2362, 0xffffffff, 0x00000100,
82162a37553SKen Wang 	0x2363, 0xffffffff, 0x00000100,
82262a37553SKen Wang 	0x240c, 0xffffffff, 0x00000100,
82362a37553SKen Wang 	0x240d, 0xffffffff, 0x00000100,
82462a37553SKen Wang 	0x240e, 0xffffffff, 0x00000100,
82562a37553SKen Wang 	0x240f, 0xffffffff, 0x00000100,
82662a37553SKen Wang 	0x2b60, 0xffffffff, 0x00000100,
82762a37553SKen Wang 	0x2b15, 0xffffffff, 0x00000100,
82862a37553SKen Wang 	0x225f, 0xffffffff, 0x06000100,
82962a37553SKen Wang 	0x261a, 0xffffffff, 0x00000100,
83062a37553SKen Wang 	0x2544, 0xffffffff, 0x00000100,
83162a37553SKen Wang 	0x2bc1, 0xffffffff, 0x00000100,
83262a37553SKen Wang 	0x2b81, 0xffffffff, 0x00000100,
83362a37553SKen Wang 	0x2527, 0xffffffff, 0x00000100,
83462a37553SKen Wang 	0x200b, 0xffffffff, 0xe0000000,
83562a37553SKen Wang 	0x2458, 0xffffffff, 0x00010000,
83662a37553SKen Wang 	0x2459, 0xffffffff, 0x00030002,
83762a37553SKen Wang 	0x245a, 0xffffffff, 0x00040007,
83862a37553SKen Wang 	0x245b, 0xffffffff, 0x00060005,
83962a37553SKen Wang 	0x245c, 0xffffffff, 0x00090008,
84062a37553SKen Wang 	0x245d, 0xffffffff, 0x00020001,
84162a37553SKen Wang 	0x245e, 0xffffffff, 0x00040003,
84262a37553SKen Wang 	0x245f, 0xffffffff, 0x00000007,
84362a37553SKen Wang 	0x2460, 0xffffffff, 0x00060005,
84462a37553SKen Wang 	0x2461, 0xffffffff, 0x00090008,
84562a37553SKen Wang 	0x2462, 0xffffffff, 0x00030002,
84662a37553SKen Wang 	0x2463, 0xffffffff, 0x00050004,
84762a37553SKen Wang 	0x2464, 0xffffffff, 0x00000008,
84862a37553SKen Wang 	0x2465, 0xffffffff, 0x00070006,
84962a37553SKen Wang 	0x2466, 0xffffffff, 0x000a0009,
85062a37553SKen Wang 	0x2467, 0xffffffff, 0x00040003,
85162a37553SKen Wang 	0x2468, 0xffffffff, 0x00060005,
85262a37553SKen Wang 	0x2469, 0xffffffff, 0x00000009,
85362a37553SKen Wang 	0x246a, 0xffffffff, 0x00080007,
85462a37553SKen Wang 	0x246b, 0xffffffff, 0x000b000a,
85562a37553SKen Wang 	0x246c, 0xffffffff, 0x00050004,
85662a37553SKen Wang 	0x246d, 0xffffffff, 0x00070006,
85762a37553SKen Wang 	0x246e, 0xffffffff, 0x0008000b,
85862a37553SKen Wang 	0x246f, 0xffffffff, 0x000a0009,
85962a37553SKen Wang 	0x2470, 0xffffffff, 0x000d000c,
86062a37553SKen Wang 	0x2471, 0xffffffff, 0x00060005,
86162a37553SKen Wang 	0x2472, 0xffffffff, 0x00080007,
86262a37553SKen Wang 	0x2473, 0xffffffff, 0x0000000b,
86362a37553SKen Wang 	0x2474, 0xffffffff, 0x000a0009,
86462a37553SKen Wang 	0x2475, 0xffffffff, 0x000d000c,
86562a37553SKen Wang 	0x2454, 0xffffffff, 0x96940200,
86662a37553SKen Wang 	0x21c2, 0xffffffff, 0x00900100,
86762a37553SKen Wang 	0x311e, 0xffffffff, 0x00000080,
86862a37553SKen Wang 	0x3101, 0xffffffff, 0x0020003f,
86962a37553SKen Wang 	0xc, 0xffffffff, 0x0000001c,
87062a37553SKen Wang 	0xd, 0x000f0000, 0x000f0000,
87162a37553SKen Wang 	0x583, 0xffffffff, 0x00000100,
87262a37553SKen Wang 	0x409, 0xffffffff, 0x00000100,
87362a37553SKen Wang 	0x82a, 0xffffffff, 0x00000104,
87462a37553SKen Wang 	0x993, 0x000c0000, 0x000c0000,
87562a37553SKen Wang 	0x992, 0x000c0000, 0x000c0000,
87662a37553SKen Wang 	0xbd4, 0x00000001, 0x00000001,
87762a37553SKen Wang 	0xc33, 0xc0000fff, 0x00000104,
87862a37553SKen Wang 	0x3079, 0x00000001, 0x00000001,
87962a37553SKen Wang 	0x3430, 0xfffffff0, 0x00000100,
88062a37553SKen Wang 	0x3630, 0xfffffff0, 0x00000100
88162a37553SKen Wang };
88262a37553SKen Wang 
88362a37553SKen Wang static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
88462a37553SKen Wang {
88562a37553SKen Wang 	unsigned long flags;
88662a37553SKen Wang 	u32 r;
88762a37553SKen Wang 
88862a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
88962a37553SKen Wang 	WREG32(AMDGPU_PCIE_INDEX, reg);
89062a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_INDEX);
89162a37553SKen Wang 	r = RREG32(AMDGPU_PCIE_DATA);
89262a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
89362a37553SKen Wang 	return r;
89462a37553SKen Wang }
89562a37553SKen Wang 
89662a37553SKen Wang static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
89762a37553SKen Wang {
89862a37553SKen Wang 	unsigned long flags;
89962a37553SKen Wang 
90062a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
90162a37553SKen Wang 	WREG32(AMDGPU_PCIE_INDEX, reg);
90262a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_INDEX);
90362a37553SKen Wang 	WREG32(AMDGPU_PCIE_DATA, v);
90462a37553SKen Wang 	(void)RREG32(AMDGPU_PCIE_DATA);
90562a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
90662a37553SKen Wang }
90762a37553SKen Wang 
90836b9a952SHuang Rui u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
90936b9a952SHuang Rui {
91036b9a952SHuang Rui 	unsigned long flags;
91136b9a952SHuang Rui 	u32 r;
91236b9a952SHuang Rui 
91336b9a952SHuang Rui 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
91436b9a952SHuang Rui 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
91536b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_INDEX);
91636b9a952SHuang Rui 	r = RREG32(PCIE_PORT_DATA);
91736b9a952SHuang Rui 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
91836b9a952SHuang Rui 	return r;
91936b9a952SHuang Rui }
92036b9a952SHuang Rui 
92136b9a952SHuang Rui void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
92236b9a952SHuang Rui {
92336b9a952SHuang Rui 	unsigned long flags;
92436b9a952SHuang Rui 
92536b9a952SHuang Rui 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
92636b9a952SHuang Rui 	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
92736b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_INDEX);
92836b9a952SHuang Rui 	WREG32(PCIE_PORT_DATA, (v));
92936b9a952SHuang Rui 	(void)RREG32(PCIE_PORT_DATA);
93036b9a952SHuang Rui 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
93136b9a952SHuang Rui }
93236b9a952SHuang Rui 
93362a37553SKen Wang static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
93462a37553SKen Wang {
93562a37553SKen Wang 	unsigned long flags;
93662a37553SKen Wang 	u32 r;
93762a37553SKen Wang 
93862a37553SKen Wang 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
93962a37553SKen Wang 	WREG32(SMC_IND_INDEX_0, (reg));
94062a37553SKen Wang 	r = RREG32(SMC_IND_DATA_0);
94162a37553SKen Wang 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
94262a37553SKen Wang 	return r;
94362a37553SKen Wang }
94462a37553SKen Wang 
94562a37553SKen Wang static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
94662a37553SKen Wang {
94762a37553SKen Wang 	unsigned long flags;
94862a37553SKen Wang 
94962a37553SKen Wang 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
95062a37553SKen Wang 	WREG32(SMC_IND_INDEX_0, (reg));
95162a37553SKen Wang 	WREG32(SMC_IND_DATA_0, (v));
95262a37553SKen Wang 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
95362a37553SKen Wang }
95462a37553SKen Wang 
95562a37553SKen Wang static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
95662a37553SKen Wang 	{GRBM_STATUS, false},
95762a37553SKen Wang 	{GB_ADDR_CONFIG, false},
95862a37553SKen Wang 	{MC_ARB_RAMCFG, false},
95962a37553SKen Wang 	{GB_TILE_MODE0, false},
96062a37553SKen Wang 	{GB_TILE_MODE1, false},
96162a37553SKen Wang 	{GB_TILE_MODE2, false},
96262a37553SKen Wang 	{GB_TILE_MODE3, false},
96362a37553SKen Wang 	{GB_TILE_MODE4, false},
96462a37553SKen Wang 	{GB_TILE_MODE5, false},
96562a37553SKen Wang 	{GB_TILE_MODE6, false},
96662a37553SKen Wang 	{GB_TILE_MODE7, false},
96762a37553SKen Wang 	{GB_TILE_MODE8, false},
96862a37553SKen Wang 	{GB_TILE_MODE9, false},
96962a37553SKen Wang 	{GB_TILE_MODE10, false},
97062a37553SKen Wang 	{GB_TILE_MODE11, false},
97162a37553SKen Wang 	{GB_TILE_MODE12, false},
97262a37553SKen Wang 	{GB_TILE_MODE13, false},
97362a37553SKen Wang 	{GB_TILE_MODE14, false},
97462a37553SKen Wang 	{GB_TILE_MODE15, false},
97562a37553SKen Wang 	{GB_TILE_MODE16, false},
97662a37553SKen Wang 	{GB_TILE_MODE17, false},
97762a37553SKen Wang 	{GB_TILE_MODE18, false},
97862a37553SKen Wang 	{GB_TILE_MODE19, false},
97962a37553SKen Wang 	{GB_TILE_MODE20, false},
98062a37553SKen Wang 	{GB_TILE_MODE21, false},
98162a37553SKen Wang 	{GB_TILE_MODE22, false},
98262a37553SKen Wang 	{GB_TILE_MODE23, false},
98362a37553SKen Wang 	{GB_TILE_MODE24, false},
98462a37553SKen Wang 	{GB_TILE_MODE25, false},
98562a37553SKen Wang 	{GB_TILE_MODE26, false},
98662a37553SKen Wang 	{GB_TILE_MODE27, false},
98762a37553SKen Wang 	{GB_TILE_MODE28, false},
98862a37553SKen Wang 	{GB_TILE_MODE29, false},
98962a37553SKen Wang 	{GB_TILE_MODE30, false},
99062a37553SKen Wang 	{GB_TILE_MODE31, false},
99162a37553SKen Wang 	{CC_RB_BACKEND_DISABLE, false, true},
99262a37553SKen Wang 	{GC_USER_RB_BACKEND_DISABLE, false, true},
99362a37553SKen Wang 	{PA_SC_RASTER_CONFIG, false, true},
99462a37553SKen Wang };
99562a37553SKen Wang 
99662a37553SKen Wang static uint32_t si_read_indexed_register(struct amdgpu_device *adev,
99762a37553SKen Wang 					  u32 se_num, u32 sh_num,
99862a37553SKen Wang 					  u32 reg_offset)
99962a37553SKen Wang {
100062a37553SKen Wang 	uint32_t val;
100162a37553SKen Wang 
100262a37553SKen Wang 	mutex_lock(&adev->grbm_idx_mutex);
100362a37553SKen Wang 	if (se_num != 0xffffffff || sh_num != 0xffffffff)
100462a37553SKen Wang 		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
100562a37553SKen Wang 
100662a37553SKen Wang 	val = RREG32(reg_offset);
100762a37553SKen Wang 
100862a37553SKen Wang 	if (se_num != 0xffffffff || sh_num != 0xffffffff)
100962a37553SKen Wang 		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
101062a37553SKen Wang 	mutex_unlock(&adev->grbm_idx_mutex);
101162a37553SKen Wang 	return val;
101262a37553SKen Wang }
101362a37553SKen Wang 
101462a37553SKen Wang static int si_read_register(struct amdgpu_device *adev, u32 se_num,
101562a37553SKen Wang 			     u32 sh_num, u32 reg_offset, u32 *value)
101662a37553SKen Wang {
101762a37553SKen Wang 	uint32_t i;
101862a37553SKen Wang 
101962a37553SKen Wang 	*value = 0;
102062a37553SKen Wang 	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
102162a37553SKen Wang 		if (reg_offset != si_allowed_read_registers[i].reg_offset)
102262a37553SKen Wang 			continue;
102362a37553SKen Wang 
102462a37553SKen Wang 		if (!si_allowed_read_registers[i].untouched)
102562a37553SKen Wang 			*value = si_allowed_read_registers[i].grbm_indexed ?
102662a37553SKen Wang 				 si_read_indexed_register(adev, se_num,
102762a37553SKen Wang 							   sh_num, reg_offset) :
102862a37553SKen Wang 				 RREG32(reg_offset);
102962a37553SKen Wang 		return 0;
103062a37553SKen Wang 	}
103162a37553SKen Wang 	return -EINVAL;
103262a37553SKen Wang }
103362a37553SKen Wang 
103462a37553SKen Wang static bool si_read_disabled_bios(struct amdgpu_device *adev)
103562a37553SKen Wang {
103662a37553SKen Wang 	u32 bus_cntl;
103762a37553SKen Wang 	u32 d1vga_control = 0;
103862a37553SKen Wang 	u32 d2vga_control = 0;
103962a37553SKen Wang 	u32 vga_render_control = 0;
104062a37553SKen Wang 	u32 rom_cntl;
104162a37553SKen Wang 	bool r;
104262a37553SKen Wang 
104362a37553SKen Wang 	bus_cntl = RREG32(R600_BUS_CNTL);
104462a37553SKen Wang 	if (adev->mode_info.num_crtc) {
104562a37553SKen Wang 		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
104662a37553SKen Wang 		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
104762a37553SKen Wang 		vga_render_control = RREG32(VGA_RENDER_CONTROL);
104862a37553SKen Wang 	}
104962a37553SKen Wang 	rom_cntl = RREG32(R600_ROM_CNTL);
105062a37553SKen Wang 
105162a37553SKen Wang 	/* enable the rom */
105262a37553SKen Wang 	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
105362a37553SKen Wang 	if (adev->mode_info.num_crtc) {
105462a37553SKen Wang 		/* Disable VGA mode */
105562a37553SKen Wang 		WREG32(AVIVO_D1VGA_CONTROL,
105662a37553SKen Wang 		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
105762a37553SKen Wang 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
105862a37553SKen Wang 		WREG32(AVIVO_D2VGA_CONTROL,
105962a37553SKen Wang 		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
106062a37553SKen Wang 					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
106162a37553SKen Wang 		WREG32(VGA_RENDER_CONTROL,
106262a37553SKen Wang 		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
106362a37553SKen Wang 	}
106462a37553SKen Wang 	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
106562a37553SKen Wang 
106662a37553SKen Wang 	r = amdgpu_read_bios(adev);
106762a37553SKen Wang 
106862a37553SKen Wang 	/* restore regs */
106962a37553SKen Wang 	WREG32(R600_BUS_CNTL, bus_cntl);
107062a37553SKen Wang 	if (adev->mode_info.num_crtc) {
107162a37553SKen Wang 		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
107262a37553SKen Wang 		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
107362a37553SKen Wang 		WREG32(VGA_RENDER_CONTROL, vga_render_control);
107462a37553SKen Wang 	}
107562a37553SKen Wang 	WREG32(R600_ROM_CNTL, rom_cntl);
107662a37553SKen Wang 	return r;
107762a37553SKen Wang }
107862a37553SKen Wang 
107962a37553SKen Wang //xxx: not implemented
108062a37553SKen Wang static int si_asic_reset(struct amdgpu_device *adev)
108162a37553SKen Wang {
108262a37553SKen Wang 	return 0;
108362a37553SKen Wang }
108462a37553SKen Wang 
108562a37553SKen Wang static void si_vga_set_state(struct amdgpu_device *adev, bool state)
108662a37553SKen Wang {
108762a37553SKen Wang 	uint32_t temp;
108862a37553SKen Wang 
108962a37553SKen Wang 	temp = RREG32(CONFIG_CNTL);
109062a37553SKen Wang 	if (state == false) {
109162a37553SKen Wang 		temp &= ~(1<<0);
109262a37553SKen Wang 		temp |= (1<<1);
109362a37553SKen Wang 	} else {
109462a37553SKen Wang 		temp &= ~(1<<1);
109562a37553SKen Wang 	}
109662a37553SKen Wang 	WREG32(CONFIG_CNTL, temp);
109762a37553SKen Wang }
109862a37553SKen Wang 
109962a37553SKen Wang static u32 si_get_xclk(struct amdgpu_device *adev)
110062a37553SKen Wang {
110162a37553SKen Wang         u32 reference_clock = adev->clock.spll.reference_freq;
110262a37553SKen Wang 	u32 tmp;
110362a37553SKen Wang 
110462a37553SKen Wang 	tmp = RREG32(CG_CLKPIN_CNTL_2);
110562a37553SKen Wang 	if (tmp & MUX_TCLK_TO_XCLK)
110662a37553SKen Wang 		return TCLK;
110762a37553SKen Wang 
110862a37553SKen Wang 	tmp = RREG32(CG_CLKPIN_CNTL);
110962a37553SKen Wang 	if (tmp & XTALIN_DIVIDE)
111062a37553SKen Wang 		return reference_clock / 4;
111162a37553SKen Wang 
111262a37553SKen Wang 	return reference_clock;
111362a37553SKen Wang }
11141919696eSMaruthi Srinivas Bayyavarapu 
111562a37553SKen Wang //xxx:not implemented
111662a37553SKen Wang static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
111762a37553SKen Wang {
111862a37553SKen Wang 	return 0;
111962a37553SKen Wang }
112062a37553SKen Wang 
1121*4e99a44eSMonk Liu static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1122*4e99a44eSMonk Liu {
1123*4e99a44eSMonk Liu 	if (is_virtual_machine()) /* passthrough mode */
1124*4e99a44eSMonk Liu 		adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE;
1125*4e99a44eSMonk Liu }
1126*4e99a44eSMonk Liu 
112762a37553SKen Wang static const struct amdgpu_asic_funcs si_asic_funcs =
112862a37553SKen Wang {
112962a37553SKen Wang 	.read_disabled_bios = &si_read_disabled_bios,
1130*4e99a44eSMonk Liu 	.detect_hw_virtualization = si_detect_hw_virtualization,
113162a37553SKen Wang 	.read_register = &si_read_register,
113262a37553SKen Wang 	.reset = &si_asic_reset,
113362a37553SKen Wang 	.set_vga_state = &si_vga_set_state,
113462a37553SKen Wang 	.get_xclk = &si_get_xclk,
113562a37553SKen Wang 	.set_uvd_clocks = &si_set_uvd_clocks,
113662a37553SKen Wang 	.set_vce_clocks = NULL,
113762a37553SKen Wang };
113862a37553SKen Wang 
113962a37553SKen Wang static uint32_t si_get_rev_id(struct amdgpu_device *adev)
114062a37553SKen Wang {
114162a37553SKen Wang 	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
114262a37553SKen Wang 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
114362a37553SKen Wang }
114462a37553SKen Wang 
114562a37553SKen Wang static int si_common_early_init(void *handle)
114662a37553SKen Wang {
114762a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
114862a37553SKen Wang 
114962a37553SKen Wang 	adev->smc_rreg = &si_smc_rreg;
115062a37553SKen Wang 	adev->smc_wreg = &si_smc_wreg;
115162a37553SKen Wang 	adev->pcie_rreg = &si_pcie_rreg;
115262a37553SKen Wang 	adev->pcie_wreg = &si_pcie_wreg;
115336b9a952SHuang Rui 	adev->pciep_rreg = &si_pciep_rreg;
115436b9a952SHuang Rui 	adev->pciep_wreg = &si_pciep_wreg;
115562a37553SKen Wang 	adev->uvd_ctx_rreg = NULL;
115662a37553SKen Wang 	adev->uvd_ctx_wreg = NULL;
115762a37553SKen Wang 	adev->didt_rreg = NULL;
115862a37553SKen Wang 	adev->didt_wreg = NULL;
115962a37553SKen Wang 
116062a37553SKen Wang 	adev->asic_funcs = &si_asic_funcs;
116162a37553SKen Wang 
116262a37553SKen Wang 	adev->rev_id = si_get_rev_id(adev);
116362a37553SKen Wang 	adev->external_rev_id = 0xFF;
116462a37553SKen Wang 	switch (adev->asic_type) {
116562a37553SKen Wang 	case CHIP_TAHITI:
116662a37553SKen Wang 		adev->cg_flags =
116762a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
116862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
116962a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
117062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
117162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
117262a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
117362a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
117462a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
117562a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
117662a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
117762a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
117862a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
117962a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
118062a37553SKen Wang 			adev->pg_flags = 0;
118162a37553SKen Wang 		break;
118262a37553SKen Wang 	case CHIP_PITCAIRN:
118362a37553SKen Wang 		adev->cg_flags =
118462a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
118562a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
118662a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
118762a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
118862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
118962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
119062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
119162a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
119262a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
119362a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
119462a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
119562a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
119662a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
119762a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
119862a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
119962a37553SKen Wang 		adev->pg_flags = 0;
120062a37553SKen Wang 		break;
120162a37553SKen Wang 
120262a37553SKen Wang 	case CHIP_VERDE:
120362a37553SKen Wang 		adev->cg_flags =
120462a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
120562a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
120662a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
120762a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
120862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS_LS |
120962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
121062a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
121162a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
121262a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
121362a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_LS |
121462a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
121562a37553SKen Wang 			AMD_CG_SUPPORT_VCE_MGCG |
121662a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
121762a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
121862a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
121962a37553SKen Wang 		adev->pg_flags = 0;
122062a37553SKen Wang 		//???
122162a37553SKen Wang 		adev->external_rev_id = adev->rev_id + 0x14;
122262a37553SKen Wang 		break;
122362a37553SKen Wang 	case CHIP_OLAND:
122462a37553SKen Wang 		adev->cg_flags =
122562a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
122662a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
122762a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
122862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
122962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
123062a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
123162a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
123262a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
123362a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
123462a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
123562a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
123662a37553SKen Wang 			AMD_CG_SUPPORT_UVD_MGCG |
123762a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
123862a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
123962a37553SKen Wang 		adev->pg_flags = 0;
124062a37553SKen Wang 		break;
124162a37553SKen Wang 	case CHIP_HAINAN:
124262a37553SKen Wang 		adev->cg_flags =
124362a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGCG |
124462a37553SKen Wang 			AMD_CG_SUPPORT_GFX_MGLS |
124562a37553SKen Wang 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
124662a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGLS |
124762a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CGTS |
124862a37553SKen Wang 			AMD_CG_SUPPORT_GFX_CP_LS |
124962a37553SKen Wang 			AMD_CG_SUPPORT_GFX_RLC_LS |
125062a37553SKen Wang 			AMD_CG_SUPPORT_MC_LS |
125162a37553SKen Wang 			AMD_CG_SUPPORT_MC_MGCG |
125262a37553SKen Wang 			AMD_CG_SUPPORT_SDMA_MGCG |
125362a37553SKen Wang 			AMD_CG_SUPPORT_BIF_LS |
125462a37553SKen Wang 			AMD_CG_SUPPORT_HDP_LS |
125562a37553SKen Wang 			AMD_CG_SUPPORT_HDP_MGCG;
125662a37553SKen Wang 		adev->pg_flags = 0;
125762a37553SKen Wang 		break;
125862a37553SKen Wang 
125962a37553SKen Wang 	default:
126062a37553SKen Wang 		return -EINVAL;
126162a37553SKen Wang 	}
126262a37553SKen Wang 
126362a37553SKen Wang 	return 0;
126462a37553SKen Wang }
126562a37553SKen Wang 
126662a37553SKen Wang static int si_common_sw_init(void *handle)
126762a37553SKen Wang {
126862a37553SKen Wang 	return 0;
126962a37553SKen Wang }
127062a37553SKen Wang 
127162a37553SKen Wang static int si_common_sw_fini(void *handle)
127262a37553SKen Wang {
127362a37553SKen Wang 	return 0;
127462a37553SKen Wang }
127562a37553SKen Wang 
127662a37553SKen Wang 
127762a37553SKen Wang static void si_init_golden_registers(struct amdgpu_device *adev)
127862a37553SKen Wang {
127962a37553SKen Wang 	switch (adev->asic_type) {
128062a37553SKen Wang 	case CHIP_TAHITI:
128162a37553SKen Wang 		amdgpu_program_register_sequence(adev,
128262a37553SKen Wang 						 tahiti_golden_registers,
128362a37553SKen Wang 						 (const u32)ARRAY_SIZE(tahiti_golden_registers));
128462a37553SKen Wang 		amdgpu_program_register_sequence(adev,
128562a37553SKen Wang 						 tahiti_golden_rlc_registers,
128662a37553SKen Wang 						 (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
128762a37553SKen Wang 		amdgpu_program_register_sequence(adev,
128862a37553SKen Wang 						 tahiti_mgcg_cgcg_init,
128962a37553SKen Wang 						 (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
129062a37553SKen Wang 		amdgpu_program_register_sequence(adev,
129162a37553SKen Wang 						 tahiti_golden_registers2,
129262a37553SKen Wang 						 (const u32)ARRAY_SIZE(tahiti_golden_registers2));
129362a37553SKen Wang 		break;
129462a37553SKen Wang 	case CHIP_PITCAIRN:
129562a37553SKen Wang 		amdgpu_program_register_sequence(adev,
129662a37553SKen Wang 						 pitcairn_golden_registers,
129762a37553SKen Wang 						 (const u32)ARRAY_SIZE(pitcairn_golden_registers));
129862a37553SKen Wang 		amdgpu_program_register_sequence(adev,
129962a37553SKen Wang 						 pitcairn_golden_rlc_registers,
130062a37553SKen Wang 						 (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
130162a37553SKen Wang 		amdgpu_program_register_sequence(adev,
130262a37553SKen Wang 						 pitcairn_mgcg_cgcg_init,
130362a37553SKen Wang 						 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
130462a37553SKen Wang 	case CHIP_VERDE:
130562a37553SKen Wang 		amdgpu_program_register_sequence(adev,
130662a37553SKen Wang 						 verde_golden_registers,
130762a37553SKen Wang 						 (const u32)ARRAY_SIZE(verde_golden_registers));
130862a37553SKen Wang 		amdgpu_program_register_sequence(adev,
130962a37553SKen Wang 						 verde_golden_rlc_registers,
131062a37553SKen Wang 						 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
131162a37553SKen Wang 		amdgpu_program_register_sequence(adev,
131262a37553SKen Wang 						 verde_mgcg_cgcg_init,
131362a37553SKen Wang 						 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
131462a37553SKen Wang 		amdgpu_program_register_sequence(adev,
131562a37553SKen Wang 						 verde_pg_init,
131662a37553SKen Wang 						 (const u32)ARRAY_SIZE(verde_pg_init));
131762a37553SKen Wang 		break;
131862a37553SKen Wang 	case CHIP_OLAND:
131962a37553SKen Wang 		amdgpu_program_register_sequence(adev,
132062a37553SKen Wang 						 oland_golden_registers,
132162a37553SKen Wang 						 (const u32)ARRAY_SIZE(oland_golden_registers));
132262a37553SKen Wang 		amdgpu_program_register_sequence(adev,
132362a37553SKen Wang 						 oland_golden_rlc_registers,
132462a37553SKen Wang 						 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
132562a37553SKen Wang 		amdgpu_program_register_sequence(adev,
132662a37553SKen Wang 						 oland_mgcg_cgcg_init,
132762a37553SKen Wang 						 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
132862a37553SKen Wang 	case CHIP_HAINAN:
132962a37553SKen Wang 		amdgpu_program_register_sequence(adev,
133062a37553SKen Wang 						 hainan_golden_registers,
133162a37553SKen Wang 						 (const u32)ARRAY_SIZE(hainan_golden_registers));
133262a37553SKen Wang 		amdgpu_program_register_sequence(adev,
133362a37553SKen Wang 						 hainan_golden_registers2,
133462a37553SKen Wang 						 (const u32)ARRAY_SIZE(hainan_golden_registers2));
133562a37553SKen Wang 		amdgpu_program_register_sequence(adev,
133662a37553SKen Wang 						 hainan_mgcg_cgcg_init,
133762a37553SKen Wang 						 (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
133862a37553SKen Wang 		break;
133962a37553SKen Wang 
134062a37553SKen Wang 
134162a37553SKen Wang 	default:
134262a37553SKen Wang 		BUG();
134362a37553SKen Wang 	}
134462a37553SKen Wang }
134562a37553SKen Wang 
134662a37553SKen Wang static void si_pcie_gen3_enable(struct amdgpu_device *adev)
134762a37553SKen Wang {
134862a37553SKen Wang 	struct pci_dev *root = adev->pdev->bus->self;
134962a37553SKen Wang 	int bridge_pos, gpu_pos;
135062a37553SKen Wang 	u32 speed_cntl, mask, current_data_rate;
135162a37553SKen Wang 	int ret, i;
135262a37553SKen Wang 	u16 tmp16;
135362a37553SKen Wang 
135462a37553SKen Wang 	if (pci_is_root_bus(adev->pdev->bus))
135562a37553SKen Wang 		return;
135662a37553SKen Wang 
135762a37553SKen Wang 	if (amdgpu_pcie_gen2 == 0)
135862a37553SKen Wang 		return;
135962a37553SKen Wang 
136062a37553SKen Wang 	if (adev->flags & AMD_IS_APU)
136162a37553SKen Wang 		return;
136262a37553SKen Wang 
136362a37553SKen Wang 	ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
136462a37553SKen Wang 	if (ret != 0)
136562a37553SKen Wang 		return;
136662a37553SKen Wang 
136762a37553SKen Wang 	if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
136862a37553SKen Wang 		return;
136962a37553SKen Wang 
137036b9a952SHuang Rui 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
137162a37553SKen Wang 	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
137262a37553SKen Wang 		LC_CURRENT_DATA_RATE_SHIFT;
137362a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80) {
137462a37553SKen Wang 		if (current_data_rate == 2) {
137562a37553SKen Wang 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
137662a37553SKen Wang 			return;
137762a37553SKen Wang 		}
137862a37553SKen Wang 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
137962a37553SKen Wang 	} else if (mask & DRM_PCIE_SPEED_50) {
138062a37553SKen Wang 		if (current_data_rate == 1) {
138162a37553SKen Wang 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
138262a37553SKen Wang 			return;
138362a37553SKen Wang 		}
138462a37553SKen Wang 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
138562a37553SKen Wang 	}
138662a37553SKen Wang 
138762a37553SKen Wang 	bridge_pos = pci_pcie_cap(root);
138862a37553SKen Wang 	if (!bridge_pos)
138962a37553SKen Wang 		return;
139062a37553SKen Wang 
139162a37553SKen Wang 	gpu_pos = pci_pcie_cap(adev->pdev);
139262a37553SKen Wang 	if (!gpu_pos)
139362a37553SKen Wang 		return;
139462a37553SKen Wang 
139562a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80) {
139662a37553SKen Wang 		if (current_data_rate != 2) {
139762a37553SKen Wang 			u16 bridge_cfg, gpu_cfg;
139862a37553SKen Wang 			u16 bridge_cfg2, gpu_cfg2;
139962a37553SKen Wang 			u32 max_lw, current_lw, tmp;
140062a37553SKen Wang 
140162a37553SKen Wang 			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
140262a37553SKen Wang 			pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
140362a37553SKen Wang 
140462a37553SKen Wang 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
140562a37553SKen Wang 			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
140662a37553SKen Wang 
140762a37553SKen Wang 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
140862a37553SKen Wang 			pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
140962a37553SKen Wang 
141062a37553SKen Wang 			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
141162a37553SKen Wang 			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
141262a37553SKen Wang 			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
141362a37553SKen Wang 
141462a37553SKen Wang 			if (current_lw < max_lw) {
141536b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
141662a37553SKen Wang 				if (tmp & LC_RENEGOTIATION_SUPPORT) {
141762a37553SKen Wang 					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
141862a37553SKen Wang 					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
141962a37553SKen Wang 					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
142036b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
142162a37553SKen Wang 				}
142262a37553SKen Wang 			}
142362a37553SKen Wang 
142462a37553SKen Wang 			for (i = 0; i < 10; i++) {
142562a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
142662a37553SKen Wang 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
142762a37553SKen Wang 					break;
142862a37553SKen Wang 
142962a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
143062a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
143162a37553SKen Wang 
143262a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
143362a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
143462a37553SKen Wang 
143536b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
143662a37553SKen Wang 				tmp |= LC_SET_QUIESCE;
143736b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
143862a37553SKen Wang 
143936b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
144062a37553SKen Wang 				tmp |= LC_REDO_EQ;
144136b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
144262a37553SKen Wang 
144362a37553SKen Wang 				mdelay(100);
144462a37553SKen Wang 
144562a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
144662a37553SKen Wang 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
144762a37553SKen Wang 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
144862a37553SKen Wang 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
144962a37553SKen Wang 
145062a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
145162a37553SKen Wang 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
145262a37553SKen Wang 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
145362a37553SKen Wang 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
145462a37553SKen Wang 
145562a37553SKen Wang 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
145662a37553SKen Wang 				tmp16 &= ~((1 << 4) | (7 << 9));
145762a37553SKen Wang 				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
145862a37553SKen Wang 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
145962a37553SKen Wang 
146062a37553SKen Wang 				pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
146162a37553SKen Wang 				tmp16 &= ~((1 << 4) | (7 << 9));
146262a37553SKen Wang 				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
146362a37553SKen Wang 				pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
146462a37553SKen Wang 
146536b9a952SHuang Rui 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
146662a37553SKen Wang 				tmp &= ~LC_SET_QUIESCE;
146736b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
146862a37553SKen Wang 			}
146962a37553SKen Wang 		}
147062a37553SKen Wang 	}
147162a37553SKen Wang 
147262a37553SKen Wang 	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
147362a37553SKen Wang 	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
147436b9a952SHuang Rui 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
147562a37553SKen Wang 
147662a37553SKen Wang 	pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
147762a37553SKen Wang 	tmp16 &= ~0xf;
147862a37553SKen Wang 	if (mask & DRM_PCIE_SPEED_80)
147962a37553SKen Wang 		tmp16 |= 3;
148062a37553SKen Wang 	else if (mask & DRM_PCIE_SPEED_50)
148162a37553SKen Wang 		tmp16 |= 2;
148262a37553SKen Wang 	else
148362a37553SKen Wang 		tmp16 |= 1;
148462a37553SKen Wang 	pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
148562a37553SKen Wang 
148636b9a952SHuang Rui 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
148762a37553SKen Wang 	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
148836b9a952SHuang Rui 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
148962a37553SKen Wang 
149062a37553SKen Wang 	for (i = 0; i < adev->usec_timeout; i++) {
149136b9a952SHuang Rui 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
149262a37553SKen Wang 		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
149362a37553SKen Wang 			break;
149462a37553SKen Wang 		udelay(1);
149562a37553SKen Wang 	}
149662a37553SKen Wang }
149762a37553SKen Wang 
149862a37553SKen Wang static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
149962a37553SKen Wang {
150062a37553SKen Wang 	unsigned long flags;
150162a37553SKen Wang 	u32 r;
150262a37553SKen Wang 
150362a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
150462a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
150562a37553SKen Wang 	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
150662a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
150762a37553SKen Wang 	return r;
150862a37553SKen Wang }
150962a37553SKen Wang 
151062a37553SKen Wang static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
151162a37553SKen Wang {
151262a37553SKen Wang 	unsigned long flags;
151362a37553SKen Wang 
151462a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
151562a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
151662a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
151762a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
151862a37553SKen Wang }
151962a37553SKen Wang 
152062a37553SKen Wang static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
152162a37553SKen Wang {
152262a37553SKen Wang 	unsigned long flags;
152362a37553SKen Wang 	u32 r;
152462a37553SKen Wang 
152562a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
152662a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
152762a37553SKen Wang 	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
152862a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
152962a37553SKen Wang 	return r;
153062a37553SKen Wang }
153162a37553SKen Wang 
153262a37553SKen Wang static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
153362a37553SKen Wang {
153462a37553SKen Wang 	unsigned long flags;
153562a37553SKen Wang 
153662a37553SKen Wang 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
153762a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
153862a37553SKen Wang 	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
153962a37553SKen Wang 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
154062a37553SKen Wang }
154162a37553SKen Wang static void si_program_aspm(struct amdgpu_device *adev)
154262a37553SKen Wang {
154362a37553SKen Wang 	u32 data, orig;
154462a37553SKen Wang 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
154562a37553SKen Wang 	bool disable_clkreq = false;
154662a37553SKen Wang 
154762a37553SKen Wang 	if (amdgpu_aspm == 0)
154862a37553SKen Wang 		return;
154962a37553SKen Wang 
155062a37553SKen Wang 	if (adev->flags & AMD_IS_APU)
155162a37553SKen Wang 		return;
155236b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
155362a37553SKen Wang 	data &= ~LC_XMIT_N_FTS_MASK;
155462a37553SKen Wang 	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
155562a37553SKen Wang 	if (orig != data)
155636b9a952SHuang Rui 		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
155762a37553SKen Wang 
155836b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
155962a37553SKen Wang 	data |= LC_GO_TO_RECOVERY;
156062a37553SKen Wang 	if (orig != data)
156136b9a952SHuang Rui 		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
156262a37553SKen Wang 
156362a37553SKen Wang 	orig = data = RREG32_PCIE(PCIE_P_CNTL);
156462a37553SKen Wang 	data |= P_IGNORE_EDB_ERR;
156562a37553SKen Wang 	if (orig != data)
156662a37553SKen Wang 		WREG32_PCIE(PCIE_P_CNTL, data);
156762a37553SKen Wang 
156836b9a952SHuang Rui 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
156962a37553SKen Wang 	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
157062a37553SKen Wang 	data |= LC_PMI_TO_L1_DIS;
157162a37553SKen Wang 	if (!disable_l0s)
157262a37553SKen Wang 		data |= LC_L0S_INACTIVITY(7);
157362a37553SKen Wang 
157462a37553SKen Wang 	if (!disable_l1) {
157562a37553SKen Wang 		data |= LC_L1_INACTIVITY(7);
157662a37553SKen Wang 		data &= ~LC_PMI_TO_L1_DIS;
157762a37553SKen Wang 		if (orig != data)
157836b9a952SHuang Rui 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
157962a37553SKen Wang 
158062a37553SKen Wang 		if (!disable_plloff_in_l1) {
158162a37553SKen Wang 			bool clk_req_support;
158262a37553SKen Wang 
158362a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
158462a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
158562a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
158662a37553SKen Wang 			if (orig != data)
158762a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
158862a37553SKen Wang 
158962a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
159062a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
159162a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
159262a37553SKen Wang 			if (orig != data)
159362a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
159462a37553SKen Wang 
159562a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
159662a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
159762a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
159862a37553SKen Wang 			if (orig != data)
159962a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
160062a37553SKen Wang 
160162a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
160262a37553SKen Wang 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
160362a37553SKen Wang 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
160462a37553SKen Wang 			if (orig != data)
160562a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
160662a37553SKen Wang 
160762a37553SKen Wang 			if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
160862a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
160962a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
161062a37553SKen Wang 				if (orig != data)
161162a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
161262a37553SKen Wang 
161362a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
161462a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
161562a37553SKen Wang 				if (orig != data)
161662a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
161762a37553SKen Wang 
161862a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
161962a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
162062a37553SKen Wang 				if (orig != data)
162162a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
162262a37553SKen Wang 
162362a37553SKen Wang 				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
162462a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
162562a37553SKen Wang 				if (orig != data)
162662a37553SKen Wang 					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
162762a37553SKen Wang 
162862a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
162962a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_0_MASK;
163062a37553SKen Wang 				if (orig != data)
163162a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
163262a37553SKen Wang 
163362a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
163462a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_1_MASK;
163562a37553SKen Wang 				if (orig != data)
163662a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
163762a37553SKen Wang 
163862a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
163962a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_2_MASK;
164062a37553SKen Wang 				if (orig != data)
164162a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
164262a37553SKen Wang 
164362a37553SKen Wang 				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
164462a37553SKen Wang 				data &= ~PLL_RAMP_UP_TIME_3_MASK;
164562a37553SKen Wang 				if (orig != data)
164662a37553SKen Wang 					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
164762a37553SKen Wang 			}
164836b9a952SHuang Rui 			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
164962a37553SKen Wang 			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
165062a37553SKen Wang 			data |= LC_DYN_LANES_PWR_STATE(3);
165162a37553SKen Wang 			if (orig != data)
165236b9a952SHuang Rui 				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
165362a37553SKen Wang 
165462a37553SKen Wang 			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
165562a37553SKen Wang 			data &= ~LS2_EXIT_TIME_MASK;
165662a37553SKen Wang 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
165762a37553SKen Wang 				data |= LS2_EXIT_TIME(5);
165862a37553SKen Wang 			if (orig != data)
165962a37553SKen Wang 				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
166062a37553SKen Wang 
166162a37553SKen Wang 			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
166262a37553SKen Wang 			data &= ~LS2_EXIT_TIME_MASK;
166362a37553SKen Wang 			if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
166462a37553SKen Wang 				data |= LS2_EXIT_TIME(5);
166562a37553SKen Wang 			if (orig != data)
166662a37553SKen Wang 				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
166762a37553SKen Wang 
166862a37553SKen Wang 			if (!disable_clkreq &&
166962a37553SKen Wang 			    !pci_is_root_bus(adev->pdev->bus)) {
167062a37553SKen Wang 				struct pci_dev *root = adev->pdev->bus->self;
167162a37553SKen Wang 				u32 lnkcap;
167262a37553SKen Wang 
167362a37553SKen Wang 				clk_req_support = false;
167462a37553SKen Wang 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
167562a37553SKen Wang 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
167662a37553SKen Wang 					clk_req_support = true;
167762a37553SKen Wang 			} else {
167862a37553SKen Wang 				clk_req_support = false;
167962a37553SKen Wang 			}
168062a37553SKen Wang 
168162a37553SKen Wang 			if (clk_req_support) {
168236b9a952SHuang Rui 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
168362a37553SKen Wang 				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
168462a37553SKen Wang 				if (orig != data)
168536b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
168662a37553SKen Wang 
168762a37553SKen Wang 				orig = data = RREG32(THM_CLK_CNTL);
168862a37553SKen Wang 				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
168962a37553SKen Wang 				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
169062a37553SKen Wang 				if (orig != data)
169162a37553SKen Wang 					WREG32(THM_CLK_CNTL, data);
169262a37553SKen Wang 
169362a37553SKen Wang 				orig = data = RREG32(MISC_CLK_CNTL);
169462a37553SKen Wang 				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
169562a37553SKen Wang 				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
169662a37553SKen Wang 				if (orig != data)
169762a37553SKen Wang 					WREG32(MISC_CLK_CNTL, data);
169862a37553SKen Wang 
169962a37553SKen Wang 				orig = data = RREG32(CG_CLKPIN_CNTL);
170062a37553SKen Wang 				data &= ~BCLK_AS_XCLK;
170162a37553SKen Wang 				if (orig != data)
170262a37553SKen Wang 					WREG32(CG_CLKPIN_CNTL, data);
170362a37553SKen Wang 
170462a37553SKen Wang 				orig = data = RREG32(CG_CLKPIN_CNTL_2);
170562a37553SKen Wang 				data &= ~FORCE_BIF_REFCLK_EN;
170662a37553SKen Wang 				if (orig != data)
170762a37553SKen Wang 					WREG32(CG_CLKPIN_CNTL_2, data);
170862a37553SKen Wang 
170962a37553SKen Wang 				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
171062a37553SKen Wang 				data &= ~MPLL_CLKOUT_SEL_MASK;
171162a37553SKen Wang 				data |= MPLL_CLKOUT_SEL(4);
171262a37553SKen Wang 				if (orig != data)
171362a37553SKen Wang 					WREG32(MPLL_BYPASSCLK_SEL, data);
171462a37553SKen Wang 
171562a37553SKen Wang 				orig = data = RREG32(SPLL_CNTL_MODE);
171662a37553SKen Wang 				data &= ~SPLL_REFCLK_SEL_MASK;
171762a37553SKen Wang 				if (orig != data)
171862a37553SKen Wang 					WREG32(SPLL_CNTL_MODE, data);
171962a37553SKen Wang 			}
172062a37553SKen Wang 		}
172162a37553SKen Wang 	} else {
172262a37553SKen Wang 		if (orig != data)
172336b9a952SHuang Rui 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
172462a37553SKen Wang 	}
172562a37553SKen Wang 
172662a37553SKen Wang 	orig = data = RREG32_PCIE(PCIE_CNTL2);
172762a37553SKen Wang 	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
172862a37553SKen Wang 	if (orig != data)
172962a37553SKen Wang 		WREG32_PCIE(PCIE_CNTL2, data);
173062a37553SKen Wang 
173162a37553SKen Wang 	if (!disable_l0s) {
173236b9a952SHuang Rui 		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
173362a37553SKen Wang 		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
173462a37553SKen Wang 			data = RREG32_PCIE(PCIE_LC_STATUS1);
173562a37553SKen Wang 			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
173636b9a952SHuang Rui 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
173762a37553SKen Wang 				data &= ~LC_L0S_INACTIVITY_MASK;
173862a37553SKen Wang 				if (orig != data)
173936b9a952SHuang Rui 					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
174062a37553SKen Wang 			}
174162a37553SKen Wang 		}
174262a37553SKen Wang 	}
174362a37553SKen Wang }
174462a37553SKen Wang 
174562a37553SKen Wang static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
174662a37553SKen Wang {
174762a37553SKen Wang 	int readrq;
174862a37553SKen Wang 	u16 v;
174962a37553SKen Wang 
175062a37553SKen Wang 	readrq = pcie_get_readrq(adev->pdev);
175162a37553SKen Wang 	v = ffs(readrq) - 8;
175262a37553SKen Wang 	if ((v == 0) || (v == 6) || (v == 7))
175362a37553SKen Wang 		pcie_set_readrq(adev->pdev, 512);
175462a37553SKen Wang }
175562a37553SKen Wang 
175662a37553SKen Wang static int si_common_hw_init(void *handle)
175762a37553SKen Wang {
175862a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
175962a37553SKen Wang 
176062a37553SKen Wang 	si_fix_pci_max_read_req_size(adev);
176162a37553SKen Wang 	si_init_golden_registers(adev);
176262a37553SKen Wang 	si_pcie_gen3_enable(adev);
176362a37553SKen Wang 	si_program_aspm(adev);
176462a37553SKen Wang 
176562a37553SKen Wang 	return 0;
176662a37553SKen Wang }
176762a37553SKen Wang 
176862a37553SKen Wang static int si_common_hw_fini(void *handle)
176962a37553SKen Wang {
177062a37553SKen Wang 	return 0;
177162a37553SKen Wang }
177262a37553SKen Wang 
177362a37553SKen Wang static int si_common_suspend(void *handle)
177462a37553SKen Wang {
177562a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
177662a37553SKen Wang 
177762a37553SKen Wang 	return si_common_hw_fini(adev);
177862a37553SKen Wang }
177962a37553SKen Wang 
178062a37553SKen Wang static int si_common_resume(void *handle)
178162a37553SKen Wang {
178262a37553SKen Wang 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
178362a37553SKen Wang 
178462a37553SKen Wang 	return si_common_hw_init(adev);
178562a37553SKen Wang }
178662a37553SKen Wang 
178762a37553SKen Wang static bool si_common_is_idle(void *handle)
178862a37553SKen Wang {
178962a37553SKen Wang 	return true;
179062a37553SKen Wang }
179162a37553SKen Wang 
179262a37553SKen Wang static int si_common_wait_for_idle(void *handle)
179362a37553SKen Wang {
179462a37553SKen Wang 	return 0;
179562a37553SKen Wang }
179662a37553SKen Wang 
179762a37553SKen Wang static int si_common_soft_reset(void *handle)
179862a37553SKen Wang {
179962a37553SKen Wang 	return 0;
180062a37553SKen Wang }
180162a37553SKen Wang 
180262a37553SKen Wang static int si_common_set_clockgating_state(void *handle,
180362a37553SKen Wang 					    enum amd_clockgating_state state)
180462a37553SKen Wang {
180562a37553SKen Wang 	return 0;
180662a37553SKen Wang }
180762a37553SKen Wang 
180862a37553SKen Wang static int si_common_set_powergating_state(void *handle,
180962a37553SKen Wang 					    enum amd_powergating_state state)
181062a37553SKen Wang {
181162a37553SKen Wang 	return 0;
181262a37553SKen Wang }
181362a37553SKen Wang 
181462a37553SKen Wang const struct amd_ip_funcs si_common_ip_funcs = {
181562a37553SKen Wang 	.name = "si_common",
181662a37553SKen Wang 	.early_init = si_common_early_init,
181762a37553SKen Wang 	.late_init = NULL,
181862a37553SKen Wang 	.sw_init = si_common_sw_init,
181962a37553SKen Wang 	.sw_fini = si_common_sw_fini,
182062a37553SKen Wang 	.hw_init = si_common_hw_init,
182162a37553SKen Wang 	.hw_fini = si_common_hw_fini,
182262a37553SKen Wang 	.suspend = si_common_suspend,
182362a37553SKen Wang 	.resume = si_common_resume,
182462a37553SKen Wang 	.is_idle = si_common_is_idle,
182562a37553SKen Wang 	.wait_for_idle = si_common_wait_for_idle,
182662a37553SKen Wang 	.soft_reset = si_common_soft_reset,
182762a37553SKen Wang 	.set_clockgating_state = si_common_set_clockgating_state,
182862a37553SKen Wang 	.set_powergating_state = si_common_set_powergating_state,
182962a37553SKen Wang };
183062a37553SKen Wang 
183162a37553SKen Wang static const struct amdgpu_ip_block_version verde_ip_blocks[] =
183262a37553SKen Wang {
183362a37553SKen Wang 	{
183462a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_COMMON,
183562a37553SKen Wang 		.major = 1,
183662a37553SKen Wang 		.minor = 0,
183762a37553SKen Wang 		.rev = 0,
183862a37553SKen Wang 		.funcs = &si_common_ip_funcs,
183962a37553SKen Wang 	},
184062a37553SKen Wang 	{
184162a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_GMC,
184262a37553SKen Wang 		.major = 6,
184362a37553SKen Wang 		.minor = 0,
184462a37553SKen Wang 		.rev = 0,
184562a37553SKen Wang 		.funcs = &gmc_v6_0_ip_funcs,
184662a37553SKen Wang 	},
184762a37553SKen Wang 	{
184862a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_IH,
184962a37553SKen Wang 		.major = 1,
185062a37553SKen Wang 		.minor = 0,
185162a37553SKen Wang 		.rev = 0,
185262a37553SKen Wang 		.funcs = &si_ih_ip_funcs,
185362a37553SKen Wang 	},
18541919696eSMaruthi Srinivas Bayyavarapu 	{
185562a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_SMC,
185662a37553SKen Wang 		.major = 6,
185762a37553SKen Wang 		.minor = 0,
185862a37553SKen Wang 		.rev = 0,
18591919696eSMaruthi Srinivas Bayyavarapu 		.funcs = &amdgpu_pp_ip_funcs,
186062a37553SKen Wang 	},
186162a37553SKen Wang 	{
186262a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_DCE,
186362a37553SKen Wang 		.major = 6,
186462a37553SKen Wang 		.minor = 0,
186562a37553SKen Wang 		.rev = 0,
186662a37553SKen Wang 		.funcs = &dce_v6_0_ip_funcs,
186762a37553SKen Wang 	},
186862a37553SKen Wang 	{
186962a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_GFX,
187062a37553SKen Wang 		.major = 6,
187162a37553SKen Wang 		.minor = 0,
187262a37553SKen Wang 		.rev = 0,
187362a37553SKen Wang 		.funcs = &gfx_v6_0_ip_funcs,
187462a37553SKen Wang 	},
187562a37553SKen Wang 	{
187662a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_SDMA,
187762a37553SKen Wang 		.major = 1,
187862a37553SKen Wang 		.minor = 0,
187962a37553SKen Wang 		.rev = 0,
188062a37553SKen Wang 		.funcs = &si_dma_ip_funcs,
188162a37553SKen Wang 	},
188262a37553SKen Wang /*	{
188362a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_UVD,
188462a37553SKen Wang 		.major = 3,
188562a37553SKen Wang 		.minor = 1,
188662a37553SKen Wang 		.rev = 0,
188762a37553SKen Wang 		.funcs = &si_null_ip_funcs,
188862a37553SKen Wang 	},
188962a37553SKen Wang 	{
189062a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_VCE,
189162a37553SKen Wang 		.major = 1,
189262a37553SKen Wang 		.minor = 0,
189362a37553SKen Wang 		.rev = 0,
189462a37553SKen Wang 		.funcs = &si_null_ip_funcs,
189562a37553SKen Wang 	},
189662a37553SKen Wang 	*/
189762a37553SKen Wang };
189862a37553SKen Wang 
189962a37553SKen Wang 
190062a37553SKen Wang static const struct amdgpu_ip_block_version hainan_ip_blocks[] =
190162a37553SKen Wang {
190262a37553SKen Wang 	{
190362a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_COMMON,
190462a37553SKen Wang 		.major = 1,
190562a37553SKen Wang 		.minor = 0,
190662a37553SKen Wang 		.rev = 0,
190762a37553SKen Wang 		.funcs = &si_common_ip_funcs,
190862a37553SKen Wang 	},
190962a37553SKen Wang 	{
191062a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_GMC,
191162a37553SKen Wang 		.major = 6,
191262a37553SKen Wang 		.minor = 0,
191362a37553SKen Wang 		.rev = 0,
191462a37553SKen Wang 		.funcs = &gmc_v6_0_ip_funcs,
191562a37553SKen Wang 	},
191662a37553SKen Wang 	{
191762a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_IH,
191862a37553SKen Wang 		.major = 1,
191962a37553SKen Wang 		.minor = 0,
192062a37553SKen Wang 		.rev = 0,
192162a37553SKen Wang 		.funcs = &si_ih_ip_funcs,
192262a37553SKen Wang 	},
192362a37553SKen Wang 	{
192462a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_SMC,
192562a37553SKen Wang 		.major = 6,
192662a37553SKen Wang 		.minor = 0,
192762a37553SKen Wang 		.rev = 0,
19281919696eSMaruthi Srinivas Bayyavarapu 		.funcs = &amdgpu_pp_ip_funcs,
192962a37553SKen Wang 	},
193062a37553SKen Wang 	{
193162a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_GFX,
193262a37553SKen Wang 		.major = 6,
193362a37553SKen Wang 		.minor = 0,
193462a37553SKen Wang 		.rev = 0,
193562a37553SKen Wang 		.funcs = &gfx_v6_0_ip_funcs,
193662a37553SKen Wang 	},
193762a37553SKen Wang 	{
193862a37553SKen Wang 		.type = AMD_IP_BLOCK_TYPE_SDMA,
193962a37553SKen Wang 		.major = 1,
194062a37553SKen Wang 		.minor = 0,
194162a37553SKen Wang 		.rev = 0,
194262a37553SKen Wang 		.funcs = &si_dma_ip_funcs,
194362a37553SKen Wang 	},
194462a37553SKen Wang };
194562a37553SKen Wang 
194662a37553SKen Wang int si_set_ip_blocks(struct amdgpu_device *adev)
194762a37553SKen Wang {
194862a37553SKen Wang 	switch (adev->asic_type) {
194962a37553SKen Wang 	case CHIP_VERDE:
195062a37553SKen Wang 	case CHIP_TAHITI:
195162a37553SKen Wang 	case CHIP_PITCAIRN:
195262a37553SKen Wang 	case CHIP_OLAND:
195362a37553SKen Wang 		adev->ip_blocks = verde_ip_blocks;
195462a37553SKen Wang 		adev->num_ip_blocks = ARRAY_SIZE(verde_ip_blocks);
195562a37553SKen Wang 		break;
195662a37553SKen Wang 	case CHIP_HAINAN:
195762a37553SKen Wang 		adev->ip_blocks = hainan_ip_blocks;
195862a37553SKen Wang 		adev->num_ip_blocks = ARRAY_SIZE(hainan_ip_blocks);
195962a37553SKen Wang 		break;
196062a37553SKen Wang 	default:
196162a37553SKen Wang 		BUG();
196262a37553SKen Wang 	}
196362a37553SKen Wang 	return 0;
196462a37553SKen Wang }
196562a37553SKen Wang 
1966