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