1b843c749SSergey Zigachev /*
2b843c749SSergey Zigachev * Copyright 2014 Advanced Micro Devices, Inc.
3b843c749SSergey Zigachev *
4b843c749SSergey Zigachev * Permission is hereby granted, free of charge, to any person obtaining a
5b843c749SSergey Zigachev * copy of this software and associated documentation files (the "Software"),
6b843c749SSergey Zigachev * to deal in the Software without restriction, including without limitation
7b843c749SSergey Zigachev * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b843c749SSergey Zigachev * and/or sell copies of the Software, and to permit persons to whom the
9b843c749SSergey Zigachev * Software is furnished to do so, subject to the following conditions:
10b843c749SSergey Zigachev *
11b843c749SSergey Zigachev * The above copyright notice and this permission notice shall be included in
12b843c749SSergey Zigachev * all copies or substantial portions of the Software.
13b843c749SSergey Zigachev *
14b843c749SSergey Zigachev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15b843c749SSergey Zigachev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16b843c749SSergey Zigachev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17b843c749SSergey Zigachev * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18b843c749SSergey Zigachev * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19b843c749SSergey Zigachev * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20b843c749SSergey Zigachev * OTHER DEALINGS IN THE SOFTWARE.
21b843c749SSergey Zigachev *
22b843c749SSergey Zigachev */
23b843c749SSergey Zigachev #include <linux/kernel.h>
24b843c749SSergey Zigachev #include <linux/firmware.h>
25b843c749SSergey Zigachev #include <drm/drmP.h>
26b843c749SSergey Zigachev #include "amdgpu.h"
27b843c749SSergey Zigachev #include "amdgpu_gfx.h"
28b843c749SSergey Zigachev #include "vi.h"
29b843c749SSergey Zigachev #include "vi_structs.h"
30b843c749SSergey Zigachev #include "vid.h"
31b843c749SSergey Zigachev #include "amdgpu_ucode.h"
32b843c749SSergey Zigachev #include "amdgpu_atombios.h"
33b843c749SSergey Zigachev #include "atombios_i2c.h"
34b843c749SSergey Zigachev #include "clearstate_vi.h"
35b843c749SSergey Zigachev
36b843c749SSergey Zigachev #include "gmc/gmc_8_2_d.h"
37b843c749SSergey Zigachev #include "gmc/gmc_8_2_sh_mask.h"
38b843c749SSergey Zigachev
39b843c749SSergey Zigachev #include "oss/oss_3_0_d.h"
40b843c749SSergey Zigachev #include "oss/oss_3_0_sh_mask.h"
41b843c749SSergey Zigachev
42b843c749SSergey Zigachev #include "bif/bif_5_0_d.h"
43b843c749SSergey Zigachev #include "bif/bif_5_0_sh_mask.h"
44b843c749SSergey Zigachev #include "gca/gfx_8_0_d.h"
45b843c749SSergey Zigachev #include "gca/gfx_8_0_enum.h"
46b843c749SSergey Zigachev #include "gca/gfx_8_0_sh_mask.h"
47b843c749SSergey Zigachev #include "gca/gfx_8_0_enum.h"
48b843c749SSergey Zigachev
49b843c749SSergey Zigachev #include "dce/dce_10_0_d.h"
50b843c749SSergey Zigachev #include "dce/dce_10_0_sh_mask.h"
51b843c749SSergey Zigachev
52b843c749SSergey Zigachev #include "smu/smu_7_1_3_d.h"
53b843c749SSergey Zigachev
54b843c749SSergey Zigachev #include "ivsrcid/ivsrcid_vislands30.h"
55b843c749SSergey Zigachev
56b843c749SSergey Zigachev #define GFX8_NUM_GFX_RINGS 1
57b843c749SSergey Zigachev #define GFX8_MEC_HPD_SIZE 2048
58b843c749SSergey Zigachev
59b843c749SSergey Zigachev #define TOPAZ_GB_ADDR_CONFIG_GOLDEN 0x22010001
60b843c749SSergey Zigachev #define CARRIZO_GB_ADDR_CONFIG_GOLDEN 0x22010001
61b843c749SSergey Zigachev #define POLARIS11_GB_ADDR_CONFIG_GOLDEN 0x22011002
62b843c749SSergey Zigachev #define TONGA_GB_ADDR_CONFIG_GOLDEN 0x22011003
63b843c749SSergey Zigachev
64b843c749SSergey Zigachev #define ARRAY_MODE(x) ((x) << GB_TILE_MODE0__ARRAY_MODE__SHIFT)
65b843c749SSergey Zigachev #define PIPE_CONFIG(x) ((x) << GB_TILE_MODE0__PIPE_CONFIG__SHIFT)
66b843c749SSergey Zigachev #define TILE_SPLIT(x) ((x) << GB_TILE_MODE0__TILE_SPLIT__SHIFT)
67b843c749SSergey Zigachev #define MICRO_TILE_MODE_NEW(x) ((x) << GB_TILE_MODE0__MICRO_TILE_MODE_NEW__SHIFT)
68b843c749SSergey Zigachev #define SAMPLE_SPLIT(x) ((x) << GB_TILE_MODE0__SAMPLE_SPLIT__SHIFT)
69b843c749SSergey Zigachev #define BANK_WIDTH(x) ((x) << GB_MACROTILE_MODE0__BANK_WIDTH__SHIFT)
70b843c749SSergey Zigachev #define BANK_HEIGHT(x) ((x) << GB_MACROTILE_MODE0__BANK_HEIGHT__SHIFT)
71b843c749SSergey Zigachev #define MACRO_TILE_ASPECT(x) ((x) << GB_MACROTILE_MODE0__MACRO_TILE_ASPECT__SHIFT)
72b843c749SSergey Zigachev #define NUM_BANKS(x) ((x) << GB_MACROTILE_MODE0__NUM_BANKS__SHIFT)
73b843c749SSergey Zigachev
74b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__CPF_MASK 0x00000001L
75b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__RLC_MASK 0x00000002L
76b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK 0x00000004L
77b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__CGCG_MASK 0x00000008L
78b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__CGLS_MASK 0x00000010L
79b843c749SSergey Zigachev #define RLC_CGTT_MGCG_OVERRIDE__GRBM_MASK 0x00000020L
80b843c749SSergey Zigachev
81b843c749SSergey Zigachev /* BPM SERDES CMD */
82b843c749SSergey Zigachev #define SET_BPM_SERDES_CMD 1
83b843c749SSergey Zigachev #define CLE_BPM_SERDES_CMD 0
84b843c749SSergey Zigachev
85b843c749SSergey Zigachev /* BPM Register Address*/
86b843c749SSergey Zigachev enum {
87b843c749SSergey Zigachev BPM_REG_CGLS_EN = 0, /* Enable/Disable CGLS */
88b843c749SSergey Zigachev BPM_REG_CGLS_ON, /* ON/OFF CGLS: shall be controlled by RLC FW */
89b843c749SSergey Zigachev BPM_REG_CGCG_OVERRIDE, /* Set/Clear CGCG Override */
90b843c749SSergey Zigachev BPM_REG_MGCG_OVERRIDE, /* Set/Clear MGCG Override */
91b843c749SSergey Zigachev BPM_REG_FGCG_OVERRIDE, /* Set/Clear FGCG Override */
92b843c749SSergey Zigachev BPM_REG_FGCG_MAX
93b843c749SSergey Zigachev };
94b843c749SSergey Zigachev
95b843c749SSergey Zigachev #define RLC_FormatDirectRegListLength 14
96b843c749SSergey Zigachev
97*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_ce");
98*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_pfp");
99*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_me");
100*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_mec");
101*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_mec2");
102*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_carrizo_rlc");
103b843c749SSergey Zigachev
104*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_stoney_ce");
105*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_stoney_pfp");
106*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_stoney_me");
107*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_stoney_mec");
108*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_stoney_rlc");
109b843c749SSergey Zigachev
110*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_ce");
111*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_pfp");
112*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_me");
113*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_mec");
114*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_mec2");
115*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_tonga_rlc");
116b843c749SSergey Zigachev
117*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_topaz_ce");
118*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_topaz_pfp");
119*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_topaz_me");
120*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_topaz_mec");
121*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_topaz_rlc");
122b843c749SSergey Zigachev
123*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_ce");
124*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_pfp");
125*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_me");
126*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_mec");
127*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_mec2");
128*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_fiji_rlc");
129b843c749SSergey Zigachev
130*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_ce");
131*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_ce_2");
132*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_pfp");
133*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_pfp_2");
134*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_me");
135*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_me_2");
136*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_mec");
137*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_mec_2");
138*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_mec2");
139*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_mec2_2");
140*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris10_rlc");
141b843c749SSergey Zigachev
142*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_ce");
143*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_ce_2");
144*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_pfp");
145*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_pfp_2");
146*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_me");
147*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_me_2");
148*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_mec");
149*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_mec_2");
150*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_mec2");
151*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_mec2_2");
152*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris11_rlc");
153b843c749SSergey Zigachev
154*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_ce");
155*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_ce_2");
156*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_pfp");
157*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_pfp_2");
158*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_me");
159*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_me_2");
160*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_mec");
161*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_mec_2");
162*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_mec2");
163*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_mec2_2");
164*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_polaris12_rlc");
165b843c749SSergey Zigachev
166*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_ce");
167*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_pfp");
168*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_me");
169*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_mec");
170*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_mec2");
171*809f3802SSergey Zigachev MODULE_FIRMWARE("amdgpufw_vegam_rlc");
172b843c749SSergey Zigachev
173b843c749SSergey Zigachev static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] =
174b843c749SSergey Zigachev {
175b843c749SSergey Zigachev {mmGDS_VMID0_BASE, mmGDS_VMID0_SIZE, mmGDS_GWS_VMID0, mmGDS_OA_VMID0},
176b843c749SSergey Zigachev {mmGDS_VMID1_BASE, mmGDS_VMID1_SIZE, mmGDS_GWS_VMID1, mmGDS_OA_VMID1},
177b843c749SSergey Zigachev {mmGDS_VMID2_BASE, mmGDS_VMID2_SIZE, mmGDS_GWS_VMID2, mmGDS_OA_VMID2},
178b843c749SSergey Zigachev {mmGDS_VMID3_BASE, mmGDS_VMID3_SIZE, mmGDS_GWS_VMID3, mmGDS_OA_VMID3},
179b843c749SSergey Zigachev {mmGDS_VMID4_BASE, mmGDS_VMID4_SIZE, mmGDS_GWS_VMID4, mmGDS_OA_VMID4},
180b843c749SSergey Zigachev {mmGDS_VMID5_BASE, mmGDS_VMID5_SIZE, mmGDS_GWS_VMID5, mmGDS_OA_VMID5},
181b843c749SSergey Zigachev {mmGDS_VMID6_BASE, mmGDS_VMID6_SIZE, mmGDS_GWS_VMID6, mmGDS_OA_VMID6},
182b843c749SSergey Zigachev {mmGDS_VMID7_BASE, mmGDS_VMID7_SIZE, mmGDS_GWS_VMID7, mmGDS_OA_VMID7},
183b843c749SSergey Zigachev {mmGDS_VMID8_BASE, mmGDS_VMID8_SIZE, mmGDS_GWS_VMID8, mmGDS_OA_VMID8},
184b843c749SSergey Zigachev {mmGDS_VMID9_BASE, mmGDS_VMID9_SIZE, mmGDS_GWS_VMID9, mmGDS_OA_VMID9},
185b843c749SSergey Zigachev {mmGDS_VMID10_BASE, mmGDS_VMID10_SIZE, mmGDS_GWS_VMID10, mmGDS_OA_VMID10},
186b843c749SSergey Zigachev {mmGDS_VMID11_BASE, mmGDS_VMID11_SIZE, mmGDS_GWS_VMID11, mmGDS_OA_VMID11},
187b843c749SSergey Zigachev {mmGDS_VMID12_BASE, mmGDS_VMID12_SIZE, mmGDS_GWS_VMID12, mmGDS_OA_VMID12},
188b843c749SSergey Zigachev {mmGDS_VMID13_BASE, mmGDS_VMID13_SIZE, mmGDS_GWS_VMID13, mmGDS_OA_VMID13},
189b843c749SSergey Zigachev {mmGDS_VMID14_BASE, mmGDS_VMID14_SIZE, mmGDS_GWS_VMID14, mmGDS_OA_VMID14},
190b843c749SSergey Zigachev {mmGDS_VMID15_BASE, mmGDS_VMID15_SIZE, mmGDS_GWS_VMID15, mmGDS_OA_VMID15}
191b843c749SSergey Zigachev };
192b843c749SSergey Zigachev
193b843c749SSergey Zigachev static const u32 golden_settings_tonga_a11[] =
194b843c749SSergey Zigachev {
195b843c749SSergey Zigachev mmCB_HW_CONTROL, 0xfffdf3cf, 0x00007208,
196b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x00000040, 0x00000040,
197b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
198b843c749SSergey Zigachev mmGB_GPU_ID, 0x0000000f, 0x00000000,
199b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
200b843c749SSergey Zigachev mmPA_SC_FIFO_DEPTH_CNTL, 0x000003ff, 0x000000fc,
201b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
202b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0000003c,
203b843c749SSergey Zigachev mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
204b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
205b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
206b843c749SSergey Zigachev mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
207b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000002fb,
208b843c749SSergey Zigachev mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
209b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
210b843c749SSergey Zigachev mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
211b843c749SSergey Zigachev };
212b843c749SSergey Zigachev
213b843c749SSergey Zigachev static const u32 tonga_golden_common_all[] =
214b843c749SSergey Zigachev {
215b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
216b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x16000012,
217b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002A,
218b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
219b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
220b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
221b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
222b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF
223b843c749SSergey Zigachev };
224b843c749SSergey Zigachev
225b843c749SSergey Zigachev static const u32 tonga_mgcg_cgcg_init[] =
226b843c749SSergey Zigachev {
227b843c749SSergey Zigachev mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
228b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
229b843c749SSergey Zigachev mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
230b843c749SSergey Zigachev mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
231b843c749SSergey Zigachev mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
232b843c749SSergey Zigachev mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100,
233b843c749SSergey Zigachev mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100,
234b843c749SSergey Zigachev mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
235b843c749SSergey Zigachev mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
236b843c749SSergey Zigachev mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
237b843c749SSergey Zigachev mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100,
238b843c749SSergey Zigachev mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
239b843c749SSergey Zigachev mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
240b843c749SSergey Zigachev mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
241b843c749SSergey Zigachev mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
242b843c749SSergey Zigachev mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
243b843c749SSergey Zigachev mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
244b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
245b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
246b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
247b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
248b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100,
249b843c749SSergey Zigachev mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
250b843c749SSergey Zigachev mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
251b843c749SSergey Zigachev mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
252b843c749SSergey Zigachev mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
253b843c749SSergey Zigachev mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
254b843c749SSergey Zigachev mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
255b843c749SSergey Zigachev mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
256b843c749SSergey Zigachev mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
257b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
258b843c749SSergey Zigachev mmCGTS_CU0_SP0_CTRL_REG, 0xffffffff, 0x00010000,
259b843c749SSergey Zigachev mmCGTS_CU0_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
260b843c749SSergey Zigachev mmCGTS_CU0_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
261b843c749SSergey Zigachev mmCGTS_CU0_SP1_CTRL_REG, 0xffffffff, 0x00060005,
262b843c749SSergey Zigachev mmCGTS_CU0_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
263b843c749SSergey Zigachev mmCGTS_CU1_SP0_CTRL_REG, 0xffffffff, 0x00010000,
264b843c749SSergey Zigachev mmCGTS_CU1_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
265b843c749SSergey Zigachev mmCGTS_CU1_TA_CTRL_REG, 0xffffffff, 0x00040007,
266b843c749SSergey Zigachev mmCGTS_CU1_SP1_CTRL_REG, 0xffffffff, 0x00060005,
267b843c749SSergey Zigachev mmCGTS_CU1_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
268b843c749SSergey Zigachev mmCGTS_CU2_SP0_CTRL_REG, 0xffffffff, 0x00010000,
269b843c749SSergey Zigachev mmCGTS_CU2_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
270b843c749SSergey Zigachev mmCGTS_CU2_TA_CTRL_REG, 0xffffffff, 0x00040007,
271b843c749SSergey Zigachev mmCGTS_CU2_SP1_CTRL_REG, 0xffffffff, 0x00060005,
272b843c749SSergey Zigachev mmCGTS_CU2_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
273b843c749SSergey Zigachev mmCGTS_CU3_SP0_CTRL_REG, 0xffffffff, 0x00010000,
274b843c749SSergey Zigachev mmCGTS_CU3_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
275b843c749SSergey Zigachev mmCGTS_CU3_TA_CTRL_REG, 0xffffffff, 0x00040007,
276b843c749SSergey Zigachev mmCGTS_CU3_SP1_CTRL_REG, 0xffffffff, 0x00060005,
277b843c749SSergey Zigachev mmCGTS_CU3_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
278b843c749SSergey Zigachev mmCGTS_CU4_SP0_CTRL_REG, 0xffffffff, 0x00010000,
279b843c749SSergey Zigachev mmCGTS_CU4_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
280b843c749SSergey Zigachev mmCGTS_CU4_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
281b843c749SSergey Zigachev mmCGTS_CU4_SP1_CTRL_REG, 0xffffffff, 0x00060005,
282b843c749SSergey Zigachev mmCGTS_CU4_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
283b843c749SSergey Zigachev mmCGTS_CU5_SP0_CTRL_REG, 0xffffffff, 0x00010000,
284b843c749SSergey Zigachev mmCGTS_CU5_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
285b843c749SSergey Zigachev mmCGTS_CU5_TA_CTRL_REG, 0xffffffff, 0x00040007,
286b843c749SSergey Zigachev mmCGTS_CU5_SP1_CTRL_REG, 0xffffffff, 0x00060005,
287b843c749SSergey Zigachev mmCGTS_CU5_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
288b843c749SSergey Zigachev mmCGTS_CU6_SP0_CTRL_REG, 0xffffffff, 0x00010000,
289b843c749SSergey Zigachev mmCGTS_CU6_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
290b843c749SSergey Zigachev mmCGTS_CU6_TA_CTRL_REG, 0xffffffff, 0x00040007,
291b843c749SSergey Zigachev mmCGTS_CU6_SP1_CTRL_REG, 0xffffffff, 0x00060005,
292b843c749SSergey Zigachev mmCGTS_CU6_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
293b843c749SSergey Zigachev mmCGTS_CU7_SP0_CTRL_REG, 0xffffffff, 0x00010000,
294b843c749SSergey Zigachev mmCGTS_CU7_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
295b843c749SSergey Zigachev mmCGTS_CU7_TA_CTRL_REG, 0xffffffff, 0x00040007,
296b843c749SSergey Zigachev mmCGTS_CU7_SP1_CTRL_REG, 0xffffffff, 0x00060005,
297b843c749SSergey Zigachev mmCGTS_CU7_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
298b843c749SSergey Zigachev mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
299b843c749SSergey Zigachev mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
300b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c,
301b843c749SSergey Zigachev mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
302b843c749SSergey Zigachev };
303b843c749SSergey Zigachev
304b843c749SSergey Zigachev static const u32 golden_settings_vegam_a11[] =
305b843c749SSergey Zigachev {
306b843c749SSergey Zigachev mmCB_HW_CONTROL, 0x0001f3cf, 0x00007208,
307b843c749SSergey Zigachev mmCB_HW_CONTROL_2, 0x0f000000, 0x0d000000,
308b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
309b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
310b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
311b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
312b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0x3f3fffff, 0x3a00161a,
313b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0x0000003f, 0x0000002e,
314b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
315b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL_3D, 0xffffffff, 0x0001003c,
316b843c749SSergey Zigachev mmSQ_CONFIG, 0x07f80000, 0x01180000,
317b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
318b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
319b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
320b843c749SSergey Zigachev mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
321b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
322b843c749SSergey Zigachev mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
323b843c749SSergey Zigachev };
324b843c749SSergey Zigachev
325b843c749SSergey Zigachev static const u32 vegam_golden_common_all[] =
326b843c749SSergey Zigachev {
327b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
328b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
329b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
330b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
331b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
332b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF,
333b843c749SSergey Zigachev };
334b843c749SSergey Zigachev
335b843c749SSergey Zigachev static const u32 golden_settings_polaris11_a11[] =
336b843c749SSergey Zigachev {
337b843c749SSergey Zigachev mmCB_HW_CONTROL, 0x0000f3cf, 0x00007208,
338b843c749SSergey Zigachev mmCB_HW_CONTROL_2, 0x0f000000, 0x0f000000,
339b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
340b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
341b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
342b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
343b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0x3f3fffff, 0x16000012,
344b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0x0000003f, 0x00000000,
345b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
346b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL_3D, 0xffffffff, 0x0001003c,
347b843c749SSergey Zigachev mmSQ_CONFIG, 0x07f80000, 0x01180000,
348b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
349b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
350b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
351b843c749SSergey Zigachev mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
352b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
353b843c749SSergey Zigachev mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
354b843c749SSergey Zigachev };
355b843c749SSergey Zigachev
356b843c749SSergey Zigachev static const u32 polaris11_golden_common_all[] =
357b843c749SSergey Zigachev {
358b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
359b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22011002,
360b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
361b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
362b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
363b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF,
364b843c749SSergey Zigachev };
365b843c749SSergey Zigachev
366b843c749SSergey Zigachev static const u32 golden_settings_polaris10_a11[] =
367b843c749SSergey Zigachev {
368b843c749SSergey Zigachev mmATC_MISC_CG, 0x000c0fc0, 0x000c0200,
369b843c749SSergey Zigachev mmCB_HW_CONTROL, 0x0001f3cf, 0x00007208,
370b843c749SSergey Zigachev mmCB_HW_CONTROL_2, 0x0f000000, 0x0f000000,
371b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
372b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
373b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
374b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
375b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0x3f3fffff, 0x16000012,
376b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0x0000003f, 0x0000002a,
377b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
378b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL_3D, 0xffffffff, 0x0001003c,
379b843c749SSergey Zigachev mmSQ_CONFIG, 0x07f80000, 0x07180000,
380b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
381b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
382b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
383b843c749SSergey Zigachev mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
384b843c749SSergey Zigachev mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
385b843c749SSergey Zigachev };
386b843c749SSergey Zigachev
387b843c749SSergey Zigachev static const u32 polaris10_golden_common_all[] =
388b843c749SSergey Zigachev {
389b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
390b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x16000012,
391b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002A,
392b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
393b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
394b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
395b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
396b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF,
397b843c749SSergey Zigachev };
398b843c749SSergey Zigachev
399b843c749SSergey Zigachev static const u32 fiji_golden_common_all[] =
400b843c749SSergey Zigachev {
401b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
402b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x3a00161a,
403b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002e,
404b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
405b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
406b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
407b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
408b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF,
409b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
410b843c749SSergey Zigachev mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x00000009,
411b843c749SSergey Zigachev };
412b843c749SSergey Zigachev
413b843c749SSergey Zigachev static const u32 golden_settings_fiji_a10[] =
414b843c749SSergey Zigachev {
415b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
416b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
417b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
418b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
419b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
420b843c749SSergey Zigachev mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
421b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
422b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
423b843c749SSergey Zigachev mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
424b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000ff,
425b843c749SSergey Zigachev mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
426b843c749SSergey Zigachev };
427b843c749SSergey Zigachev
428b843c749SSergey Zigachev static const u32 fiji_mgcg_cgcg_init[] =
429b843c749SSergey Zigachev {
430b843c749SSergey Zigachev mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
431b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
432b843c749SSergey Zigachev mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
433b843c749SSergey Zigachev mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
434b843c749SSergey Zigachev mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
435b843c749SSergey Zigachev mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100,
436b843c749SSergey Zigachev mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100,
437b843c749SSergey Zigachev mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
438b843c749SSergey Zigachev mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
439b843c749SSergey Zigachev mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
440b843c749SSergey Zigachev mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100,
441b843c749SSergey Zigachev mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
442b843c749SSergey Zigachev mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
443b843c749SSergey Zigachev mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
444b843c749SSergey Zigachev mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
445b843c749SSergey Zigachev mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
446b843c749SSergey Zigachev mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
447b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
448b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
449b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
450b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
451b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100,
452b843c749SSergey Zigachev mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
453b843c749SSergey Zigachev mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
454b843c749SSergey Zigachev mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
455b843c749SSergey Zigachev mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
456b843c749SSergey Zigachev mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
457b843c749SSergey Zigachev mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
458b843c749SSergey Zigachev mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
459b843c749SSergey Zigachev mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
460b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
461b843c749SSergey Zigachev mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
462b843c749SSergey Zigachev mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
463b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c,
464b843c749SSergey Zigachev mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
465b843c749SSergey Zigachev };
466b843c749SSergey Zigachev
467b843c749SSergey Zigachev static const u32 golden_settings_iceland_a11[] =
468b843c749SSergey Zigachev {
469b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x00000040, 0x00000040,
470b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
471b843c749SSergey Zigachev mmDB_DEBUG3, 0xc0000000, 0xc0000000,
472b843c749SSergey Zigachev mmGB_GPU_ID, 0x0000000f, 0x00000000,
473b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
474b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
475b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0x3f3fffff, 0x00000002,
476b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0x0000003f, 0x00000000,
477b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0000003c,
478b843c749SSergey Zigachev mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
479b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
480b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
481b843c749SSergey Zigachev mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
482b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
483b843c749SSergey Zigachev mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
484b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00000010,
485b843c749SSergey Zigachev };
486b843c749SSergey Zigachev
487b843c749SSergey Zigachev static const u32 iceland_golden_common_all[] =
488b843c749SSergey Zigachev {
489b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
490b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x00000002,
491b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x00000000,
492b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22010001,
493b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
494b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
495b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
496b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF
497b843c749SSergey Zigachev };
498b843c749SSergey Zigachev
499b843c749SSergey Zigachev static const u32 iceland_mgcg_cgcg_init[] =
500b843c749SSergey Zigachev {
501b843c749SSergey Zigachev mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
502b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
503b843c749SSergey Zigachev mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
504b843c749SSergey Zigachev mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
505b843c749SSergey Zigachev mmCGTT_CP_CLK_CTRL, 0xffffffff, 0xc0000100,
506b843c749SSergey Zigachev mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0xc0000100,
507b843c749SSergey Zigachev mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0xc0000100,
508b843c749SSergey Zigachev mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
509b843c749SSergey Zigachev mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
510b843c749SSergey Zigachev mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
511b843c749SSergey Zigachev mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100,
512b843c749SSergey Zigachev mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
513b843c749SSergey Zigachev mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
514b843c749SSergey Zigachev mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
515b843c749SSergey Zigachev mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
516b843c749SSergey Zigachev mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
517b843c749SSergey Zigachev mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
518b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
519b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
520b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
521b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
522b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100,
523b843c749SSergey Zigachev mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0xff000100,
524b843c749SSergey Zigachev mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
525b843c749SSergey Zigachev mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
526b843c749SSergey Zigachev mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
527b843c749SSergey Zigachev mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
528b843c749SSergey Zigachev mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
529b843c749SSergey Zigachev mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
530b843c749SSergey Zigachev mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
531b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
532b843c749SSergey Zigachev mmCGTS_CU0_SP0_CTRL_REG, 0xffffffff, 0x00010000,
533b843c749SSergey Zigachev mmCGTS_CU0_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
534b843c749SSergey Zigachev mmCGTS_CU0_TA_SQC_CTRL_REG, 0xffffffff, 0x0f840f87,
535b843c749SSergey Zigachev mmCGTS_CU0_SP1_CTRL_REG, 0xffffffff, 0x00060005,
536b843c749SSergey Zigachev mmCGTS_CU0_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
537b843c749SSergey Zigachev mmCGTS_CU1_SP0_CTRL_REG, 0xffffffff, 0x00010000,
538b843c749SSergey Zigachev mmCGTS_CU1_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
539b843c749SSergey Zigachev mmCGTS_CU1_TA_CTRL_REG, 0xffffffff, 0x00040007,
540b843c749SSergey Zigachev mmCGTS_CU1_SP1_CTRL_REG, 0xffffffff, 0x00060005,
541b843c749SSergey Zigachev mmCGTS_CU1_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
542b843c749SSergey Zigachev mmCGTS_CU2_SP0_CTRL_REG, 0xffffffff, 0x00010000,
543b843c749SSergey Zigachev mmCGTS_CU2_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
544b843c749SSergey Zigachev mmCGTS_CU2_TA_CTRL_REG, 0xffffffff, 0x00040007,
545b843c749SSergey Zigachev mmCGTS_CU2_SP1_CTRL_REG, 0xffffffff, 0x00060005,
546b843c749SSergey Zigachev mmCGTS_CU2_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
547b843c749SSergey Zigachev mmCGTS_CU3_SP0_CTRL_REG, 0xffffffff, 0x00010000,
548b843c749SSergey Zigachev mmCGTS_CU3_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
549b843c749SSergey Zigachev mmCGTS_CU3_TA_CTRL_REG, 0xffffffff, 0x00040007,
550b843c749SSergey Zigachev mmCGTS_CU3_SP1_CTRL_REG, 0xffffffff, 0x00060005,
551b843c749SSergey Zigachev mmCGTS_CU3_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
552b843c749SSergey Zigachev mmCGTS_CU4_SP0_CTRL_REG, 0xffffffff, 0x00010000,
553b843c749SSergey Zigachev mmCGTS_CU4_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
554b843c749SSergey Zigachev mmCGTS_CU4_TA_SQC_CTRL_REG, 0xffffffff, 0x0f840f87,
555b843c749SSergey Zigachev mmCGTS_CU4_SP1_CTRL_REG, 0xffffffff, 0x00060005,
556b843c749SSergey Zigachev mmCGTS_CU4_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
557b843c749SSergey Zigachev mmCGTS_CU5_SP0_CTRL_REG, 0xffffffff, 0x00010000,
558b843c749SSergey Zigachev mmCGTS_CU5_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
559b843c749SSergey Zigachev mmCGTS_CU5_TA_CTRL_REG, 0xffffffff, 0x00040007,
560b843c749SSergey Zigachev mmCGTS_CU5_SP1_CTRL_REG, 0xffffffff, 0x00060005,
561b843c749SSergey Zigachev mmCGTS_CU5_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
562b843c749SSergey Zigachev mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
563b843c749SSergey Zigachev mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
564b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c,
565b843c749SSergey Zigachev };
566b843c749SSergey Zigachev
567b843c749SSergey Zigachev static const u32 cz_golden_settings_a11[] =
568b843c749SSergey Zigachev {
569b843c749SSergey Zigachev mmCB_HW_CONTROL_3, 0x00000040, 0x00000040,
570b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
571b843c749SSergey Zigachev mmGB_GPU_ID, 0x0000000f, 0x00000000,
572b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x00000001,
573b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
574b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0000003c,
575b843c749SSergey Zigachev mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
576b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x00010000,
577b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
578b843c749SSergey Zigachev mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
579b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x0000000f, 0x000000f3,
580b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001302
581b843c749SSergey Zigachev };
582b843c749SSergey Zigachev
583b843c749SSergey Zigachev static const u32 cz_golden_common_all[] =
584b843c749SSergey Zigachev {
585b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
586b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x00000002,
587b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x00000000,
588b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x22010001,
589b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
590b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
591b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
592b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF
593b843c749SSergey Zigachev };
594b843c749SSergey Zigachev
595b843c749SSergey Zigachev static const u32 cz_mgcg_cgcg_init[] =
596b843c749SSergey Zigachev {
597b843c749SSergey Zigachev mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
598b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
599b843c749SSergey Zigachev mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
600b843c749SSergey Zigachev mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
601b843c749SSergey Zigachev mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
602b843c749SSergey Zigachev mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100,
603b843c749SSergey Zigachev mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x00000100,
604b843c749SSergey Zigachev mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
605b843c749SSergey Zigachev mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
606b843c749SSergey Zigachev mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
607b843c749SSergey Zigachev mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100,
608b843c749SSergey Zigachev mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
609b843c749SSergey Zigachev mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
610b843c749SSergey Zigachev mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
611b843c749SSergey Zigachev mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
612b843c749SSergey Zigachev mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
613b843c749SSergey Zigachev mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
614b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
615b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
616b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
617b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
618b843c749SSergey Zigachev mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100,
619b843c749SSergey Zigachev mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
620b843c749SSergey Zigachev mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
621b843c749SSergey Zigachev mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
622b843c749SSergey Zigachev mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
623b843c749SSergey Zigachev mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
624b843c749SSergey Zigachev mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
625b843c749SSergey Zigachev mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
626b843c749SSergey Zigachev mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
627b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
628b843c749SSergey Zigachev mmCGTS_CU0_SP0_CTRL_REG, 0xffffffff, 0x00010000,
629b843c749SSergey Zigachev mmCGTS_CU0_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
630b843c749SSergey Zigachev mmCGTS_CU0_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
631b843c749SSergey Zigachev mmCGTS_CU0_SP1_CTRL_REG, 0xffffffff, 0x00060005,
632b843c749SSergey Zigachev mmCGTS_CU0_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
633b843c749SSergey Zigachev mmCGTS_CU1_SP0_CTRL_REG, 0xffffffff, 0x00010000,
634b843c749SSergey Zigachev mmCGTS_CU1_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
635b843c749SSergey Zigachev mmCGTS_CU1_TA_CTRL_REG, 0xffffffff, 0x00040007,
636b843c749SSergey Zigachev mmCGTS_CU1_SP1_CTRL_REG, 0xffffffff, 0x00060005,
637b843c749SSergey Zigachev mmCGTS_CU1_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
638b843c749SSergey Zigachev mmCGTS_CU2_SP0_CTRL_REG, 0xffffffff, 0x00010000,
639b843c749SSergey Zigachev mmCGTS_CU2_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
640b843c749SSergey Zigachev mmCGTS_CU2_TA_CTRL_REG, 0xffffffff, 0x00040007,
641b843c749SSergey Zigachev mmCGTS_CU2_SP1_CTRL_REG, 0xffffffff, 0x00060005,
642b843c749SSergey Zigachev mmCGTS_CU2_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
643b843c749SSergey Zigachev mmCGTS_CU3_SP0_CTRL_REG, 0xffffffff, 0x00010000,
644b843c749SSergey Zigachev mmCGTS_CU3_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
645b843c749SSergey Zigachev mmCGTS_CU3_TA_CTRL_REG, 0xffffffff, 0x00040007,
646b843c749SSergey Zigachev mmCGTS_CU3_SP1_CTRL_REG, 0xffffffff, 0x00060005,
647b843c749SSergey Zigachev mmCGTS_CU3_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
648b843c749SSergey Zigachev mmCGTS_CU4_SP0_CTRL_REG, 0xffffffff, 0x00010000,
649b843c749SSergey Zigachev mmCGTS_CU4_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
650b843c749SSergey Zigachev mmCGTS_CU4_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
651b843c749SSergey Zigachev mmCGTS_CU4_SP1_CTRL_REG, 0xffffffff, 0x00060005,
652b843c749SSergey Zigachev mmCGTS_CU4_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
653b843c749SSergey Zigachev mmCGTS_CU5_SP0_CTRL_REG, 0xffffffff, 0x00010000,
654b843c749SSergey Zigachev mmCGTS_CU5_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
655b843c749SSergey Zigachev mmCGTS_CU5_TA_CTRL_REG, 0xffffffff, 0x00040007,
656b843c749SSergey Zigachev mmCGTS_CU5_SP1_CTRL_REG, 0xffffffff, 0x00060005,
657b843c749SSergey Zigachev mmCGTS_CU5_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
658b843c749SSergey Zigachev mmCGTS_CU6_SP0_CTRL_REG, 0xffffffff, 0x00010000,
659b843c749SSergey Zigachev mmCGTS_CU6_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
660b843c749SSergey Zigachev mmCGTS_CU6_TA_CTRL_REG, 0xffffffff, 0x00040007,
661b843c749SSergey Zigachev mmCGTS_CU6_SP1_CTRL_REG, 0xffffffff, 0x00060005,
662b843c749SSergey Zigachev mmCGTS_CU6_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
663b843c749SSergey Zigachev mmCGTS_CU7_SP0_CTRL_REG, 0xffffffff, 0x00010000,
664b843c749SSergey Zigachev mmCGTS_CU7_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
665b843c749SSergey Zigachev mmCGTS_CU7_TA_CTRL_REG, 0xffffffff, 0x00040007,
666b843c749SSergey Zigachev mmCGTS_CU7_SP1_CTRL_REG, 0xffffffff, 0x00060005,
667b843c749SSergey Zigachev mmCGTS_CU7_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
668b843c749SSergey Zigachev mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
669b843c749SSergey Zigachev mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
670b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
671b843c749SSergey Zigachev mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
672b843c749SSergey Zigachev };
673b843c749SSergey Zigachev
674b843c749SSergey Zigachev static const u32 stoney_golden_settings_a11[] =
675b843c749SSergey Zigachev {
676b843c749SSergey Zigachev mmDB_DEBUG2, 0xf00fffff, 0x00000400,
677b843c749SSergey Zigachev mmGB_GPU_ID, 0x0000000f, 0x00000000,
678b843c749SSergey Zigachev mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
679b843c749SSergey Zigachev mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
680b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
681b843c749SSergey Zigachev mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
682b843c749SSergey Zigachev mmTCC_CTRL, 0x00100000, 0xf31fff7f,
683b843c749SSergey Zigachev mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
684b843c749SSergey Zigachev mmTCP_ADDR_CONFIG, 0x0000000f, 0x000000f1,
685b843c749SSergey Zigachev mmTCP_CHAN_STEER_LO, 0xffffffff, 0x10101010,
686b843c749SSergey Zigachev };
687b843c749SSergey Zigachev
688b843c749SSergey Zigachev static const u32 stoney_golden_common_all[] =
689b843c749SSergey Zigachev {
690b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
691b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x00000000,
692b843c749SSergey Zigachev mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x00000000,
693b843c749SSergey Zigachev mmGB_ADDR_CONFIG, 0xffffffff, 0x12010001,
694b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
695b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
696b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00FF7FBF,
697b843c749SSergey Zigachev mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00FF7FAF,
698b843c749SSergey Zigachev };
699b843c749SSergey Zigachev
700b843c749SSergey Zigachev static const u32 stoney_mgcg_cgcg_init[] =
701b843c749SSergey Zigachev {
702b843c749SSergey Zigachev mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
703b843c749SSergey Zigachev mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
704b843c749SSergey Zigachev mmCP_MEM_SLP_CNTL, 0xffffffff, 0x00020201,
705b843c749SSergey Zigachev mmRLC_MEM_SLP_CNTL, 0xffffffff, 0x00020201,
706b843c749SSergey Zigachev mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
707b843c749SSergey Zigachev };
708b843c749SSergey Zigachev
709b843c749SSergey Zigachev
710b843c749SSergey Zigachev static const char * const sq_edc_source_names[] = {
711b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_INVALID: No EDC error has occurred",
712b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_INST: EDC source is Instruction Fetch",
713b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_SGPR: EDC source is SGPR or SQC data return",
714b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_VGPR: EDC source is VGPR",
715b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_LDS: EDC source is LDS",
716b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_GDS: EDC source is GDS",
717b843c749SSergey Zigachev "SQ_EDC_INFO_SOURCE_TA: EDC source is TA",
718b843c749SSergey Zigachev };
719b843c749SSergey Zigachev
720b843c749SSergey Zigachev static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev);
721b843c749SSergey Zigachev static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev);
722b843c749SSergey Zigachev static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev);
723b843c749SSergey Zigachev static void gfx_v8_0_set_rlc_funcs(struct amdgpu_device *adev);
724b843c749SSergey Zigachev static u32 gfx_v8_0_get_csb_size(struct amdgpu_device *adev);
725b843c749SSergey Zigachev static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev);
726b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_ce_meta(struct amdgpu_ring *ring);
727b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_de_meta(struct amdgpu_ring *ring);
728b843c749SSergey Zigachev
gfx_v8_0_init_golden_registers(struct amdgpu_device * adev)729b843c749SSergey Zigachev static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
730b843c749SSergey Zigachev {
731b843c749SSergey Zigachev switch (adev->asic_type) {
732b843c749SSergey Zigachev case CHIP_TOPAZ:
733b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
734b843c749SSergey Zigachev iceland_mgcg_cgcg_init,
735b843c749SSergey Zigachev ARRAY_SIZE(iceland_mgcg_cgcg_init));
736b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
737b843c749SSergey Zigachev golden_settings_iceland_a11,
738b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_iceland_a11));
739b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
740b843c749SSergey Zigachev iceland_golden_common_all,
741b843c749SSergey Zigachev ARRAY_SIZE(iceland_golden_common_all));
742b843c749SSergey Zigachev break;
743b843c749SSergey Zigachev case CHIP_FIJI:
744b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
745b843c749SSergey Zigachev fiji_mgcg_cgcg_init,
746b843c749SSergey Zigachev ARRAY_SIZE(fiji_mgcg_cgcg_init));
747b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
748b843c749SSergey Zigachev golden_settings_fiji_a10,
749b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_fiji_a10));
750b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
751b843c749SSergey Zigachev fiji_golden_common_all,
752b843c749SSergey Zigachev ARRAY_SIZE(fiji_golden_common_all));
753b843c749SSergey Zigachev break;
754b843c749SSergey Zigachev
755b843c749SSergey Zigachev case CHIP_TONGA:
756b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
757b843c749SSergey Zigachev tonga_mgcg_cgcg_init,
758b843c749SSergey Zigachev ARRAY_SIZE(tonga_mgcg_cgcg_init));
759b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
760b843c749SSergey Zigachev golden_settings_tonga_a11,
761b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_tonga_a11));
762b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
763b843c749SSergey Zigachev tonga_golden_common_all,
764b843c749SSergey Zigachev ARRAY_SIZE(tonga_golden_common_all));
765b843c749SSergey Zigachev break;
766b843c749SSergey Zigachev case CHIP_VEGAM:
767b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
768b843c749SSergey Zigachev golden_settings_vegam_a11,
769b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_vegam_a11));
770b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
771b843c749SSergey Zigachev vegam_golden_common_all,
772b843c749SSergey Zigachev ARRAY_SIZE(vegam_golden_common_all));
773b843c749SSergey Zigachev break;
774b843c749SSergey Zigachev case CHIP_POLARIS11:
775b843c749SSergey Zigachev case CHIP_POLARIS12:
776b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
777b843c749SSergey Zigachev golden_settings_polaris11_a11,
778b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_polaris11_a11));
779b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
780b843c749SSergey Zigachev polaris11_golden_common_all,
781b843c749SSergey Zigachev ARRAY_SIZE(polaris11_golden_common_all));
782b843c749SSergey Zigachev break;
783b843c749SSergey Zigachev case CHIP_POLARIS10:
784b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
785b843c749SSergey Zigachev golden_settings_polaris10_a11,
786b843c749SSergey Zigachev ARRAY_SIZE(golden_settings_polaris10_a11));
787b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
788b843c749SSergey Zigachev polaris10_golden_common_all,
789b843c749SSergey Zigachev ARRAY_SIZE(polaris10_golden_common_all));
790b843c749SSergey Zigachev WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C);
791b843c749SSergey Zigachev if (adev->pdev->revision == 0xc7 &&
792b843c749SSergey Zigachev ((adev->pdev->subsystem_device == 0xb37 && adev->pdev->subsystem_vendor == 0x1002) ||
793b843c749SSergey Zigachev (adev->pdev->subsystem_device == 0x4a8 && adev->pdev->subsystem_vendor == 0x1043) ||
794b843c749SSergey Zigachev (adev->pdev->subsystem_device == 0x9480 && adev->pdev->subsystem_vendor == 0x1682))) {
795b843c749SSergey Zigachev amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1E, 0xDD);
796b843c749SSergey Zigachev amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1F, 0xD0);
797b843c749SSergey Zigachev }
798b843c749SSergey Zigachev break;
799b843c749SSergey Zigachev case CHIP_CARRIZO:
800b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
801b843c749SSergey Zigachev cz_mgcg_cgcg_init,
802b843c749SSergey Zigachev ARRAY_SIZE(cz_mgcg_cgcg_init));
803b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
804b843c749SSergey Zigachev cz_golden_settings_a11,
805b843c749SSergey Zigachev ARRAY_SIZE(cz_golden_settings_a11));
806b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
807b843c749SSergey Zigachev cz_golden_common_all,
808b843c749SSergey Zigachev ARRAY_SIZE(cz_golden_common_all));
809b843c749SSergey Zigachev break;
810b843c749SSergey Zigachev case CHIP_STONEY:
811b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
812b843c749SSergey Zigachev stoney_mgcg_cgcg_init,
813b843c749SSergey Zigachev ARRAY_SIZE(stoney_mgcg_cgcg_init));
814b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
815b843c749SSergey Zigachev stoney_golden_settings_a11,
816b843c749SSergey Zigachev ARRAY_SIZE(stoney_golden_settings_a11));
817b843c749SSergey Zigachev amdgpu_device_program_register_sequence(adev,
818b843c749SSergey Zigachev stoney_golden_common_all,
819b843c749SSergey Zigachev ARRAY_SIZE(stoney_golden_common_all));
820b843c749SSergey Zigachev break;
821b843c749SSergey Zigachev default:
822b843c749SSergey Zigachev break;
823b843c749SSergey Zigachev }
824b843c749SSergey Zigachev }
825b843c749SSergey Zigachev
gfx_v8_0_scratch_init(struct amdgpu_device * adev)826b843c749SSergey Zigachev static void gfx_v8_0_scratch_init(struct amdgpu_device *adev)
827b843c749SSergey Zigachev {
828b843c749SSergey Zigachev adev->gfx.scratch.num_reg = 8;
829b843c749SSergey Zigachev adev->gfx.scratch.reg_base = mmSCRATCH_REG0;
830b843c749SSergey Zigachev adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1;
831b843c749SSergey Zigachev }
832b843c749SSergey Zigachev
gfx_v8_0_ring_test_ring(struct amdgpu_ring * ring)833b843c749SSergey Zigachev static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
834b843c749SSergey Zigachev {
835b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
836b843c749SSergey Zigachev uint32_t scratch;
837b843c749SSergey Zigachev uint32_t tmp = 0;
838b843c749SSergey Zigachev unsigned i;
839b843c749SSergey Zigachev int r;
840b843c749SSergey Zigachev
841b843c749SSergey Zigachev r = amdgpu_gfx_scratch_get(adev, &scratch);
842b843c749SSergey Zigachev if (r) {
843b843c749SSergey Zigachev DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
844b843c749SSergey Zigachev return r;
845b843c749SSergey Zigachev }
846b843c749SSergey Zigachev WREG32(scratch, 0xCAFEDEAD);
847b843c749SSergey Zigachev r = amdgpu_ring_alloc(ring, 3);
848b843c749SSergey Zigachev if (r) {
849b843c749SSergey Zigachev DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
850b843c749SSergey Zigachev ring->idx, r);
851b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
852b843c749SSergey Zigachev return r;
853b843c749SSergey Zigachev }
854b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
855b843c749SSergey Zigachev amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
856b843c749SSergey Zigachev amdgpu_ring_write(ring, 0xDEADBEEF);
857b843c749SSergey Zigachev amdgpu_ring_commit(ring);
858b843c749SSergey Zigachev
859b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
860b843c749SSergey Zigachev tmp = RREG32(scratch);
861b843c749SSergey Zigachev if (tmp == 0xDEADBEEF)
862b843c749SSergey Zigachev break;
863b843c749SSergey Zigachev DRM_UDELAY(1);
864b843c749SSergey Zigachev }
865b843c749SSergey Zigachev if (i < adev->usec_timeout) {
866b843c749SSergey Zigachev DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
867b843c749SSergey Zigachev ring->idx, i);
868b843c749SSergey Zigachev } else {
869b843c749SSergey Zigachev DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
870b843c749SSergey Zigachev ring->idx, scratch, tmp);
871b843c749SSergey Zigachev r = -EINVAL;
872b843c749SSergey Zigachev }
873b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
874b843c749SSergey Zigachev return r;
875b843c749SSergey Zigachev }
876b843c749SSergey Zigachev
gfx_v8_0_ring_test_ib(struct amdgpu_ring * ring,long timeout)877b843c749SSergey Zigachev static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
878b843c749SSergey Zigachev {
879b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
880b843c749SSergey Zigachev struct amdgpu_ib ib;
881b843c749SSergey Zigachev struct dma_fence *f = NULL;
882b843c749SSergey Zigachev
883b843c749SSergey Zigachev unsigned int index;
884b843c749SSergey Zigachev uint64_t gpu_addr;
885b843c749SSergey Zigachev uint32_t tmp;
886b843c749SSergey Zigachev long r;
887b843c749SSergey Zigachev
888b843c749SSergey Zigachev r = amdgpu_device_wb_get(adev, &index);
889b843c749SSergey Zigachev if (r) {
890b843c749SSergey Zigachev dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
891b843c749SSergey Zigachev return r;
892b843c749SSergey Zigachev }
893b843c749SSergey Zigachev
894b843c749SSergey Zigachev gpu_addr = adev->wb.gpu_addr + (index * 4);
895b843c749SSergey Zigachev adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);
896b843c749SSergey Zigachev memset(&ib, 0, sizeof(ib));
897b843c749SSergey Zigachev r = amdgpu_ib_get(adev, NULL, 16, &ib);
898b843c749SSergey Zigachev if (r) {
899b843c749SSergey Zigachev DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
900b843c749SSergey Zigachev goto err1;
901b843c749SSergey Zigachev }
902b843c749SSergey Zigachev ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);
903b843c749SSergey Zigachev ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
904b843c749SSergey Zigachev ib.ptr[2] = lower_32_bits(gpu_addr);
905b843c749SSergey Zigachev ib.ptr[3] = upper_32_bits(gpu_addr);
906b843c749SSergey Zigachev ib.ptr[4] = 0xDEADBEEF;
907b843c749SSergey Zigachev ib.length_dw = 5;
908b843c749SSergey Zigachev
909b843c749SSergey Zigachev r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
910b843c749SSergey Zigachev if (r)
911b843c749SSergey Zigachev goto err2;
912b843c749SSergey Zigachev
913b843c749SSergey Zigachev r = dma_fence_wait_timeout(f, false, timeout);
914b843c749SSergey Zigachev if (r == 0) {
915b843c749SSergey Zigachev DRM_ERROR("amdgpu: IB test timed out.\n");
916b843c749SSergey Zigachev r = -ETIMEDOUT;
917b843c749SSergey Zigachev goto err2;
918b843c749SSergey Zigachev } else if (r < 0) {
919b843c749SSergey Zigachev DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
920b843c749SSergey Zigachev goto err2;
921b843c749SSergey Zigachev }
922b843c749SSergey Zigachev
923b843c749SSergey Zigachev tmp = adev->wb.wb[index];
924b843c749SSergey Zigachev if (tmp == 0xDEADBEEF) {
925b843c749SSergey Zigachev DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
926b843c749SSergey Zigachev r = 0;
927b843c749SSergey Zigachev } else {
928b843c749SSergey Zigachev DRM_ERROR("ib test on ring %d failed\n", ring->idx);
929b843c749SSergey Zigachev r = -EINVAL;
930b843c749SSergey Zigachev }
931b843c749SSergey Zigachev
932b843c749SSergey Zigachev err2:
933b843c749SSergey Zigachev amdgpu_ib_free(adev, &ib, NULL);
934b843c749SSergey Zigachev dma_fence_put(f);
935b843c749SSergey Zigachev err1:
936b843c749SSergey Zigachev amdgpu_device_wb_free(adev, index);
937b843c749SSergey Zigachev return r;
938b843c749SSergey Zigachev }
939b843c749SSergey Zigachev
940b843c749SSergey Zigachev
gfx_v8_0_free_microcode(struct amdgpu_device * adev)941b843c749SSergey Zigachev static void gfx_v8_0_free_microcode(struct amdgpu_device *adev)
942b843c749SSergey Zigachev {
943b843c749SSergey Zigachev release_firmware(adev->gfx.pfp_fw);
944b843c749SSergey Zigachev adev->gfx.pfp_fw = NULL;
945b843c749SSergey Zigachev release_firmware(adev->gfx.me_fw);
946b843c749SSergey Zigachev adev->gfx.me_fw = NULL;
947b843c749SSergey Zigachev release_firmware(adev->gfx.ce_fw);
948b843c749SSergey Zigachev adev->gfx.ce_fw = NULL;
949b843c749SSergey Zigachev release_firmware(adev->gfx.rlc_fw);
950b843c749SSergey Zigachev adev->gfx.rlc_fw = NULL;
951b843c749SSergey Zigachev release_firmware(adev->gfx.mec_fw);
952b843c749SSergey Zigachev adev->gfx.mec_fw = NULL;
953b843c749SSergey Zigachev if ((adev->asic_type != CHIP_STONEY) &&
954b843c749SSergey Zigachev (adev->asic_type != CHIP_TOPAZ))
955b843c749SSergey Zigachev release_firmware(adev->gfx.mec2_fw);
956b843c749SSergey Zigachev adev->gfx.mec2_fw = NULL;
957b843c749SSergey Zigachev
958b843c749SSergey Zigachev kfree(adev->gfx.rlc.register_list_format);
959b843c749SSergey Zigachev }
960b843c749SSergey Zigachev
gfx_v8_0_init_microcode(struct amdgpu_device * adev)961b843c749SSergey Zigachev static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
962b843c749SSergey Zigachev {
963b843c749SSergey Zigachev const char *chip_name;
964b843c749SSergey Zigachev char fw_name[30];
965b843c749SSergey Zigachev int err;
966b843c749SSergey Zigachev struct amdgpu_firmware_info *info = NULL;
967b843c749SSergey Zigachev const struct common_firmware_header *header = NULL;
968b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *cp_hdr;
969b843c749SSergey Zigachev const struct rlc_firmware_header_v2_0 *rlc_hdr;
970b843c749SSergey Zigachev unsigned int *tmp = NULL, i;
971b843c749SSergey Zigachev
972b843c749SSergey Zigachev DRM_DEBUG("\n");
973b843c749SSergey Zigachev
974b843c749SSergey Zigachev switch (adev->asic_type) {
975b843c749SSergey Zigachev case CHIP_TOPAZ:
976b843c749SSergey Zigachev chip_name = "topaz";
977b843c749SSergey Zigachev break;
978b843c749SSergey Zigachev case CHIP_TONGA:
979b843c749SSergey Zigachev chip_name = "tonga";
980b843c749SSergey Zigachev break;
981b843c749SSergey Zigachev case CHIP_CARRIZO:
982b843c749SSergey Zigachev chip_name = "carrizo";
983b843c749SSergey Zigachev break;
984b843c749SSergey Zigachev case CHIP_FIJI:
985b843c749SSergey Zigachev chip_name = "fiji";
986b843c749SSergey Zigachev break;
987b843c749SSergey Zigachev case CHIP_STONEY:
988b843c749SSergey Zigachev chip_name = "stoney";
989b843c749SSergey Zigachev break;
990b843c749SSergey Zigachev case CHIP_POLARIS10:
991b843c749SSergey Zigachev chip_name = "polaris10";
992b843c749SSergey Zigachev break;
993b843c749SSergey Zigachev case CHIP_POLARIS11:
994b843c749SSergey Zigachev chip_name = "polaris11";
995b843c749SSergey Zigachev break;
996b843c749SSergey Zigachev case CHIP_POLARIS12:
997b843c749SSergey Zigachev chip_name = "polaris12";
998b843c749SSergey Zigachev break;
999b843c749SSergey Zigachev case CHIP_VEGAM:
1000b843c749SSergey Zigachev chip_name = "vegam";
1001b843c749SSergey Zigachev break;
1002b843c749SSergey Zigachev default:
1003b843c749SSergey Zigachev BUG();
1004b843c749SSergey Zigachev }
1005b843c749SSergey Zigachev
1006b843c749SSergey Zigachev if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
1007*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_pfp_2", chip_name);
1008b843c749SSergey Zigachev err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
1009b843c749SSergey Zigachev if (err == -ENOENT) {
1010*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_pfp", chip_name);
1011b843c749SSergey Zigachev err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
1012b843c749SSergey Zigachev }
1013b843c749SSergey Zigachev } else {
1014*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_pfp", chip_name);
1015b843c749SSergey Zigachev err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
1016b843c749SSergey Zigachev }
1017b843c749SSergey Zigachev if (err)
1018b843c749SSergey Zigachev goto out;
1019b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
1020b843c749SSergey Zigachev if (err)
1021b843c749SSergey Zigachev goto out;
1022b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
1023b843c749SSergey Zigachev adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
1024b843c749SSergey Zigachev adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
1025b843c749SSergey Zigachev
1026b843c749SSergey Zigachev if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
1027*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_me_2", chip_name);
1028b843c749SSergey Zigachev err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
1029b843c749SSergey Zigachev if (err == -ENOENT) {
1030*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_me", chip_name);
1031b843c749SSergey Zigachev err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
1032b843c749SSergey Zigachev }
1033b843c749SSergey Zigachev } else {
1034*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_me", chip_name);
1035b843c749SSergey Zigachev err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
1036b843c749SSergey Zigachev }
1037b843c749SSergey Zigachev if (err)
1038b843c749SSergey Zigachev goto out;
1039b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.me_fw);
1040b843c749SSergey Zigachev if (err)
1041b843c749SSergey Zigachev goto out;
1042b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
1043b843c749SSergey Zigachev adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
1044b843c749SSergey Zigachev
1045b843c749SSergey Zigachev adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
1046b843c749SSergey Zigachev
1047b843c749SSergey Zigachev if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
1048*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_ce_2", chip_name);
1049b843c749SSergey Zigachev err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
1050b843c749SSergey Zigachev if (err == -ENOENT) {
1051*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_ce", chip_name);
1052b843c749SSergey Zigachev err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
1053b843c749SSergey Zigachev }
1054b843c749SSergey Zigachev } else {
1055*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_ce", chip_name);
1056b843c749SSergey Zigachev err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
1057b843c749SSergey Zigachev }
1058b843c749SSergey Zigachev if (err)
1059b843c749SSergey Zigachev goto out;
1060b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.ce_fw);
1061b843c749SSergey Zigachev if (err)
1062b843c749SSergey Zigachev goto out;
1063b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
1064b843c749SSergey Zigachev adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
1065b843c749SSergey Zigachev adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
1066b843c749SSergey Zigachev
1067b843c749SSergey Zigachev /*
1068b843c749SSergey Zigachev * Support for MCBP/Virtualization in combination with chained IBs is
1069b843c749SSergey Zigachev * formal released on feature version #46
1070b843c749SSergey Zigachev */
1071b843c749SSergey Zigachev if (adev->gfx.ce_feature_version >= 46 &&
1072b843c749SSergey Zigachev adev->gfx.pfp_feature_version >= 46) {
1073b843c749SSergey Zigachev adev->virt.chained_ib_support = true;
1074b843c749SSergey Zigachev DRM_INFO("Chained IB support enabled!\n");
1075b843c749SSergey Zigachev } else
1076b843c749SSergey Zigachev adev->virt.chained_ib_support = false;
1077b843c749SSergey Zigachev
1078*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_rlc", chip_name);
1079b843c749SSergey Zigachev err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
1080b843c749SSergey Zigachev if (err)
1081b843c749SSergey Zigachev goto out;
1082b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
1083b843c749SSergey Zigachev rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
1084b843c749SSergey Zigachev adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version);
1085b843c749SSergey Zigachev adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version);
1086b843c749SSergey Zigachev
1087b843c749SSergey Zigachev adev->gfx.rlc.save_and_restore_offset =
1088b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->save_and_restore_offset);
1089b843c749SSergey Zigachev adev->gfx.rlc.clear_state_descriptor_offset =
1090b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->clear_state_descriptor_offset);
1091b843c749SSergey Zigachev adev->gfx.rlc.avail_scratch_ram_locations =
1092b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->avail_scratch_ram_locations);
1093b843c749SSergey Zigachev adev->gfx.rlc.reg_restore_list_size =
1094b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_restore_list_size);
1095b843c749SSergey Zigachev adev->gfx.rlc.reg_list_format_start =
1096b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_format_start);
1097b843c749SSergey Zigachev adev->gfx.rlc.reg_list_format_separate_start =
1098b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_format_separate_start);
1099b843c749SSergey Zigachev adev->gfx.rlc.starting_offsets_start =
1100b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->starting_offsets_start);
1101b843c749SSergey Zigachev adev->gfx.rlc.reg_list_format_size_bytes =
1102b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_format_size_bytes);
1103b843c749SSergey Zigachev adev->gfx.rlc.reg_list_size_bytes =
1104b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_size_bytes);
1105b843c749SSergey Zigachev
1106b843c749SSergey Zigachev adev->gfx.rlc.register_list_format =
1107b843c749SSergey Zigachev kmalloc(adev->gfx.rlc.reg_list_format_size_bytes +
110878973132SSergey Zigachev adev->gfx.rlc.reg_list_size_bytes, M_DRM, GFP_KERNEL);
1109b843c749SSergey Zigachev
1110b843c749SSergey Zigachev if (!adev->gfx.rlc.register_list_format) {
1111b843c749SSergey Zigachev err = -ENOMEM;
1112b843c749SSergey Zigachev goto out;
1113b843c749SSergey Zigachev }
1114b843c749SSergey Zigachev
1115b843c749SSergey Zigachev tmp = (unsigned int *)((uintptr_t)rlc_hdr +
1116b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_format_array_offset_bytes));
1117b843c749SSergey Zigachev for (i = 0 ; i < (rlc_hdr->reg_list_format_size_bytes >> 2); i++)
1118b843c749SSergey Zigachev adev->gfx.rlc.register_list_format[i] = le32_to_cpu(tmp[i]);
1119b843c749SSergey Zigachev
1120b843c749SSergey Zigachev adev->gfx.rlc.register_restore = adev->gfx.rlc.register_list_format + i;
1121b843c749SSergey Zigachev
1122b843c749SSergey Zigachev tmp = (unsigned int *)((uintptr_t)rlc_hdr +
1123b843c749SSergey Zigachev le32_to_cpu(rlc_hdr->reg_list_array_offset_bytes));
1124b843c749SSergey Zigachev for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++)
1125b843c749SSergey Zigachev adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
1126b843c749SSergey Zigachev
1127b843c749SSergey Zigachev if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
1128*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec_2", chip_name);
1129b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
1130b843c749SSergey Zigachev if (err == -ENOENT) {
1131*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec", chip_name);
1132b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
1133b843c749SSergey Zigachev }
1134b843c749SSergey Zigachev } else {
1135*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec", chip_name);
1136b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
1137b843c749SSergey Zigachev }
1138b843c749SSergey Zigachev if (err)
1139b843c749SSergey Zigachev goto out;
1140b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.mec_fw);
1141b843c749SSergey Zigachev if (err)
1142b843c749SSergey Zigachev goto out;
1143b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1144b843c749SSergey Zigachev adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
1145b843c749SSergey Zigachev adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
1146b843c749SSergey Zigachev
1147b843c749SSergey Zigachev if ((adev->asic_type != CHIP_STONEY) &&
1148b843c749SSergey Zigachev (adev->asic_type != CHIP_TOPAZ)) {
1149b843c749SSergey Zigachev if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) {
1150*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec2_2", chip_name);
1151b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
1152b843c749SSergey Zigachev if (err == -ENOENT) {
1153*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec2", chip_name);
1154b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
1155b843c749SSergey Zigachev }
1156b843c749SSergey Zigachev } else {
1157*809f3802SSergey Zigachev snprintf(fw_name, sizeof(fw_name), "amdgpufw_%s_mec2", chip_name);
1158b843c749SSergey Zigachev err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
1159b843c749SSergey Zigachev }
1160b843c749SSergey Zigachev if (!err) {
1161b843c749SSergey Zigachev err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
1162b843c749SSergey Zigachev if (err)
1163b843c749SSergey Zigachev goto out;
1164b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1165b843c749SSergey Zigachev adev->gfx.mec2_fw->data;
1166b843c749SSergey Zigachev adev->gfx.mec2_fw_version =
1167b843c749SSergey Zigachev le32_to_cpu(cp_hdr->header.ucode_version);
1168b843c749SSergey Zigachev adev->gfx.mec2_feature_version =
1169b843c749SSergey Zigachev le32_to_cpu(cp_hdr->ucode_feature_version);
1170b843c749SSergey Zigachev } else {
1171b843c749SSergey Zigachev err = 0;
1172b843c749SSergey Zigachev adev->gfx.mec2_fw = NULL;
1173b843c749SSergey Zigachev }
1174b843c749SSergey Zigachev }
1175b843c749SSergey Zigachev
1176b843c749SSergey Zigachev if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) {
1177b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP];
1178b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_CP_PFP;
1179b843c749SSergey Zigachev info->fw = adev->gfx.pfp_fw;
1180b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1181b843c749SSergey Zigachev adev->firmware.fw_size +=
1182b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1183b843c749SSergey Zigachev
1184b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_ME];
1185b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_CP_ME;
1186b843c749SSergey Zigachev info->fw = adev->gfx.me_fw;
1187b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1188b843c749SSergey Zigachev adev->firmware.fw_size +=
1189b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1190b843c749SSergey Zigachev
1191b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_CE];
1192b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_CP_CE;
1193b843c749SSergey Zigachev info->fw = adev->gfx.ce_fw;
1194b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1195b843c749SSergey Zigachev adev->firmware.fw_size +=
1196b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1197b843c749SSergey Zigachev
1198b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_G];
1199b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_RLC_G;
1200b843c749SSergey Zigachev info->fw = adev->gfx.rlc_fw;
1201b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1202b843c749SSergey Zigachev adev->firmware.fw_size +=
1203b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1204b843c749SSergey Zigachev
1205b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1];
1206b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_CP_MEC1;
1207b843c749SSergey Zigachev info->fw = adev->gfx.mec_fw;
1208b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1209b843c749SSergey Zigachev adev->firmware.fw_size +=
1210b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1211b843c749SSergey Zigachev
1212b843c749SSergey Zigachev /* we need account JT in */
1213b843c749SSergey Zigachev cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1214b843c749SSergey Zigachev adev->firmware.fw_size +=
1215b843c749SSergey Zigachev ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE);
1216b843c749SSergey Zigachev
1217b843c749SSergey Zigachev if (amdgpu_sriov_vf(adev)) {
1218b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_STORAGE];
1219b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_STORAGE;
1220b843c749SSergey Zigachev info->fw = adev->gfx.mec_fw;
1221b843c749SSergey Zigachev adev->firmware.fw_size +=
1222b843c749SSergey Zigachev ALIGN(le32_to_cpu(64 * PAGE_SIZE), PAGE_SIZE);
1223b843c749SSergey Zigachev }
1224b843c749SSergey Zigachev
1225b843c749SSergey Zigachev if (adev->gfx.mec2_fw) {
1226b843c749SSergey Zigachev info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2];
1227b843c749SSergey Zigachev info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2;
1228b843c749SSergey Zigachev info->fw = adev->gfx.mec2_fw;
1229b843c749SSergey Zigachev header = (const struct common_firmware_header *)info->fw->data;
1230b843c749SSergey Zigachev adev->firmware.fw_size +=
1231b843c749SSergey Zigachev ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
1232b843c749SSergey Zigachev }
1233b843c749SSergey Zigachev
1234b843c749SSergey Zigachev }
1235b843c749SSergey Zigachev
1236b843c749SSergey Zigachev out:
1237b843c749SSergey Zigachev if (err) {
1238b843c749SSergey Zigachev dev_err(adev->dev,
1239b843c749SSergey Zigachev "gfx8: Failed to load firmware \"%s\"\n",
1240b843c749SSergey Zigachev fw_name);
1241b843c749SSergey Zigachev release_firmware(adev->gfx.pfp_fw);
1242b843c749SSergey Zigachev adev->gfx.pfp_fw = NULL;
1243b843c749SSergey Zigachev release_firmware(adev->gfx.me_fw);
1244b843c749SSergey Zigachev adev->gfx.me_fw = NULL;
1245b843c749SSergey Zigachev release_firmware(adev->gfx.ce_fw);
1246b843c749SSergey Zigachev adev->gfx.ce_fw = NULL;
1247b843c749SSergey Zigachev release_firmware(adev->gfx.rlc_fw);
1248b843c749SSergey Zigachev adev->gfx.rlc_fw = NULL;
1249b843c749SSergey Zigachev release_firmware(adev->gfx.mec_fw);
1250b843c749SSergey Zigachev adev->gfx.mec_fw = NULL;
1251b843c749SSergey Zigachev release_firmware(adev->gfx.mec2_fw);
1252b843c749SSergey Zigachev adev->gfx.mec2_fw = NULL;
1253b843c749SSergey Zigachev }
1254b843c749SSergey Zigachev return err;
1255b843c749SSergey Zigachev }
1256b843c749SSergey Zigachev
gfx_v8_0_get_csb_buffer(struct amdgpu_device * adev,volatile u32 * buffer)1257b843c749SSergey Zigachev static void gfx_v8_0_get_csb_buffer(struct amdgpu_device *adev,
1258b843c749SSergey Zigachev volatile u32 *buffer)
1259b843c749SSergey Zigachev {
1260b843c749SSergey Zigachev u32 count = 0, i;
1261b843c749SSergey Zigachev const struct cs_section_def *sect = NULL;
1262b843c749SSergey Zigachev const struct cs_extent_def *ext = NULL;
1263b843c749SSergey Zigachev
1264b843c749SSergey Zigachev if (adev->gfx.rlc.cs_data == NULL)
1265b843c749SSergey Zigachev return;
1266b843c749SSergey Zigachev if (buffer == NULL)
1267b843c749SSergey Zigachev return;
1268b843c749SSergey Zigachev
1269b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1270b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1271b843c749SSergey Zigachev
1272b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
1273b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(0x80000000);
1274b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(0x80000000);
1275b843c749SSergey Zigachev
1276b843c749SSergey Zigachev for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
1277b843c749SSergey Zigachev for (ext = sect->section; ext->extent != NULL; ++ext) {
1278b843c749SSergey Zigachev if (sect->id == SECT_CONTEXT) {
1279b843c749SSergey Zigachev buffer[count++] =
1280b843c749SSergey Zigachev cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
1281b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(ext->reg_index -
1282b843c749SSergey Zigachev PACKET3_SET_CONTEXT_REG_START);
1283b843c749SSergey Zigachev for (i = 0; i < ext->reg_count; i++)
1284b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(ext->extent[i]);
1285b843c749SSergey Zigachev } else {
1286b843c749SSergey Zigachev return;
1287b843c749SSergey Zigachev }
1288b843c749SSergey Zigachev }
1289b843c749SSergey Zigachev }
1290b843c749SSergey Zigachev
1291b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
1292b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(mmPA_SC_RASTER_CONFIG -
1293b843c749SSergey Zigachev PACKET3_SET_CONTEXT_REG_START);
1294b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(adev->gfx.config.rb_config[0][0].raster_config);
1295b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(adev->gfx.config.rb_config[0][0].raster_config_1);
1296b843c749SSergey Zigachev
1297b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1298b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
1299b843c749SSergey Zigachev
1300b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
1301b843c749SSergey Zigachev buffer[count++] = cpu_to_le32(0);
1302b843c749SSergey Zigachev }
1303b843c749SSergey Zigachev
cz_init_cp_jump_table(struct amdgpu_device * adev)1304b843c749SSergey Zigachev static void cz_init_cp_jump_table(struct amdgpu_device *adev)
1305b843c749SSergey Zigachev {
1306b843c749SSergey Zigachev const __le32 *fw_data;
1307b843c749SSergey Zigachev volatile u32 *dst_ptr;
1308b843c749SSergey Zigachev int me, i, max_me = 4;
1309b843c749SSergey Zigachev u32 bo_offset = 0;
1310b843c749SSergey Zigachev u32 table_offset, table_size;
1311b843c749SSergey Zigachev
1312b843c749SSergey Zigachev if (adev->asic_type == CHIP_CARRIZO)
1313b843c749SSergey Zigachev max_me = 5;
1314b843c749SSergey Zigachev
1315b843c749SSergey Zigachev /* write the cp table buffer */
1316b843c749SSergey Zigachev dst_ptr = adev->gfx.rlc.cp_table_ptr;
1317b843c749SSergey Zigachev for (me = 0; me < max_me; me++) {
1318b843c749SSergey Zigachev if (me == 0) {
1319b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *hdr =
1320b843c749SSergey Zigachev (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
1321b843c749SSergey Zigachev fw_data = (const __le32 *)
1322b843c749SSergey Zigachev (adev->gfx.ce_fw->data +
1323b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1324b843c749SSergey Zigachev table_offset = le32_to_cpu(hdr->jt_offset);
1325b843c749SSergey Zigachev table_size = le32_to_cpu(hdr->jt_size);
1326b843c749SSergey Zigachev } else if (me == 1) {
1327b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *hdr =
1328b843c749SSergey Zigachev (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
1329b843c749SSergey Zigachev fw_data = (const __le32 *)
1330b843c749SSergey Zigachev (adev->gfx.pfp_fw->data +
1331b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1332b843c749SSergey Zigachev table_offset = le32_to_cpu(hdr->jt_offset);
1333b843c749SSergey Zigachev table_size = le32_to_cpu(hdr->jt_size);
1334b843c749SSergey Zigachev } else if (me == 2) {
1335b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *hdr =
1336b843c749SSergey Zigachev (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
1337b843c749SSergey Zigachev fw_data = (const __le32 *)
1338b843c749SSergey Zigachev (adev->gfx.me_fw->data +
1339b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1340b843c749SSergey Zigachev table_offset = le32_to_cpu(hdr->jt_offset);
1341b843c749SSergey Zigachev table_size = le32_to_cpu(hdr->jt_size);
1342b843c749SSergey Zigachev } else if (me == 3) {
1343b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *hdr =
1344b843c749SSergey Zigachev (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1345b843c749SSergey Zigachev fw_data = (const __le32 *)
1346b843c749SSergey Zigachev (adev->gfx.mec_fw->data +
1347b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1348b843c749SSergey Zigachev table_offset = le32_to_cpu(hdr->jt_offset);
1349b843c749SSergey Zigachev table_size = le32_to_cpu(hdr->jt_size);
1350b843c749SSergey Zigachev } else if (me == 4) {
1351b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *hdr =
1352b843c749SSergey Zigachev (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
1353b843c749SSergey Zigachev fw_data = (const __le32 *)
1354b843c749SSergey Zigachev (adev->gfx.mec2_fw->data +
1355b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1356b843c749SSergey Zigachev table_offset = le32_to_cpu(hdr->jt_offset);
1357b843c749SSergey Zigachev table_size = le32_to_cpu(hdr->jt_size);
1358b843c749SSergey Zigachev }
1359b843c749SSergey Zigachev
1360b843c749SSergey Zigachev for (i = 0; i < table_size; i ++) {
1361b843c749SSergey Zigachev dst_ptr[bo_offset + i] =
1362b843c749SSergey Zigachev cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
1363b843c749SSergey Zigachev }
1364b843c749SSergey Zigachev
1365b843c749SSergey Zigachev bo_offset += table_size;
1366b843c749SSergey Zigachev }
1367b843c749SSergey Zigachev }
1368b843c749SSergey Zigachev
gfx_v8_0_rlc_fini(struct amdgpu_device * adev)1369b843c749SSergey Zigachev static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1370b843c749SSergey Zigachev {
1371b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL);
1372b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL);
1373b843c749SSergey Zigachev }
1374b843c749SSergey Zigachev
gfx_v8_0_rlc_init(struct amdgpu_device * adev)1375b843c749SSergey Zigachev static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1376b843c749SSergey Zigachev {
1377b843c749SSergey Zigachev volatile u32 *dst_ptr;
1378b843c749SSergey Zigachev u32 dws;
1379b843c749SSergey Zigachev const struct cs_section_def *cs_data;
1380b843c749SSergey Zigachev int r;
1381b843c749SSergey Zigachev
1382b843c749SSergey Zigachev adev->gfx.rlc.cs_data = vi_cs_data;
1383b843c749SSergey Zigachev
1384b843c749SSergey Zigachev cs_data = adev->gfx.rlc.cs_data;
1385b843c749SSergey Zigachev
1386b843c749SSergey Zigachev if (cs_data) {
1387b843c749SSergey Zigachev /* clear state block */
1388b843c749SSergey Zigachev adev->gfx.rlc.clear_state_size = dws = gfx_v8_0_get_csb_size(adev);
1389b843c749SSergey Zigachev
1390b843c749SSergey Zigachev r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE,
1391b843c749SSergey Zigachev AMDGPU_GEM_DOMAIN_VRAM,
1392b843c749SSergey Zigachev &adev->gfx.rlc.clear_state_obj,
139378973132SSergey Zigachev (u64 *)&adev->gfx.rlc.clear_state_gpu_addr,
1394b843c749SSergey Zigachev (void **)&adev->gfx.rlc.cs_ptr);
1395b843c749SSergey Zigachev if (r) {
1396b843c749SSergey Zigachev dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
1397b843c749SSergey Zigachev gfx_v8_0_rlc_fini(adev);
1398b843c749SSergey Zigachev return r;
1399b843c749SSergey Zigachev }
1400b843c749SSergey Zigachev
1401b843c749SSergey Zigachev /* set up the cs buffer */
1402b843c749SSergey Zigachev dst_ptr = adev->gfx.rlc.cs_ptr;
1403b843c749SSergey Zigachev gfx_v8_0_get_csb_buffer(adev, dst_ptr);
1404b843c749SSergey Zigachev amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
1405b843c749SSergey Zigachev amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
1406b843c749SSergey Zigachev }
1407b843c749SSergey Zigachev
1408b843c749SSergey Zigachev if ((adev->asic_type == CHIP_CARRIZO) ||
1409b843c749SSergey Zigachev (adev->asic_type == CHIP_STONEY)) {
141078973132SSergey Zigachev adev->gfx.rlc.cp_table_size = (96 * 5 * 4) + (64 * 1024); /* JT + GDS */
1411b843c749SSergey Zigachev r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size,
1412b843c749SSergey Zigachev PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
1413b843c749SSergey Zigachev &adev->gfx.rlc.cp_table_obj,
141478973132SSergey Zigachev (u64 *)&adev->gfx.rlc.cp_table_gpu_addr,
1415b843c749SSergey Zigachev (void **)&adev->gfx.rlc.cp_table_ptr);
1416b843c749SSergey Zigachev if (r) {
1417b843c749SSergey Zigachev dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r);
1418b843c749SSergey Zigachev return r;
1419b843c749SSergey Zigachev }
1420b843c749SSergey Zigachev
1421b843c749SSergey Zigachev cz_init_cp_jump_table(adev);
1422b843c749SSergey Zigachev
1423b843c749SSergey Zigachev amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
1424b843c749SSergey Zigachev amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1425b843c749SSergey Zigachev }
1426b843c749SSergey Zigachev
1427b843c749SSergey Zigachev return 0;
1428b843c749SSergey Zigachev }
1429b843c749SSergey Zigachev
gfx_v8_0_mec_fini(struct amdgpu_device * adev)1430b843c749SSergey Zigachev static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
1431b843c749SSergey Zigachev {
1432b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);
1433b843c749SSergey Zigachev }
1434b843c749SSergey Zigachev
gfx_v8_0_mec_init(struct amdgpu_device * adev)1435b843c749SSergey Zigachev static int gfx_v8_0_mec_init(struct amdgpu_device *adev)
1436b843c749SSergey Zigachev {
1437b843c749SSergey Zigachev int r;
1438b843c749SSergey Zigachev u32 *hpd;
1439b843c749SSergey Zigachev size_t mec_hpd_size;
1440b843c749SSergey Zigachev
1441b843c749SSergey Zigachev bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
1442b843c749SSergey Zigachev
1443b843c749SSergey Zigachev /* take ownership of the relevant compute queues */
1444b843c749SSergey Zigachev amdgpu_gfx_compute_queue_acquire(adev);
1445b843c749SSergey Zigachev
1446b843c749SSergey Zigachev mec_hpd_size = adev->gfx.num_compute_rings * GFX8_MEC_HPD_SIZE;
1447b843c749SSergey Zigachev
1448b843c749SSergey Zigachev r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,
1449b843c749SSergey Zigachev AMDGPU_GEM_DOMAIN_GTT,
1450b843c749SSergey Zigachev &adev->gfx.mec.hpd_eop_obj,
1451b843c749SSergey Zigachev &adev->gfx.mec.hpd_eop_gpu_addr,
1452b843c749SSergey Zigachev (void **)&hpd);
1453b843c749SSergey Zigachev if (r) {
1454b843c749SSergey Zigachev dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r);
1455b843c749SSergey Zigachev return r;
1456b843c749SSergey Zigachev }
1457b843c749SSergey Zigachev
1458b843c749SSergey Zigachev memset(hpd, 0, mec_hpd_size);
1459b843c749SSergey Zigachev
1460b843c749SSergey Zigachev amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj);
1461b843c749SSergey Zigachev amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);
1462b843c749SSergey Zigachev
1463b843c749SSergey Zigachev return 0;
1464b843c749SSergey Zigachev }
1465b843c749SSergey Zigachev
1466b843c749SSergey Zigachev static const u32 vgpr_init_compute_shader[] =
1467b843c749SSergey Zigachev {
1468b843c749SSergey Zigachev 0x7e000209, 0x7e020208,
1469b843c749SSergey Zigachev 0x7e040207, 0x7e060206,
1470b843c749SSergey Zigachev 0x7e080205, 0x7e0a0204,
1471b843c749SSergey Zigachev 0x7e0c0203, 0x7e0e0202,
1472b843c749SSergey Zigachev 0x7e100201, 0x7e120200,
1473b843c749SSergey Zigachev 0x7e140209, 0x7e160208,
1474b843c749SSergey Zigachev 0x7e180207, 0x7e1a0206,
1475b843c749SSergey Zigachev 0x7e1c0205, 0x7e1e0204,
1476b843c749SSergey Zigachev 0x7e200203, 0x7e220202,
1477b843c749SSergey Zigachev 0x7e240201, 0x7e260200,
1478b843c749SSergey Zigachev 0x7e280209, 0x7e2a0208,
1479b843c749SSergey Zigachev 0x7e2c0207, 0x7e2e0206,
1480b843c749SSergey Zigachev 0x7e300205, 0x7e320204,
1481b843c749SSergey Zigachev 0x7e340203, 0x7e360202,
1482b843c749SSergey Zigachev 0x7e380201, 0x7e3a0200,
1483b843c749SSergey Zigachev 0x7e3c0209, 0x7e3e0208,
1484b843c749SSergey Zigachev 0x7e400207, 0x7e420206,
1485b843c749SSergey Zigachev 0x7e440205, 0x7e460204,
1486b843c749SSergey Zigachev 0x7e480203, 0x7e4a0202,
1487b843c749SSergey Zigachev 0x7e4c0201, 0x7e4e0200,
1488b843c749SSergey Zigachev 0x7e500209, 0x7e520208,
1489b843c749SSergey Zigachev 0x7e540207, 0x7e560206,
1490b843c749SSergey Zigachev 0x7e580205, 0x7e5a0204,
1491b843c749SSergey Zigachev 0x7e5c0203, 0x7e5e0202,
1492b843c749SSergey Zigachev 0x7e600201, 0x7e620200,
1493b843c749SSergey Zigachev 0x7e640209, 0x7e660208,
1494b843c749SSergey Zigachev 0x7e680207, 0x7e6a0206,
1495b843c749SSergey Zigachev 0x7e6c0205, 0x7e6e0204,
1496b843c749SSergey Zigachev 0x7e700203, 0x7e720202,
1497b843c749SSergey Zigachev 0x7e740201, 0x7e760200,
1498b843c749SSergey Zigachev 0x7e780209, 0x7e7a0208,
1499b843c749SSergey Zigachev 0x7e7c0207, 0x7e7e0206,
1500b843c749SSergey Zigachev 0xbf8a0000, 0xbf810000,
1501b843c749SSergey Zigachev };
1502b843c749SSergey Zigachev
1503b843c749SSergey Zigachev static const u32 sgpr_init_compute_shader[] =
1504b843c749SSergey Zigachev {
1505b843c749SSergey Zigachev 0xbe8a0100, 0xbe8c0102,
1506b843c749SSergey Zigachev 0xbe8e0104, 0xbe900106,
1507b843c749SSergey Zigachev 0xbe920108, 0xbe940100,
1508b843c749SSergey Zigachev 0xbe960102, 0xbe980104,
1509b843c749SSergey Zigachev 0xbe9a0106, 0xbe9c0108,
1510b843c749SSergey Zigachev 0xbe9e0100, 0xbea00102,
1511b843c749SSergey Zigachev 0xbea20104, 0xbea40106,
1512b843c749SSergey Zigachev 0xbea60108, 0xbea80100,
1513b843c749SSergey Zigachev 0xbeaa0102, 0xbeac0104,
1514b843c749SSergey Zigachev 0xbeae0106, 0xbeb00108,
1515b843c749SSergey Zigachev 0xbeb20100, 0xbeb40102,
1516b843c749SSergey Zigachev 0xbeb60104, 0xbeb80106,
1517b843c749SSergey Zigachev 0xbeba0108, 0xbebc0100,
1518b843c749SSergey Zigachev 0xbebe0102, 0xbec00104,
1519b843c749SSergey Zigachev 0xbec20106, 0xbec40108,
1520b843c749SSergey Zigachev 0xbec60100, 0xbec80102,
1521b843c749SSergey Zigachev 0xbee60004, 0xbee70005,
1522b843c749SSergey Zigachev 0xbeea0006, 0xbeeb0007,
1523b843c749SSergey Zigachev 0xbee80008, 0xbee90009,
1524b843c749SSergey Zigachev 0xbefc0000, 0xbf8a0000,
1525b843c749SSergey Zigachev 0xbf810000, 0x00000000,
1526b843c749SSergey Zigachev };
1527b843c749SSergey Zigachev
1528b843c749SSergey Zigachev static const u32 vgpr_init_regs[] =
1529b843c749SSergey Zigachev {
1530b843c749SSergey Zigachev mmCOMPUTE_STATIC_THREAD_MGMT_SE0, 0xffffffff,
1531b843c749SSergey Zigachev mmCOMPUTE_RESOURCE_LIMITS, 0x1000000, /* CU_GROUP_COUNT=1 */
1532b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_X, 256*4,
1533b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Y, 1,
1534b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Z, 1,
1535b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC1, 0x100004f, /* VGPRS=15 (64 logical VGPRs), SGPRS=1 (16 SGPRs), BULKY=1 */
1536b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC2, 20,
1537b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_0, 0xedcedc00,
1538b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_1, 0xedcedc01,
1539b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_2, 0xedcedc02,
1540b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_3, 0xedcedc03,
1541b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_4, 0xedcedc04,
1542b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_5, 0xedcedc05,
1543b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_6, 0xedcedc06,
1544b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_7, 0xedcedc07,
1545b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_8, 0xedcedc08,
1546b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_9, 0xedcedc09,
1547b843c749SSergey Zigachev };
1548b843c749SSergey Zigachev
1549b843c749SSergey Zigachev static const u32 sgpr1_init_regs[] =
1550b843c749SSergey Zigachev {
1551b843c749SSergey Zigachev mmCOMPUTE_STATIC_THREAD_MGMT_SE0, 0x0f,
1552b843c749SSergey Zigachev mmCOMPUTE_RESOURCE_LIMITS, 0x1000000, /* CU_GROUP_COUNT=1 */
1553b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_X, 256*5,
1554b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Y, 1,
1555b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Z, 1,
1556b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC1, 0x240, /* SGPRS=9 (80 GPRS) */
1557b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC2, 20,
1558b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_0, 0xedcedc00,
1559b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_1, 0xedcedc01,
1560b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_2, 0xedcedc02,
1561b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_3, 0xedcedc03,
1562b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_4, 0xedcedc04,
1563b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_5, 0xedcedc05,
1564b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_6, 0xedcedc06,
1565b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_7, 0xedcedc07,
1566b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_8, 0xedcedc08,
1567b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_9, 0xedcedc09,
1568b843c749SSergey Zigachev };
1569b843c749SSergey Zigachev
1570b843c749SSergey Zigachev static const u32 sgpr2_init_regs[] =
1571b843c749SSergey Zigachev {
1572b843c749SSergey Zigachev mmCOMPUTE_STATIC_THREAD_MGMT_SE0, 0xf0,
1573b843c749SSergey Zigachev mmCOMPUTE_RESOURCE_LIMITS, 0x1000000,
1574b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_X, 256*5,
1575b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Y, 1,
1576b843c749SSergey Zigachev mmCOMPUTE_NUM_THREAD_Z, 1,
1577b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC1, 0x240, /* SGPRS=9 (80 GPRS) */
1578b843c749SSergey Zigachev mmCOMPUTE_PGM_RSRC2, 20,
1579b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_0, 0xedcedc00,
1580b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_1, 0xedcedc01,
1581b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_2, 0xedcedc02,
1582b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_3, 0xedcedc03,
1583b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_4, 0xedcedc04,
1584b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_5, 0xedcedc05,
1585b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_6, 0xedcedc06,
1586b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_7, 0xedcedc07,
1587b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_8, 0xedcedc08,
1588b843c749SSergey Zigachev mmCOMPUTE_USER_DATA_9, 0xedcedc09,
1589b843c749SSergey Zigachev };
1590b843c749SSergey Zigachev
1591b843c749SSergey Zigachev static const u32 sec_ded_counter_registers[] =
1592b843c749SSergey Zigachev {
1593b843c749SSergey Zigachev mmCPC_EDC_ATC_CNT,
1594b843c749SSergey Zigachev mmCPC_EDC_SCRATCH_CNT,
1595b843c749SSergey Zigachev mmCPC_EDC_UCODE_CNT,
1596b843c749SSergey Zigachev mmCPF_EDC_ATC_CNT,
1597b843c749SSergey Zigachev mmCPF_EDC_ROQ_CNT,
1598b843c749SSergey Zigachev mmCPF_EDC_TAG_CNT,
1599b843c749SSergey Zigachev mmCPG_EDC_ATC_CNT,
1600b843c749SSergey Zigachev mmCPG_EDC_DMA_CNT,
1601b843c749SSergey Zigachev mmCPG_EDC_TAG_CNT,
1602b843c749SSergey Zigachev mmDC_EDC_CSINVOC_CNT,
1603b843c749SSergey Zigachev mmDC_EDC_RESTORE_CNT,
1604b843c749SSergey Zigachev mmDC_EDC_STATE_CNT,
1605b843c749SSergey Zigachev mmGDS_EDC_CNT,
1606b843c749SSergey Zigachev mmGDS_EDC_GRBM_CNT,
1607b843c749SSergey Zigachev mmGDS_EDC_OA_DED,
1608b843c749SSergey Zigachev mmSPI_EDC_CNT,
1609b843c749SSergey Zigachev mmSQC_ATC_EDC_GATCL1_CNT,
1610b843c749SSergey Zigachev mmSQC_EDC_CNT,
1611b843c749SSergey Zigachev mmSQ_EDC_DED_CNT,
1612b843c749SSergey Zigachev mmSQ_EDC_INFO,
1613b843c749SSergey Zigachev mmSQ_EDC_SEC_CNT,
1614b843c749SSergey Zigachev mmTCC_EDC_CNT,
1615b843c749SSergey Zigachev mmTCP_ATC_EDC_GATCL1_CNT,
1616b843c749SSergey Zigachev mmTCP_EDC_CNT,
1617b843c749SSergey Zigachev mmTD_EDC_CNT
1618b843c749SSergey Zigachev };
1619b843c749SSergey Zigachev
gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device * adev)1620b843c749SSergey Zigachev static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
1621b843c749SSergey Zigachev {
1622b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.compute_ring[0];
1623b843c749SSergey Zigachev struct amdgpu_ib ib;
1624b843c749SSergey Zigachev struct dma_fence *f = NULL;
1625b843c749SSergey Zigachev int r, i;
1626b843c749SSergey Zigachev u32 tmp;
1627b843c749SSergey Zigachev unsigned total_size, vgpr_offset, sgpr_offset;
1628b843c749SSergey Zigachev u64 gpu_addr;
1629b843c749SSergey Zigachev
1630b843c749SSergey Zigachev /* only supported on CZ */
1631b843c749SSergey Zigachev if (adev->asic_type != CHIP_CARRIZO)
1632b843c749SSergey Zigachev return 0;
1633b843c749SSergey Zigachev
1634b843c749SSergey Zigachev /* bail if the compute ring is not ready */
1635b843c749SSergey Zigachev if (!ring->ready)
1636b843c749SSergey Zigachev return 0;
1637b843c749SSergey Zigachev
1638b843c749SSergey Zigachev tmp = RREG32(mmGB_EDC_MODE);
1639b843c749SSergey Zigachev WREG32(mmGB_EDC_MODE, 0);
1640b843c749SSergey Zigachev
1641b843c749SSergey Zigachev total_size =
1642b843c749SSergey Zigachev (((ARRAY_SIZE(vgpr_init_regs) / 2) * 3) + 4 + 5 + 2) * 4;
1643b843c749SSergey Zigachev total_size +=
1644b843c749SSergey Zigachev (((ARRAY_SIZE(sgpr1_init_regs) / 2) * 3) + 4 + 5 + 2) * 4;
1645b843c749SSergey Zigachev total_size +=
1646b843c749SSergey Zigachev (((ARRAY_SIZE(sgpr2_init_regs) / 2) * 3) + 4 + 5 + 2) * 4;
1647b843c749SSergey Zigachev total_size = ALIGN(total_size, 256);
1648b843c749SSergey Zigachev vgpr_offset = total_size;
1649b843c749SSergey Zigachev total_size += ALIGN(sizeof(vgpr_init_compute_shader), 256);
1650b843c749SSergey Zigachev sgpr_offset = total_size;
1651b843c749SSergey Zigachev total_size += sizeof(sgpr_init_compute_shader);
1652b843c749SSergey Zigachev
1653b843c749SSergey Zigachev /* allocate an indirect buffer to put the commands in */
1654b843c749SSergey Zigachev memset(&ib, 0, sizeof(ib));
1655b843c749SSergey Zigachev r = amdgpu_ib_get(adev, NULL, total_size, &ib);
1656b843c749SSergey Zigachev if (r) {
1657b843c749SSergey Zigachev DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
1658b843c749SSergey Zigachev return r;
1659b843c749SSergey Zigachev }
1660b843c749SSergey Zigachev
1661b843c749SSergey Zigachev /* load the compute shaders */
1662b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(vgpr_init_compute_shader); i++)
1663b843c749SSergey Zigachev ib.ptr[i + (vgpr_offset / 4)] = vgpr_init_compute_shader[i];
1664b843c749SSergey Zigachev
1665b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(sgpr_init_compute_shader); i++)
1666b843c749SSergey Zigachev ib.ptr[i + (sgpr_offset / 4)] = sgpr_init_compute_shader[i];
1667b843c749SSergey Zigachev
1668b843c749SSergey Zigachev /* init the ib length to 0 */
1669b843c749SSergey Zigachev ib.length_dw = 0;
1670b843c749SSergey Zigachev
1671b843c749SSergey Zigachev /* VGPR */
1672b843c749SSergey Zigachev /* write the register state for the compute dispatch */
1673b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(vgpr_init_regs); i += 2) {
1674b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
1675b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = vgpr_init_regs[i] - PACKET3_SET_SH_REG_START;
1676b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = vgpr_init_regs[i + 1];
1677b843c749SSergey Zigachev }
1678b843c749SSergey Zigachev /* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
1679b843c749SSergey Zigachev gpu_addr = (ib.gpu_addr + (u64)vgpr_offset) >> 8;
1680b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
1681b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = mmCOMPUTE_PGM_LO - PACKET3_SET_SH_REG_START;
1682b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
1683b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
1684b843c749SSergey Zigachev
1685b843c749SSergey Zigachev /* write dispatch packet */
1686b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
1687b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 8; /* x */
1688b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* y */
1689b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* z */
1690b843c749SSergey Zigachev ib.ptr[ib.length_dw++] =
1691b843c749SSergey Zigachev REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
1692b843c749SSergey Zigachev
1693b843c749SSergey Zigachev /* write CS partial flush packet */
1694b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
1695b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
1696b843c749SSergey Zigachev
1697b843c749SSergey Zigachev /* SGPR1 */
1698b843c749SSergey Zigachev /* write the register state for the compute dispatch */
1699b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(sgpr1_init_regs); i += 2) {
1700b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
1701b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = sgpr1_init_regs[i] - PACKET3_SET_SH_REG_START;
1702b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = sgpr1_init_regs[i + 1];
1703b843c749SSergey Zigachev }
1704b843c749SSergey Zigachev /* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
1705b843c749SSergey Zigachev gpu_addr = (ib.gpu_addr + (u64)sgpr_offset) >> 8;
1706b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
1707b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = mmCOMPUTE_PGM_LO - PACKET3_SET_SH_REG_START;
1708b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
1709b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
1710b843c749SSergey Zigachev
1711b843c749SSergey Zigachev /* write dispatch packet */
1712b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
1713b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 8; /* x */
1714b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* y */
1715b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* z */
1716b843c749SSergey Zigachev ib.ptr[ib.length_dw++] =
1717b843c749SSergey Zigachev REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
1718b843c749SSergey Zigachev
1719b843c749SSergey Zigachev /* write CS partial flush packet */
1720b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
1721b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
1722b843c749SSergey Zigachev
1723b843c749SSergey Zigachev /* SGPR2 */
1724b843c749SSergey Zigachev /* write the register state for the compute dispatch */
1725b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(sgpr2_init_regs); i += 2) {
1726b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
1727b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = sgpr2_init_regs[i] - PACKET3_SET_SH_REG_START;
1728b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = sgpr2_init_regs[i + 1];
1729b843c749SSergey Zigachev }
1730b843c749SSergey Zigachev /* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
1731b843c749SSergey Zigachev gpu_addr = (ib.gpu_addr + (u64)sgpr_offset) >> 8;
1732b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
1733b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = mmCOMPUTE_PGM_LO - PACKET3_SET_SH_REG_START;
1734b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
1735b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
1736b843c749SSergey Zigachev
1737b843c749SSergey Zigachev /* write dispatch packet */
1738b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
1739b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 8; /* x */
1740b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* y */
1741b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = 1; /* z */
1742b843c749SSergey Zigachev ib.ptr[ib.length_dw++] =
1743b843c749SSergey Zigachev REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
1744b843c749SSergey Zigachev
1745b843c749SSergey Zigachev /* write CS partial flush packet */
1746b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
1747b843c749SSergey Zigachev ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
1748b843c749SSergey Zigachev
1749b843c749SSergey Zigachev /* shedule the ib on the ring */
1750b843c749SSergey Zigachev r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
1751b843c749SSergey Zigachev if (r) {
1752b843c749SSergey Zigachev DRM_ERROR("amdgpu: ib submit failed (%d).\n", r);
1753b843c749SSergey Zigachev goto fail;
1754b843c749SSergey Zigachev }
1755b843c749SSergey Zigachev
1756b843c749SSergey Zigachev /* wait for the GPU to finish processing the IB */
1757b843c749SSergey Zigachev r = dma_fence_wait(f, false);
1758b843c749SSergey Zigachev if (r) {
1759b843c749SSergey Zigachev DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
1760b843c749SSergey Zigachev goto fail;
1761b843c749SSergey Zigachev }
1762b843c749SSergey Zigachev
1763b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GB_EDC_MODE, DED_MODE, 2);
1764b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GB_EDC_MODE, PROP_FED, 1);
1765b843c749SSergey Zigachev WREG32(mmGB_EDC_MODE, tmp);
1766b843c749SSergey Zigachev
1767b843c749SSergey Zigachev tmp = RREG32(mmCC_GC_EDC_CONFIG);
1768b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CC_GC_EDC_CONFIG, DIS_EDC, 0) | 1;
1769b843c749SSergey Zigachev WREG32(mmCC_GC_EDC_CONFIG, tmp);
1770b843c749SSergey Zigachev
1771b843c749SSergey Zigachev
1772b843c749SSergey Zigachev /* read back registers to clear the counters */
1773b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++)
1774b843c749SSergey Zigachev RREG32(sec_ded_counter_registers[i]);
1775b843c749SSergey Zigachev
1776b843c749SSergey Zigachev fail:
1777b843c749SSergey Zigachev amdgpu_ib_free(adev, &ib, NULL);
1778b843c749SSergey Zigachev dma_fence_put(f);
1779b843c749SSergey Zigachev
1780b843c749SSergey Zigachev return r;
1781b843c749SSergey Zigachev }
1782b843c749SSergey Zigachev
gfx_v8_0_gpu_early_init(struct amdgpu_device * adev)1783b843c749SSergey Zigachev static int gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
1784b843c749SSergey Zigachev {
1785b843c749SSergey Zigachev u32 gb_addr_config;
1786b843c749SSergey Zigachev u32 mc_shared_chmap, mc_arb_ramcfg;
1787b843c749SSergey Zigachev u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
1788b843c749SSergey Zigachev u32 tmp;
1789b843c749SSergey Zigachev int ret;
1790b843c749SSergey Zigachev
1791b843c749SSergey Zigachev switch (adev->asic_type) {
1792b843c749SSergey Zigachev case CHIP_TOPAZ:
1793b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 1;
1794b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 2;
1795b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 6;
1796b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1797b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 2;
1798b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 2;
1799b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1800b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1801b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1802b843c749SSergey Zigachev
1803b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1804b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1805b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1806b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1807b843c749SSergey Zigachev gb_addr_config = TOPAZ_GB_ADDR_CONFIG_GOLDEN;
1808b843c749SSergey Zigachev break;
1809b843c749SSergey Zigachev case CHIP_FIJI:
1810b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 4;
1811b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 16;
1812b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 16;
1813b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1814b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 4;
1815b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 16;
1816b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1817b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1818b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1819b843c749SSergey Zigachev
1820b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1821b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1822b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1823b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1824b843c749SSergey Zigachev gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1825b843c749SSergey Zigachev break;
1826b843c749SSergey Zigachev case CHIP_POLARIS11:
1827b843c749SSergey Zigachev case CHIP_POLARIS12:
1828b843c749SSergey Zigachev ret = amdgpu_atombios_get_gfx_info(adev);
1829b843c749SSergey Zigachev if (ret)
1830b843c749SSergey Zigachev return ret;
1831b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1832b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1833b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1834b843c749SSergey Zigachev
1835b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1836b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1837b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1838b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1839b843c749SSergey Zigachev gb_addr_config = POLARIS11_GB_ADDR_CONFIG_GOLDEN;
1840b843c749SSergey Zigachev break;
1841b843c749SSergey Zigachev case CHIP_POLARIS10:
1842b843c749SSergey Zigachev case CHIP_VEGAM:
1843b843c749SSergey Zigachev ret = amdgpu_atombios_get_gfx_info(adev);
1844b843c749SSergey Zigachev if (ret)
1845b843c749SSergey Zigachev return ret;
1846b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1847b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1848b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1849b843c749SSergey Zigachev
1850b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1851b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1852b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1853b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1854b843c749SSergey Zigachev gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1855b843c749SSergey Zigachev break;
1856b843c749SSergey Zigachev case CHIP_TONGA:
1857b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 4;
1858b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 8;
1859b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 8;
1860b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1861b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 2;
1862b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 8;
1863b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1864b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1865b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1866b843c749SSergey Zigachev
1867b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1868b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1869b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1870b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1871b843c749SSergey Zigachev gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1872b843c749SSergey Zigachev break;
1873b843c749SSergey Zigachev case CHIP_CARRIZO:
1874b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 1;
1875b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 2;
1876b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1877b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 2;
1878b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 8;
1879b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 2;
1880b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1881b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1882b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1883b843c749SSergey Zigachev
1884b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1885b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1886b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1887b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1888b843c749SSergey Zigachev gb_addr_config = CARRIZO_GB_ADDR_CONFIG_GOLDEN;
1889b843c749SSergey Zigachev break;
1890b843c749SSergey Zigachev case CHIP_STONEY:
1891b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 1;
1892b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 2;
1893b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1894b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 1;
1895b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 3;
1896b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 2;
1897b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1898b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 16;
1899b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1900b843c749SSergey Zigachev
1901b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1902b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1903b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1904b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1905b843c749SSergey Zigachev gb_addr_config = CARRIZO_GB_ADDR_CONFIG_GOLDEN;
1906b843c749SSergey Zigachev break;
1907b843c749SSergey Zigachev default:
1908b843c749SSergey Zigachev adev->gfx.config.max_shader_engines = 2;
1909b843c749SSergey Zigachev adev->gfx.config.max_tile_pipes = 4;
1910b843c749SSergey Zigachev adev->gfx.config.max_cu_per_sh = 2;
1911b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se = 1;
1912b843c749SSergey Zigachev adev->gfx.config.max_backends_per_se = 2;
1913b843c749SSergey Zigachev adev->gfx.config.max_texture_channel_caches = 4;
1914b843c749SSergey Zigachev adev->gfx.config.max_gprs = 256;
1915b843c749SSergey Zigachev adev->gfx.config.max_gs_threads = 32;
1916b843c749SSergey Zigachev adev->gfx.config.max_hw_contexts = 8;
1917b843c749SSergey Zigachev
1918b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1919b843c749SSergey Zigachev adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1920b843c749SSergey Zigachev adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1921b843c749SSergey Zigachev adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1922b843c749SSergey Zigachev gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1923b843c749SSergey Zigachev break;
1924b843c749SSergey Zigachev }
1925b843c749SSergey Zigachev
1926b843c749SSergey Zigachev mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP);
1927b843c749SSergey Zigachev adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG);
1928b843c749SSergey Zigachev mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg;
1929b843c749SSergey Zigachev
1930b843c749SSergey Zigachev adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
1931b843c749SSergey Zigachev adev->gfx.config.mem_max_burst_length_bytes = 256;
1932b843c749SSergey Zigachev if (adev->flags & AMD_IS_APU) {
1933b843c749SSergey Zigachev /* Get memory bank mapping mode. */
1934b843c749SSergey Zigachev tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING);
1935b843c749SSergey Zigachev dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
1936b843c749SSergey Zigachev dimm01_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
1937b843c749SSergey Zigachev
1938b843c749SSergey Zigachev tmp = RREG32(mmMC_FUS_DRAM1_BANK_ADDR_MAPPING);
1939b843c749SSergey Zigachev dimm10_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
1940b843c749SSergey Zigachev dimm11_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
1941b843c749SSergey Zigachev
1942b843c749SSergey Zigachev /* Validate settings in case only one DIMM installed. */
1943b843c749SSergey Zigachev if ((dimm00_addr_map == 0) || (dimm00_addr_map == 3) || (dimm00_addr_map == 4) || (dimm00_addr_map > 12))
1944b843c749SSergey Zigachev dimm00_addr_map = 0;
1945b843c749SSergey Zigachev if ((dimm01_addr_map == 0) || (dimm01_addr_map == 3) || (dimm01_addr_map == 4) || (dimm01_addr_map > 12))
1946b843c749SSergey Zigachev dimm01_addr_map = 0;
1947b843c749SSergey Zigachev if ((dimm10_addr_map == 0) || (dimm10_addr_map == 3) || (dimm10_addr_map == 4) || (dimm10_addr_map > 12))
1948b843c749SSergey Zigachev dimm10_addr_map = 0;
1949b843c749SSergey Zigachev if ((dimm11_addr_map == 0) || (dimm11_addr_map == 3) || (dimm11_addr_map == 4) || (dimm11_addr_map > 12))
1950b843c749SSergey Zigachev dimm11_addr_map = 0;
1951b843c749SSergey Zigachev
1952b843c749SSergey Zigachev /* If DIMM Addr map is 8GB, ROW size should be 2KB. Otherwise 1KB. */
1953b843c749SSergey Zigachev /* If ROW size(DIMM1) != ROW size(DMIMM0), ROW size should be larger one. */
1954b843c749SSergey Zigachev if ((dimm00_addr_map == 11) || (dimm01_addr_map == 11) || (dimm10_addr_map == 11) || (dimm11_addr_map == 11))
1955b843c749SSergey Zigachev adev->gfx.config.mem_row_size_in_kb = 2;
1956b843c749SSergey Zigachev else
1957b843c749SSergey Zigachev adev->gfx.config.mem_row_size_in_kb = 1;
1958b843c749SSergey Zigachev } else {
1959b843c749SSergey Zigachev tmp = REG_GET_FIELD(mc_arb_ramcfg, MC_ARB_RAMCFG, NOOFCOLS);
1960b843c749SSergey Zigachev adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1961b843c749SSergey Zigachev if (adev->gfx.config.mem_row_size_in_kb > 4)
1962b843c749SSergey Zigachev adev->gfx.config.mem_row_size_in_kb = 4;
1963b843c749SSergey Zigachev }
1964b843c749SSergey Zigachev
1965b843c749SSergey Zigachev adev->gfx.config.shader_engine_tile_size = 32;
1966b843c749SSergey Zigachev adev->gfx.config.num_gpus = 1;
1967b843c749SSergey Zigachev adev->gfx.config.multi_gpu_tile_size = 64;
1968b843c749SSergey Zigachev
1969b843c749SSergey Zigachev /* fix up row size */
1970b843c749SSergey Zigachev switch (adev->gfx.config.mem_row_size_in_kb) {
1971b843c749SSergey Zigachev case 1:
1972b843c749SSergey Zigachev default:
1973b843c749SSergey Zigachev gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 0);
1974b843c749SSergey Zigachev break;
1975b843c749SSergey Zigachev case 2:
1976b843c749SSergey Zigachev gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 1);
1977b843c749SSergey Zigachev break;
1978b843c749SSergey Zigachev case 4:
1979b843c749SSergey Zigachev gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 2);
1980b843c749SSergey Zigachev break;
1981b843c749SSergey Zigachev }
1982b843c749SSergey Zigachev adev->gfx.config.gb_addr_config = gb_addr_config;
1983b843c749SSergey Zigachev
1984b843c749SSergey Zigachev return 0;
1985b843c749SSergey Zigachev }
1986b843c749SSergey Zigachev
gfx_v8_0_compute_ring_init(struct amdgpu_device * adev,int ring_id,int mec,int pipe,int queue)1987b843c749SSergey Zigachev static int gfx_v8_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,
1988b843c749SSergey Zigachev int mec, int pipe, int queue)
1989b843c749SSergey Zigachev {
1990b843c749SSergey Zigachev int r;
1991b843c749SSergey Zigachev unsigned irq_type;
1992b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id];
1993b843c749SSergey Zigachev
1994b843c749SSergey Zigachev ring = &adev->gfx.compute_ring[ring_id];
1995b843c749SSergey Zigachev
1996b843c749SSergey Zigachev /* mec0 is me1 */
1997b843c749SSergey Zigachev ring->me = mec + 1;
1998b843c749SSergey Zigachev ring->pipe = pipe;
1999b843c749SSergey Zigachev ring->queue = queue;
2000b843c749SSergey Zigachev
2001b843c749SSergey Zigachev ring->ring_obj = NULL;
2002b843c749SSergey Zigachev ring->use_doorbell = true;
2003b843c749SSergey Zigachev ring->doorbell_index = AMDGPU_DOORBELL_MEC_RING0 + ring_id;
2004b843c749SSergey Zigachev ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr
2005b843c749SSergey Zigachev + (ring_id * GFX8_MEC_HPD_SIZE);
200678973132SSergey Zigachev ksprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
2007b843c749SSergey Zigachev
2008b843c749SSergey Zigachev irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP
2009b843c749SSergey Zigachev + ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec)
2010b843c749SSergey Zigachev + ring->pipe;
2011b843c749SSergey Zigachev
2012b843c749SSergey Zigachev /* type-2 packets are deprecated on MEC, use type-3 instead */
2013b843c749SSergey Zigachev r = amdgpu_ring_init(adev, ring, 1024,
2014b843c749SSergey Zigachev &adev->gfx.eop_irq, irq_type);
2015b843c749SSergey Zigachev if (r)
2016b843c749SSergey Zigachev return r;
2017b843c749SSergey Zigachev
2018b843c749SSergey Zigachev
2019b843c749SSergey Zigachev return 0;
2020b843c749SSergey Zigachev }
2021b843c749SSergey Zigachev
2022b843c749SSergey Zigachev static void gfx_v8_0_sq_irq_work_func(struct work_struct *work);
2023b843c749SSergey Zigachev
gfx_v8_0_sw_init(void * handle)2024b843c749SSergey Zigachev static int gfx_v8_0_sw_init(void *handle)
2025b843c749SSergey Zigachev {
2026b843c749SSergey Zigachev int i, j, k, r, ring_id;
2027b843c749SSergey Zigachev struct amdgpu_ring *ring;
2028b843c749SSergey Zigachev struct amdgpu_kiq *kiq;
2029b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2030b843c749SSergey Zigachev
2031b843c749SSergey Zigachev switch (adev->asic_type) {
2032b843c749SSergey Zigachev case CHIP_TONGA:
2033b843c749SSergey Zigachev case CHIP_CARRIZO:
2034b843c749SSergey Zigachev case CHIP_FIJI:
2035b843c749SSergey Zigachev case CHIP_POLARIS10:
2036b843c749SSergey Zigachev case CHIP_POLARIS11:
2037b843c749SSergey Zigachev case CHIP_POLARIS12:
2038b843c749SSergey Zigachev case CHIP_VEGAM:
2039b843c749SSergey Zigachev adev->gfx.mec.num_mec = 2;
2040b843c749SSergey Zigachev break;
2041b843c749SSergey Zigachev case CHIP_TOPAZ:
2042b843c749SSergey Zigachev case CHIP_STONEY:
2043b843c749SSergey Zigachev default:
2044b843c749SSergey Zigachev adev->gfx.mec.num_mec = 1;
2045b843c749SSergey Zigachev break;
2046b843c749SSergey Zigachev }
2047b843c749SSergey Zigachev
2048b843c749SSergey Zigachev adev->gfx.mec.num_pipe_per_mec = 4;
2049b843c749SSergey Zigachev adev->gfx.mec.num_queue_per_pipe = 8;
2050b843c749SSergey Zigachev
2051b843c749SSergey Zigachev /* KIQ event */
2052b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_INT_IB2, &adev->gfx.kiq.irq);
2053b843c749SSergey Zigachev if (r)
2054b843c749SSergey Zigachev return r;
2055b843c749SSergey Zigachev
2056b843c749SSergey Zigachev /* EOP Event */
2057b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_END_OF_PIPE, &adev->gfx.eop_irq);
2058b843c749SSergey Zigachev if (r)
2059b843c749SSergey Zigachev return r;
2060b843c749SSergey Zigachev
2061b843c749SSergey Zigachev /* Privileged reg */
2062b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_REG_FAULT,
2063b843c749SSergey Zigachev &adev->gfx.priv_reg_irq);
2064b843c749SSergey Zigachev if (r)
2065b843c749SSergey Zigachev return r;
2066b843c749SSergey Zigachev
2067b843c749SSergey Zigachev /* Privileged inst */
2068b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_INSTR_FAULT,
2069b843c749SSergey Zigachev &adev->gfx.priv_inst_irq);
2070b843c749SSergey Zigachev if (r)
2071b843c749SSergey Zigachev return r;
2072b843c749SSergey Zigachev
2073b843c749SSergey Zigachev /* Add CP EDC/ECC irq */
2074b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_ECC_ERROR,
2075b843c749SSergey Zigachev &adev->gfx.cp_ecc_error_irq);
2076b843c749SSergey Zigachev if (r)
2077b843c749SSergey Zigachev return r;
2078b843c749SSergey Zigachev
2079b843c749SSergey Zigachev /* SQ interrupts. */
2080b843c749SSergey Zigachev r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SQ_INTERRUPT_MSG,
2081b843c749SSergey Zigachev &adev->gfx.sq_irq);
2082b843c749SSergey Zigachev if (r) {
2083b843c749SSergey Zigachev DRM_ERROR("amdgpu_irq_add() for SQ failed: %d\n", r);
2084b843c749SSergey Zigachev return r;
2085b843c749SSergey Zigachev }
2086b843c749SSergey Zigachev
2087b843c749SSergey Zigachev INIT_WORK(&adev->gfx.sq_work.work, gfx_v8_0_sq_irq_work_func);
2088b843c749SSergey Zigachev
2089b843c749SSergey Zigachev adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE;
2090b843c749SSergey Zigachev
2091b843c749SSergey Zigachev gfx_v8_0_scratch_init(adev);
2092b843c749SSergey Zigachev
2093b843c749SSergey Zigachev r = gfx_v8_0_init_microcode(adev);
2094b843c749SSergey Zigachev if (r) {
2095b843c749SSergey Zigachev DRM_ERROR("Failed to load gfx firmware!\n");
2096b843c749SSergey Zigachev return r;
2097b843c749SSergey Zigachev }
2098b843c749SSergey Zigachev
2099b843c749SSergey Zigachev r = gfx_v8_0_rlc_init(adev);
2100b843c749SSergey Zigachev if (r) {
2101b843c749SSergey Zigachev DRM_ERROR("Failed to init rlc BOs!\n");
2102b843c749SSergey Zigachev return r;
2103b843c749SSergey Zigachev }
2104b843c749SSergey Zigachev
2105b843c749SSergey Zigachev r = gfx_v8_0_mec_init(adev);
2106b843c749SSergey Zigachev if (r) {
2107b843c749SSergey Zigachev DRM_ERROR("Failed to init MEC BOs!\n");
2108b843c749SSergey Zigachev return r;
2109b843c749SSergey Zigachev }
2110b843c749SSergey Zigachev
2111b843c749SSergey Zigachev /* set up the gfx ring */
2112b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
2113b843c749SSergey Zigachev ring = &adev->gfx.gfx_ring[i];
2114b843c749SSergey Zigachev ring->ring_obj = NULL;
211578973132SSergey Zigachev ksprintf(ring->name, "gfx");
2116b843c749SSergey Zigachev /* no gfx doorbells on iceland */
2117b843c749SSergey Zigachev if (adev->asic_type != CHIP_TOPAZ) {
2118b843c749SSergey Zigachev ring->use_doorbell = true;
2119b843c749SSergey Zigachev ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0;
2120b843c749SSergey Zigachev }
2121b843c749SSergey Zigachev
2122b843c749SSergey Zigachev r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,
2123b843c749SSergey Zigachev AMDGPU_CP_IRQ_GFX_EOP);
2124b843c749SSergey Zigachev if (r)
2125b843c749SSergey Zigachev return r;
2126b843c749SSergey Zigachev }
2127b843c749SSergey Zigachev
2128b843c749SSergey Zigachev
2129b843c749SSergey Zigachev /* set up the compute queues - allocate horizontally across pipes */
2130b843c749SSergey Zigachev ring_id = 0;
2131b843c749SSergey Zigachev for (i = 0; i < adev->gfx.mec.num_mec; ++i) {
2132b843c749SSergey Zigachev for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {
2133b843c749SSergey Zigachev for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) {
2134b843c749SSergey Zigachev if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j))
2135b843c749SSergey Zigachev continue;
2136b843c749SSergey Zigachev
2137b843c749SSergey Zigachev r = gfx_v8_0_compute_ring_init(adev,
2138b843c749SSergey Zigachev ring_id,
2139b843c749SSergey Zigachev i, k, j);
2140b843c749SSergey Zigachev if (r)
2141b843c749SSergey Zigachev return r;
2142b843c749SSergey Zigachev
2143b843c749SSergey Zigachev ring_id++;
2144b843c749SSergey Zigachev }
2145b843c749SSergey Zigachev }
2146b843c749SSergey Zigachev }
2147b843c749SSergey Zigachev
2148b843c749SSergey Zigachev r = amdgpu_gfx_kiq_init(adev, GFX8_MEC_HPD_SIZE);
2149b843c749SSergey Zigachev if (r) {
2150b843c749SSergey Zigachev DRM_ERROR("Failed to init KIQ BOs!\n");
2151b843c749SSergey Zigachev return r;
2152b843c749SSergey Zigachev }
2153b843c749SSergey Zigachev
2154b843c749SSergey Zigachev kiq = &adev->gfx.kiq;
2155b843c749SSergey Zigachev r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq);
2156b843c749SSergey Zigachev if (r)
2157b843c749SSergey Zigachev return r;
2158b843c749SSergey Zigachev
2159b843c749SSergey Zigachev /* create MQD for all compute queues as well as KIQ for SRIOV case */
2160b843c749SSergey Zigachev r = amdgpu_gfx_compute_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation));
2161b843c749SSergey Zigachev if (r)
2162b843c749SSergey Zigachev return r;
2163b843c749SSergey Zigachev
2164b843c749SSergey Zigachev /* reserve GDS, GWS and OA resource for gfx */
2165b843c749SSergey Zigachev r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
2166b843c749SSergey Zigachev PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
2167b843c749SSergey Zigachev &adev->gds.gds_gfx_bo, NULL, NULL);
2168b843c749SSergey Zigachev if (r)
2169b843c749SSergey Zigachev return r;
2170b843c749SSergey Zigachev
2171b843c749SSergey Zigachev r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
2172b843c749SSergey Zigachev PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
2173b843c749SSergey Zigachev &adev->gds.gws_gfx_bo, NULL, NULL);
2174b843c749SSergey Zigachev if (r)
2175b843c749SSergey Zigachev return r;
2176b843c749SSergey Zigachev
2177b843c749SSergey Zigachev r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
2178b843c749SSergey Zigachev PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
2179b843c749SSergey Zigachev &adev->gds.oa_gfx_bo, NULL, NULL);
2180b843c749SSergey Zigachev if (r)
2181b843c749SSergey Zigachev return r;
2182b843c749SSergey Zigachev
2183b843c749SSergey Zigachev adev->gfx.ce_ram_size = 0x8000;
2184b843c749SSergey Zigachev
2185b843c749SSergey Zigachev r = gfx_v8_0_gpu_early_init(adev);
2186b843c749SSergey Zigachev if (r)
2187b843c749SSergey Zigachev return r;
2188b843c749SSergey Zigachev
2189b843c749SSergey Zigachev return 0;
2190b843c749SSergey Zigachev }
2191b843c749SSergey Zigachev
gfx_v8_0_sw_fini(void * handle)2192b843c749SSergey Zigachev static int gfx_v8_0_sw_fini(void *handle)
2193b843c749SSergey Zigachev {
2194b843c749SSergey Zigachev int i;
2195b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2196b843c749SSergey Zigachev
2197b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
2198b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
2199b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
2200b843c749SSergey Zigachev
2201b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2202b843c749SSergey Zigachev amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
2203b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++)
2204b843c749SSergey Zigachev amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
2205b843c749SSergey Zigachev
2206b843c749SSergey Zigachev amdgpu_gfx_compute_mqd_sw_fini(adev);
2207b843c749SSergey Zigachev amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq);
2208b843c749SSergey Zigachev amdgpu_gfx_kiq_fini(adev);
2209b843c749SSergey Zigachev
2210b843c749SSergey Zigachev gfx_v8_0_mec_fini(adev);
2211b843c749SSergey Zigachev gfx_v8_0_rlc_fini(adev);
2212b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
221378973132SSergey Zigachev (u64 *)&adev->gfx.rlc.clear_state_gpu_addr,
2214b843c749SSergey Zigachev (void **)&adev->gfx.rlc.cs_ptr);
2215b843c749SSergey Zigachev if ((adev->asic_type == CHIP_CARRIZO) ||
2216b843c749SSergey Zigachev (adev->asic_type == CHIP_STONEY)) {
2217b843c749SSergey Zigachev amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj,
221878973132SSergey Zigachev (u64 *)&adev->gfx.rlc.cp_table_gpu_addr,
2219b843c749SSergey Zigachev (void **)&adev->gfx.rlc.cp_table_ptr);
2220b843c749SSergey Zigachev }
2221b843c749SSergey Zigachev gfx_v8_0_free_microcode(adev);
2222b843c749SSergey Zigachev
2223b843c749SSergey Zigachev return 0;
2224b843c749SSergey Zigachev }
2225b843c749SSergey Zigachev
gfx_v8_0_tiling_mode_table_init(struct amdgpu_device * adev)2226b843c749SSergey Zigachev static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)
2227b843c749SSergey Zigachev {
2228b843c749SSergey Zigachev uint32_t *modearray, *mod2array;
2229b843c749SSergey Zigachev const u32 num_tile_mode_states = ARRAY_SIZE(adev->gfx.config.tile_mode_array);
2230b843c749SSergey Zigachev const u32 num_secondary_tile_mode_states = ARRAY_SIZE(adev->gfx.config.macrotile_mode_array);
2231b843c749SSergey Zigachev u32 reg_offset;
2232b843c749SSergey Zigachev
2233b843c749SSergey Zigachev modearray = adev->gfx.config.tile_mode_array;
2234b843c749SSergey Zigachev mod2array = adev->gfx.config.macrotile_mode_array;
2235b843c749SSergey Zigachev
2236b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2237b843c749SSergey Zigachev modearray[reg_offset] = 0;
2238b843c749SSergey Zigachev
2239b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
2240b843c749SSergey Zigachev mod2array[reg_offset] = 0;
2241b843c749SSergey Zigachev
2242b843c749SSergey Zigachev switch (adev->asic_type) {
2243b843c749SSergey Zigachev case CHIP_TOPAZ:
2244b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2245b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2246b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2247b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2248b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2249b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2250b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2251b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2252b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2253b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2254b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2255b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2256b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2257b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2258b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2259b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2260b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2261b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2262b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2263b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2264b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2265b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2266b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2267b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2268b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2269b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2270b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2271b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2272b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2273b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2));
2274b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2275b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2276b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2277b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2278b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2279b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2280b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2281b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2282b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2283b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2284b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2285b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2286b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2287b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2288b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2289b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2290b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2291b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2292b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2293b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2294b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
2295b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2296b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2297b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2298b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2299b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2300b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2301b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2302b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2303b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2304b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2305b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2306b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2307b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2308b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2309b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2310b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2311b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2312b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2313b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2314b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
2315b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2316b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2317b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2318b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2319b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2320b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2321b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2322b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2323b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2324b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2325b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2326b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
2327b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2328b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2329b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2330b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
2331b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2332b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2333b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2334b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2335b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2336b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2337b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2338b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2339b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2340b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2341b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2342b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2343b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
2344b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2345b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2346b843c749SSergey Zigachev
2347b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2348b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2349b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2350b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2351b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2352b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2353b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2354b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2355b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2356b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2357b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2358b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2359b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2360b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2361b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2362b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2363b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2364b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2365b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2366b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2367b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2368b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2369b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2370b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2371b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2372b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2373b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2374b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2375b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2376b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2377b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2378b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2379b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2380b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2381b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2382b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2383b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2384b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2385b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2386b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2387b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2388b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2389b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2390b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2391b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2392b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2393b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2394b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2395b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2396b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2397b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2398b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2399b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2400b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2401b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2402b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2403b843c749SSergey Zigachev
2404b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2405b843c749SSergey Zigachev if (reg_offset != 7 && reg_offset != 12 && reg_offset != 17 &&
2406b843c749SSergey Zigachev reg_offset != 23)
2407b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
2408b843c749SSergey Zigachev
2409b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
2410b843c749SSergey Zigachev if (reg_offset != 7)
2411b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
2412b843c749SSergey Zigachev
2413b843c749SSergey Zigachev break;
2414b843c749SSergey Zigachev case CHIP_FIJI:
2415b843c749SSergey Zigachev case CHIP_VEGAM:
2416b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2417b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2418b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2419b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2420b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2421b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2422b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2423b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2424b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2425b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2426b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2427b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2428b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2429b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2430b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2431b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2432b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2433b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2434b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2435b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2436b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2437b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2438b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2439b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2440b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2441b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2442b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2443b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2444b843c749SSergey Zigachev modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2445b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2446b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2447b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2448b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2449b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
2450b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2451b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2452b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2453b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2454b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2455b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2456b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2457b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2458b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2459b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2460b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2461b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2462b843c749SSergey Zigachev modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2463b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2464b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2465b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2466b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2467b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2468b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2469b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2470b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2471b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2472b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2473b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2474b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
2475b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2476b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2477b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2478b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2479b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2480b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2481b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2482b843c749SSergey Zigachev modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2483b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2484b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2485b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2486b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2487b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2488b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2489b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2490b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2491b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2492b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2493b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2494b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2495b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2496b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2497b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2498b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
2499b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2500b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2501b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2502b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2503b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2504b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2505b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2506b843c749SSergey Zigachev modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2507b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2508b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2509b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2510b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2511b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2512b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2513b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2514b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
2515b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2516b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2517b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2518b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
2519b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2520b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2521b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2522b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2523b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2524b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2525b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2526b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2527b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2528b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2529b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2530b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2531b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2532b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2533b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2534b843c749SSergey Zigachev modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2535b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2536b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2537b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2538b843c749SSergey Zigachev
2539b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2540b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2541b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2542b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2543b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2544b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2545b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2546b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2547b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2548b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2549b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2550b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2551b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2552b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2553b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2554b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2555b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2556b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2557b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2558b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2559b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2560b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2561b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2562b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2563b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2564b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2565b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2566b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2567b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2568b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2569b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2570b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2571b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2572b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2573b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2574b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2575b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2576b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2577b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2578b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2579b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2580b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2581b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2582b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2583b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2584b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2585b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2586b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2587b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2588b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2589b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2590b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2591b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2592b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2593b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2594b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
2595b843c749SSergey Zigachev
2596b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2597b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
2598b843c749SSergey Zigachev
2599b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
2600b843c749SSergey Zigachev if (reg_offset != 7)
2601b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
2602b843c749SSergey Zigachev
2603b843c749SSergey Zigachev break;
2604b843c749SSergey Zigachev case CHIP_TONGA:
2605b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2606b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2607b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2608b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2609b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2610b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2611b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2612b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2613b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2614b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2615b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2616b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2617b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2618b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2619b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2620b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2621b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2622b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2623b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2624b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2625b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2626b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2627b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2628b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2629b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2630b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2631b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2632b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2633b843c749SSergey Zigachev modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2634b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2635b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2636b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2637b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2638b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
2639b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2640b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2641b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2642b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2643b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2644b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2645b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2646b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2647b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2648b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2649b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2650b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2651b843c749SSergey Zigachev modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2652b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2653b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2654b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2655b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2656b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2657b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2658b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2659b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2660b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2661b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2662b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2663b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
2664b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2665b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2666b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2667b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2668b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2669b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2670b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2671b843c749SSergey Zigachev modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2672b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2673b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2674b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2675b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2676b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2677b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2678b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2679b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2680b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2681b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2682b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2683b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2684b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2685b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2686b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2687b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
2688b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2689b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2690b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2691b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2692b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2693b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2694b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2695b843c749SSergey Zigachev modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2696b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2697b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2698b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2699b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2700b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2701b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2702b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2703b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
2704b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2705b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2706b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2707b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
2708b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2709b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2710b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2711b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2712b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2713b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2714b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2715b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2716b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2717b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2718b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2719b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2720b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2721b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2722b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2723b843c749SSergey Zigachev modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2724b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2725b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2726b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2727b843c749SSergey Zigachev
2728b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2729b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2730b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2731b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2732b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2733b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2734b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2735b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2736b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2737b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2738b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2739b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2740b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2741b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2742b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2743b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2744b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2745b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2746b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2747b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2748b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2749b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2750b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2751b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2752b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2753b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2754b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2755b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2756b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2757b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2758b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2759b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2760b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2761b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2762b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2763b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2764b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2765b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2766b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2767b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2768b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2769b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2770b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2771b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2772b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2773b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2774b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2775b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2776b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2777b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2778b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2779b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
2780b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2781b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2782b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2783b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
2784b843c749SSergey Zigachev
2785b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2786b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
2787b843c749SSergey Zigachev
2788b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
2789b843c749SSergey Zigachev if (reg_offset != 7)
2790b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
2791b843c749SSergey Zigachev
2792b843c749SSergey Zigachev break;
2793b843c749SSergey Zigachev case CHIP_POLARIS11:
2794b843c749SSergey Zigachev case CHIP_POLARIS12:
2795b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2796b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2797b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2798b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2799b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2800b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2801b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2802b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2803b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2804b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2805b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2806b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2807b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2808b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2809b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2810b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2811b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2812b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2813b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2814b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2815b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2816b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2817b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2818b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2819b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2820b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2821b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2822b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2823b843c749SSergey Zigachev modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2824b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2825b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
2826b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2827b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2828b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16));
2829b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2830b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2831b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2832b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2833b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2834b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2835b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2836b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2837b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2838b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2839b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2840b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2841b843c749SSergey Zigachev modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2842b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2843b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2844b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2845b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2846b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2847b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2848b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2849b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2850b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2851b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2852b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2853b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
2854b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2855b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2856b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2857b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2858b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2859b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2860b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2861b843c749SSergey Zigachev modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2862b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2863b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2864b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2865b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2866b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2867b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2868b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2869b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2870b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2871b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2872b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2873b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2874b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2875b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2876b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2877b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
2878b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2879b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2880b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2881b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2882b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2883b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2884b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2885b843c749SSergey Zigachev modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2886b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2887b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2888b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2889b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2890b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2891b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2892b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2893b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
2894b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2895b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2896b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2897b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
2898b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2899b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2900b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2901b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2902b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2903b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2904b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2905b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2906b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2907b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2908b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2909b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2910b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2911b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2912b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2913b843c749SSergey Zigachev modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2914b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2915b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2916b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2917b843c749SSergey Zigachev
2918b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2919b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2920b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2921b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2922b843c749SSergey Zigachev
2923b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2924b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2925b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2926b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2927b843c749SSergey Zigachev
2928b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2929b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2930b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2931b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2932b843c749SSergey Zigachev
2933b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2934b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2935b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2936b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2937b843c749SSergey Zigachev
2938b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2939b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2940b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2941b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2942b843c749SSergey Zigachev
2943b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2944b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2945b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2946b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2947b843c749SSergey Zigachev
2948b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2949b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2950b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2951b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2952b843c749SSergey Zigachev
2953b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2954b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2955b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2956b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2957b843c749SSergey Zigachev
2958b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2959b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2960b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2961b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2962b843c749SSergey Zigachev
2963b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2964b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2965b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2966b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2967b843c749SSergey Zigachev
2968b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2969b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2970b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2971b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2972b843c749SSergey Zigachev
2973b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2974b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2975b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2976b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
2977b843c749SSergey Zigachev
2978b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2979b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2980b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2981b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
2982b843c749SSergey Zigachev
2983b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2984b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2985b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2986b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
2987b843c749SSergey Zigachev
2988b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
2989b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
2990b843c749SSergey Zigachev
2991b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
2992b843c749SSergey Zigachev if (reg_offset != 7)
2993b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
2994b843c749SSergey Zigachev
2995b843c749SSergey Zigachev break;
2996b843c749SSergey Zigachev case CHIP_POLARIS10:
2997b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2998b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2999b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
3000b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3001b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3002b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3003b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
3004b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3005b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3006b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3007b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
3008b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3009b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3010b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3011b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
3012b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3013b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3014b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3015b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3016b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3017b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3018b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3019b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3020b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3021b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3022b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3023b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3024b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3025b843c749SSergey Zigachev modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3026b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
3027b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3028b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3029b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3030b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
3031b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3032b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3033b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3034b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3035b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3036b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3037b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3038b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3039b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3040b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3041b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3042b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3043b843c749SSergey Zigachev modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3044b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
3045b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3046b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3047b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3048b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3049b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3050b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3051b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3052b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3053b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3054b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3055b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
3056b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3057b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3058b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3059b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3060b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3061b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3062b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3063b843c749SSergey Zigachev modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3064b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
3065b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3066b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3067b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3068b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3069b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3070b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3071b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3072b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3073b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3074b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3075b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3076b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3077b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3078b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3079b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
3080b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3081b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3082b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3083b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
3084b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3085b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3086b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3087b843c749SSergey Zigachev modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
3088b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
3089b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3090b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3091b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3092b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3093b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3094b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3095b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
3096b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3097b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3098b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3099b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
3100b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3101b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3102b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3103b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3104b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3105b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3106b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3107b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3108b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3109b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3110b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3111b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3112b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
3113b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3114b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3115b843c749SSergey Zigachev modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3116b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P4_16x16) |
3117b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3118b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3119b843c749SSergey Zigachev
3120b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3121b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3122b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3123b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3124b843c749SSergey Zigachev
3125b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3126b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3127b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3128b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3129b843c749SSergey Zigachev
3130b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3131b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3132b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3133b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3134b843c749SSergey Zigachev
3135b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3136b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3137b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3138b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3139b843c749SSergey Zigachev
3140b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3141b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3142b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3143b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3144b843c749SSergey Zigachev
3145b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3146b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3147b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3148b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3149b843c749SSergey Zigachev
3150b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3151b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3152b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3153b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3154b843c749SSergey Zigachev
3155b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3156b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3157b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3158b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3159b843c749SSergey Zigachev
3160b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3161b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3162b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3163b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3164b843c749SSergey Zigachev
3165b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3166b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3167b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3168b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3169b843c749SSergey Zigachev
3170b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3171b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3172b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3173b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3174b843c749SSergey Zigachev
3175b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3176b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3177b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3178b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3179b843c749SSergey Zigachev
3180b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3181b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3182b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3183b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
3184b843c749SSergey Zigachev
3185b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3186b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3187b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3188b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_4_BANK));
3189b843c749SSergey Zigachev
3190b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
3191b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
3192b843c749SSergey Zigachev
3193b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
3194b843c749SSergey Zigachev if (reg_offset != 7)
3195b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
3196b843c749SSergey Zigachev
3197b843c749SSergey Zigachev break;
3198b843c749SSergey Zigachev case CHIP_STONEY:
3199b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3200b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3201b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
3202b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3203b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3204b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3205b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
3206b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3207b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3208b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3209b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
3210b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3211b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3212b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3213b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
3214b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3215b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3216b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3217b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3218b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3219b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3220b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3221b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3222b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3223b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3224b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3225b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3226b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3227b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3228b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2));
3229b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3230b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3231b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3232b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3233b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3234b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3235b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3236b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3237b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3238b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3239b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3240b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3241b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3242b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3243b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3244b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3245b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3246b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3247b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3248b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3249b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
3250b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3251b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3252b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3253b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3254b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3255b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3256b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3257b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3258b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3259b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3260b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3261b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3262b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3263b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3264b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3265b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3266b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3267b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3268b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3269b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
3270b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3271b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3272b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3273b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
3274b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3275b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3276b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3277b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3278b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3279b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3280b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3281b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
3282b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3283b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3284b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3285b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
3286b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3287b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3288b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3289b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3290b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3291b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3292b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3293b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3294b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3295b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3296b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3297b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3298b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3299b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3300b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3301b843c749SSergey Zigachev
3302b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3303b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3304b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3305b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3306b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3307b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3308b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3309b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3310b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3311b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3312b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3313b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3314b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3315b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3316b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3317b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3318b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3319b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3320b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3321b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3322b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3323b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3324b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3325b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3326b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3327b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3328b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3329b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3330b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3331b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3332b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3333b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3334b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3335b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3336b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3337b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3338b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3339b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3340b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3341b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3342b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3343b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3344b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3345b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3346b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3347b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3348b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3349b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3350b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3351b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3352b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3353b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3354b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3355b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3356b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3357b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3358b843c749SSergey Zigachev
3359b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
3360b843c749SSergey Zigachev if (reg_offset != 7 && reg_offset != 12 && reg_offset != 17 &&
3361b843c749SSergey Zigachev reg_offset != 23)
3362b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
3363b843c749SSergey Zigachev
3364b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
3365b843c749SSergey Zigachev if (reg_offset != 7)
3366b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
3367b843c749SSergey Zigachev
3368b843c749SSergey Zigachev break;
3369b843c749SSergey Zigachev default:
3370b843c749SSergey Zigachev dev_warn(adev->dev,
3371b843c749SSergey Zigachev "Unknown chip type (%d) in function gfx_v8_0_tiling_mode_table_init() falling through to CHIP_CARRIZO\n",
3372b843c749SSergey Zigachev adev->asic_type);
3373b843c749SSergey Zigachev
3374b843c749SSergey Zigachev case CHIP_CARRIZO:
3375b843c749SSergey Zigachev modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3376b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3377b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
3378b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3379b843c749SSergey Zigachev modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3380b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3381b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
3382b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3383b843c749SSergey Zigachev modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3384b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3385b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
3386b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3387b843c749SSergey Zigachev modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3388b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3389b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
3390b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3391b843c749SSergey Zigachev modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3392b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3393b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3394b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3395b843c749SSergey Zigachev modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3396b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3397b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3398b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3399b843c749SSergey Zigachev modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3400b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3401b843c749SSergey Zigachev TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
3402b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3403b843c749SSergey Zigachev modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3404b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2));
3405b843c749SSergey Zigachev modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3406b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3407b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3408b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3409b843c749SSergey Zigachev modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3410b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3411b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3412b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3413b843c749SSergey Zigachev modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3414b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3415b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3416b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3417b843c749SSergey Zigachev modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3418b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3419b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3420b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3421b843c749SSergey Zigachev modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3422b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3423b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3424b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3425b843c749SSergey Zigachev modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
3426b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3427b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3428b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3429b843c749SSergey Zigachev modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3430b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3431b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3432b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3433b843c749SSergey Zigachev modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3434b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3435b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3436b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3437b843c749SSergey Zigachev modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
3438b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3439b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3440b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3441b843c749SSergey Zigachev modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3442b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3443b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3444b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3445b843c749SSergey Zigachev modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
3446b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3447b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3448b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3449b843c749SSergey Zigachev modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
3450b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3451b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3452b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3453b843c749SSergey Zigachev modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
3454b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3455b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3456b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3457b843c749SSergey Zigachev modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
3458b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3459b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3460b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3461b843c749SSergey Zigachev modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
3462b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3463b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
3464b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
3465b843c749SSergey Zigachev modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3466b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3467b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3468b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3469b843c749SSergey Zigachev modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3470b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3471b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3472b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3473b843c749SSergey Zigachev modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3474b843c749SSergey Zigachev PIPE_CONFIG(ADDR_SURF_P2) |
3475b843c749SSergey Zigachev MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3476b843c749SSergey Zigachev SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
3477b843c749SSergey Zigachev
3478b843c749SSergey Zigachev mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3479b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3480b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3481b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3482b843c749SSergey Zigachev mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3483b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3484b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3485b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3486b843c749SSergey Zigachev mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3487b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3488b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3489b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3490b843c749SSergey Zigachev mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3491b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3492b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3493b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3494b843c749SSergey Zigachev mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3495b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3496b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3497b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3498b843c749SSergey Zigachev mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3499b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3500b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3501b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3502b843c749SSergey Zigachev mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3503b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3504b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3505b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3506b843c749SSergey Zigachev mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3507b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3508b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3509b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3510b843c749SSergey Zigachev mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3511b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3512b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3513b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3514b843c749SSergey Zigachev mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3515b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3516b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3517b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3518b843c749SSergey Zigachev mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3519b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3520b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3521b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3522b843c749SSergey Zigachev mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3523b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3524b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3525b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3526b843c749SSergey Zigachev mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3527b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3528b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3529b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_16_BANK));
3530b843c749SSergey Zigachev mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3531b843c749SSergey Zigachev BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3532b843c749SSergey Zigachev MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3533b843c749SSergey Zigachev NUM_BANKS(ADDR_SURF_8_BANK));
3534b843c749SSergey Zigachev
3535b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
3536b843c749SSergey Zigachev if (reg_offset != 7 && reg_offset != 12 && reg_offset != 17 &&
3537b843c749SSergey Zigachev reg_offset != 23)
3538b843c749SSergey Zigachev WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
3539b843c749SSergey Zigachev
3540b843c749SSergey Zigachev for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
3541b843c749SSergey Zigachev if (reg_offset != 7)
3542b843c749SSergey Zigachev WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
3543b843c749SSergey Zigachev
3544b843c749SSergey Zigachev break;
3545b843c749SSergey Zigachev }
3546b843c749SSergey Zigachev }
3547b843c749SSergey Zigachev
gfx_v8_0_select_se_sh(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 instance)3548b843c749SSergey Zigachev static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,
3549b843c749SSergey Zigachev u32 se_num, u32 sh_num, u32 instance)
3550b843c749SSergey Zigachev {
3551b843c749SSergey Zigachev u32 data;
3552b843c749SSergey Zigachev
3553b843c749SSergey Zigachev if (instance == 0xffffffff)
3554b843c749SSergey Zigachev data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1);
3555b843c749SSergey Zigachev else
3556b843c749SSergey Zigachev data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance);
3557b843c749SSergey Zigachev
3558b843c749SSergey Zigachev if (se_num == 0xffffffff)
3559b843c749SSergey Zigachev data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
3560b843c749SSergey Zigachev else
3561b843c749SSergey Zigachev data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
3562b843c749SSergey Zigachev
3563b843c749SSergey Zigachev if (sh_num == 0xffffffff)
3564b843c749SSergey Zigachev data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
3565b843c749SSergey Zigachev else
3566b843c749SSergey Zigachev data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
3567b843c749SSergey Zigachev
3568b843c749SSergey Zigachev WREG32(mmGRBM_GFX_INDEX, data);
3569b843c749SSergey Zigachev }
3570b843c749SSergey Zigachev
gfx_v8_0_select_me_pipe_q(struct amdgpu_device * adev,u32 me,u32 pipe,u32 q)3571b843c749SSergey Zigachev static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev,
3572b843c749SSergey Zigachev u32 me, u32 pipe, u32 q)
3573b843c749SSergey Zigachev {
3574b843c749SSergey Zigachev vi_srbm_select(adev, me, pipe, q, 0);
3575b843c749SSergey Zigachev }
3576b843c749SSergey Zigachev
gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device * adev)3577b843c749SSergey Zigachev static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
3578b843c749SSergey Zigachev {
3579b843c749SSergey Zigachev u32 data, mask;
3580b843c749SSergey Zigachev
3581b843c749SSergey Zigachev data = RREG32(mmCC_RB_BACKEND_DISABLE) |
3582b843c749SSergey Zigachev RREG32(mmGC_USER_RB_BACKEND_DISABLE);
3583b843c749SSergey Zigachev
3584b843c749SSergey Zigachev data = REG_GET_FIELD(data, GC_USER_RB_BACKEND_DISABLE, BACKEND_DISABLE);
3585b843c749SSergey Zigachev
3586b843c749SSergey Zigachev mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_backends_per_se /
3587b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se);
3588b843c749SSergey Zigachev
3589b843c749SSergey Zigachev return (~data) & mask;
3590b843c749SSergey Zigachev }
3591b843c749SSergey Zigachev
3592b843c749SSergey Zigachev static void
gfx_v8_0_raster_config(struct amdgpu_device * adev,u32 * rconf,u32 * rconf1)3593b843c749SSergey Zigachev gfx_v8_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1)
3594b843c749SSergey Zigachev {
3595b843c749SSergey Zigachev switch (adev->asic_type) {
3596b843c749SSergey Zigachev case CHIP_FIJI:
3597b843c749SSergey Zigachev case CHIP_VEGAM:
3598b843c749SSergey Zigachev *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) |
3599b843c749SSergey Zigachev RB_XSEL2(1) | PKR_MAP(2) |
3600b843c749SSergey Zigachev PKR_XSEL(1) | PKR_YSEL(1) |
3601b843c749SSergey Zigachev SE_MAP(2) | SE_XSEL(2) | SE_YSEL(3);
3602b843c749SSergey Zigachev *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) |
3603b843c749SSergey Zigachev SE_PAIR_YSEL(2);
3604b843c749SSergey Zigachev break;
3605b843c749SSergey Zigachev case CHIP_TONGA:
3606b843c749SSergey Zigachev case CHIP_POLARIS10:
3607b843c749SSergey Zigachev *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3608b843c749SSergey Zigachev SE_XSEL(1) | SE_YSEL(1);
3609b843c749SSergey Zigachev *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(2) |
3610b843c749SSergey Zigachev SE_PAIR_YSEL(2);
3611b843c749SSergey Zigachev break;
3612b843c749SSergey Zigachev case CHIP_TOPAZ:
3613b843c749SSergey Zigachev case CHIP_CARRIZO:
3614b843c749SSergey Zigachev *rconf |= RB_MAP_PKR0(2);
3615b843c749SSergey Zigachev *rconf1 |= 0x0;
3616b843c749SSergey Zigachev break;
3617b843c749SSergey Zigachev case CHIP_POLARIS11:
3618b843c749SSergey Zigachev case CHIP_POLARIS12:
3619b843c749SSergey Zigachev *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3620b843c749SSergey Zigachev SE_XSEL(1) | SE_YSEL(1);
3621b843c749SSergey Zigachev *rconf1 |= 0x0;
3622b843c749SSergey Zigachev break;
3623b843c749SSergey Zigachev case CHIP_STONEY:
3624b843c749SSergey Zigachev *rconf |= 0x0;
3625b843c749SSergey Zigachev *rconf1 |= 0x0;
3626b843c749SSergey Zigachev break;
3627b843c749SSergey Zigachev default:
3628b843c749SSergey Zigachev DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
3629b843c749SSergey Zigachev break;
3630b843c749SSergey Zigachev }
3631b843c749SSergey Zigachev }
3632b843c749SSergey Zigachev
3633b843c749SSergey Zigachev static void
gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device * adev,u32 raster_config,u32 raster_config_1,unsigned rb_mask,unsigned num_rb)3634b843c749SSergey Zigachev gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device *adev,
3635b843c749SSergey Zigachev u32 raster_config, u32 raster_config_1,
3636b843c749SSergey Zigachev unsigned rb_mask, unsigned num_rb)
3637b843c749SSergey Zigachev {
3638b843c749SSergey Zigachev unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1);
3639b843c749SSergey Zigachev unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1);
3640b843c749SSergey Zigachev unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2);
3641b843c749SSergey Zigachev unsigned rb_per_se = num_rb / num_se;
3642b843c749SSergey Zigachev unsigned se_mask[4];
3643b843c749SSergey Zigachev unsigned se;
3644b843c749SSergey Zigachev
3645b843c749SSergey Zigachev se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
3646b843c749SSergey Zigachev se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
3647b843c749SSergey Zigachev se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
3648b843c749SSergey Zigachev se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;
3649b843c749SSergey Zigachev
3650b843c749SSergey Zigachev WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4));
3651b843c749SSergey Zigachev WARN_ON(!(sh_per_se == 1 || sh_per_se == 2));
3652b843c749SSergey Zigachev WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2));
3653b843c749SSergey Zigachev
3654b843c749SSergey Zigachev if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) ||
3655b843c749SSergey Zigachev (!se_mask[2] && !se_mask[3]))) {
3656b843c749SSergey Zigachev raster_config_1 &= ~SE_PAIR_MAP_MASK;
3657b843c749SSergey Zigachev
3658b843c749SSergey Zigachev if (!se_mask[0] && !se_mask[1]) {
3659b843c749SSergey Zigachev raster_config_1 |=
3660b843c749SSergey Zigachev SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3);
3661b843c749SSergey Zigachev } else {
3662b843c749SSergey Zigachev raster_config_1 |=
3663b843c749SSergey Zigachev SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0);
3664b843c749SSergey Zigachev }
3665b843c749SSergey Zigachev }
3666b843c749SSergey Zigachev
3667b843c749SSergey Zigachev for (se = 0; se < num_se; se++) {
3668b843c749SSergey Zigachev unsigned raster_config_se = raster_config;
3669b843c749SSergey Zigachev unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
3670b843c749SSergey Zigachev unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
3671b843c749SSergey Zigachev int idx = (se / 2) * 2;
3672b843c749SSergey Zigachev
3673b843c749SSergey Zigachev if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
3674b843c749SSergey Zigachev raster_config_se &= ~SE_MAP_MASK;
3675b843c749SSergey Zigachev
3676b843c749SSergey Zigachev if (!se_mask[idx]) {
3677b843c749SSergey Zigachev raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3);
3678b843c749SSergey Zigachev } else {
3679b843c749SSergey Zigachev raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0);
3680b843c749SSergey Zigachev }
3681b843c749SSergey Zigachev }
3682b843c749SSergey Zigachev
3683b843c749SSergey Zigachev pkr0_mask &= rb_mask;
3684b843c749SSergey Zigachev pkr1_mask &= rb_mask;
3685b843c749SSergey Zigachev if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
3686b843c749SSergey Zigachev raster_config_se &= ~PKR_MAP_MASK;
3687b843c749SSergey Zigachev
3688b843c749SSergey Zigachev if (!pkr0_mask) {
3689b843c749SSergey Zigachev raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3);
3690b843c749SSergey Zigachev } else {
3691b843c749SSergey Zigachev raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0);
3692b843c749SSergey Zigachev }
3693b843c749SSergey Zigachev }
3694b843c749SSergey Zigachev
3695b843c749SSergey Zigachev if (rb_per_se >= 2) {
3696b843c749SSergey Zigachev unsigned rb0_mask = 1 << (se * rb_per_se);
3697b843c749SSergey Zigachev unsigned rb1_mask = rb0_mask << 1;
3698b843c749SSergey Zigachev
3699b843c749SSergey Zigachev rb0_mask &= rb_mask;
3700b843c749SSergey Zigachev rb1_mask &= rb_mask;
3701b843c749SSergey Zigachev if (!rb0_mask || !rb1_mask) {
3702b843c749SSergey Zigachev raster_config_se &= ~RB_MAP_PKR0_MASK;
3703b843c749SSergey Zigachev
3704b843c749SSergey Zigachev if (!rb0_mask) {
3705b843c749SSergey Zigachev raster_config_se |=
3706b843c749SSergey Zigachev RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3);
3707b843c749SSergey Zigachev } else {
3708b843c749SSergey Zigachev raster_config_se |=
3709b843c749SSergey Zigachev RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0);
3710b843c749SSergey Zigachev }
3711b843c749SSergey Zigachev }
3712b843c749SSergey Zigachev
3713b843c749SSergey Zigachev if (rb_per_se > 2) {
3714b843c749SSergey Zigachev rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
3715b843c749SSergey Zigachev rb1_mask = rb0_mask << 1;
3716b843c749SSergey Zigachev rb0_mask &= rb_mask;
3717b843c749SSergey Zigachev rb1_mask &= rb_mask;
3718b843c749SSergey Zigachev if (!rb0_mask || !rb1_mask) {
3719b843c749SSergey Zigachev raster_config_se &= ~RB_MAP_PKR1_MASK;
3720b843c749SSergey Zigachev
3721b843c749SSergey Zigachev if (!rb0_mask) {
3722b843c749SSergey Zigachev raster_config_se |=
3723b843c749SSergey Zigachev RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3);
3724b843c749SSergey Zigachev } else {
3725b843c749SSergey Zigachev raster_config_se |=
3726b843c749SSergey Zigachev RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0);
3727b843c749SSergey Zigachev }
3728b843c749SSergey Zigachev }
3729b843c749SSergey Zigachev }
3730b843c749SSergey Zigachev }
3731b843c749SSergey Zigachev
3732b843c749SSergey Zigachev /* GRBM_GFX_INDEX has a different offset on VI */
3733b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff);
3734b843c749SSergey Zigachev WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);
3735b843c749SSergey Zigachev WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3736b843c749SSergey Zigachev }
3737b843c749SSergey Zigachev
3738b843c749SSergey Zigachev /* GRBM_GFX_INDEX has a different offset on VI */
3739b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3740b843c749SSergey Zigachev }
3741b843c749SSergey Zigachev
gfx_v8_0_setup_rb(struct amdgpu_device * adev)3742b843c749SSergey Zigachev static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
3743b843c749SSergey Zigachev {
3744b843c749SSergey Zigachev int i, j;
3745b843c749SSergey Zigachev u32 data;
3746b843c749SSergey Zigachev u32 raster_config = 0, raster_config_1 = 0;
3747b843c749SSergey Zigachev u32 active_rbs = 0;
3748b843c749SSergey Zigachev u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
3749b843c749SSergey Zigachev adev->gfx.config.max_sh_per_se;
3750b843c749SSergey Zigachev unsigned num_rb_pipes;
3751b843c749SSergey Zigachev
3752b843c749SSergey Zigachev mutex_lock(&adev->grbm_idx_mutex);
3753b843c749SSergey Zigachev for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3754b843c749SSergey Zigachev for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3755b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff);
3756b843c749SSergey Zigachev data = gfx_v8_0_get_rb_active_bitmap(adev);
3757b843c749SSergey Zigachev active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
3758b843c749SSergey Zigachev rb_bitmap_width_per_sh);
3759b843c749SSergey Zigachev }
3760b843c749SSergey Zigachev }
3761b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3762b843c749SSergey Zigachev
3763b843c749SSergey Zigachev adev->gfx.config.backend_enable_mask = active_rbs;
3764b843c749SSergey Zigachev adev->gfx.config.num_rbs = hweight32(active_rbs);
3765b843c749SSergey Zigachev
3766b843c749SSergey Zigachev num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
3767b843c749SSergey Zigachev adev->gfx.config.max_shader_engines, 16);
3768b843c749SSergey Zigachev
3769b843c749SSergey Zigachev gfx_v8_0_raster_config(adev, &raster_config, &raster_config_1);
3770b843c749SSergey Zigachev
3771b843c749SSergey Zigachev if (!adev->gfx.config.backend_enable_mask ||
3772b843c749SSergey Zigachev adev->gfx.config.num_rbs >= num_rb_pipes) {
3773b843c749SSergey Zigachev WREG32(mmPA_SC_RASTER_CONFIG, raster_config);
3774b843c749SSergey Zigachev WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3775b843c749SSergey Zigachev } else {
3776b843c749SSergey Zigachev gfx_v8_0_write_harvested_raster_configs(adev, raster_config, raster_config_1,
3777b843c749SSergey Zigachev adev->gfx.config.backend_enable_mask,
3778b843c749SSergey Zigachev num_rb_pipes);
3779b843c749SSergey Zigachev }
3780b843c749SSergey Zigachev
3781b843c749SSergey Zigachev /* cache the values for userspace */
3782b843c749SSergey Zigachev for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3783b843c749SSergey Zigachev for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3784b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff);
3785b843c749SSergey Zigachev adev->gfx.config.rb_config[i][j].rb_backend_disable =
3786b843c749SSergey Zigachev RREG32(mmCC_RB_BACKEND_DISABLE);
3787b843c749SSergey Zigachev adev->gfx.config.rb_config[i][j].user_rb_backend_disable =
3788b843c749SSergey Zigachev RREG32(mmGC_USER_RB_BACKEND_DISABLE);
3789b843c749SSergey Zigachev adev->gfx.config.rb_config[i][j].raster_config =
3790b843c749SSergey Zigachev RREG32(mmPA_SC_RASTER_CONFIG);
3791b843c749SSergey Zigachev adev->gfx.config.rb_config[i][j].raster_config_1 =
3792b843c749SSergey Zigachev RREG32(mmPA_SC_RASTER_CONFIG_1);
3793b843c749SSergey Zigachev }
3794b843c749SSergey Zigachev }
3795b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3796b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
3797b843c749SSergey Zigachev }
3798b843c749SSergey Zigachev
3799b843c749SSergey Zigachev /**
3800b843c749SSergey Zigachev * gfx_v8_0_init_compute_vmid - gart enable
3801b843c749SSergey Zigachev *
3802b843c749SSergey Zigachev * @adev: amdgpu_device pointer
3803b843c749SSergey Zigachev *
3804b843c749SSergey Zigachev * Initialize compute vmid sh_mem registers
3805b843c749SSergey Zigachev *
3806b843c749SSergey Zigachev */
3807b843c749SSergey Zigachev #define DEFAULT_SH_MEM_BASES (0x6000)
3808b843c749SSergey Zigachev #define FIRST_COMPUTE_VMID (8)
3809b843c749SSergey Zigachev #define LAST_COMPUTE_VMID (16)
gfx_v8_0_init_compute_vmid(struct amdgpu_device * adev)3810b843c749SSergey Zigachev static void gfx_v8_0_init_compute_vmid(struct amdgpu_device *adev)
3811b843c749SSergey Zigachev {
3812b843c749SSergey Zigachev int i;
3813b843c749SSergey Zigachev uint32_t sh_mem_config;
3814b843c749SSergey Zigachev uint32_t sh_mem_bases;
3815b843c749SSergey Zigachev
3816b843c749SSergey Zigachev /*
3817b843c749SSergey Zigachev * Configure apertures:
3818b843c749SSergey Zigachev * LDS: 0x60000000'00000000 - 0x60000001'00000000 (4GB)
3819b843c749SSergey Zigachev * Scratch: 0x60000001'00000000 - 0x60000002'00000000 (4GB)
3820b843c749SSergey Zigachev * GPUVM: 0x60010000'00000000 - 0x60020000'00000000 (1TB)
3821b843c749SSergey Zigachev */
3822b843c749SSergey Zigachev sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16);
3823b843c749SSergey Zigachev
3824b843c749SSergey Zigachev sh_mem_config = SH_MEM_ADDRESS_MODE_HSA64 <<
3825b843c749SSergey Zigachev SH_MEM_CONFIG__ADDRESS_MODE__SHIFT |
3826b843c749SSergey Zigachev SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
3827b843c749SSergey Zigachev SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT |
3828b843c749SSergey Zigachev MTYPE_CC << SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT |
3829b843c749SSergey Zigachev SH_MEM_CONFIG__PRIVATE_ATC_MASK;
3830b843c749SSergey Zigachev
3831b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
3832b843c749SSergey Zigachev for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
3833b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, i);
3834b843c749SSergey Zigachev /* CP and shaders */
3835b843c749SSergey Zigachev WREG32(mmSH_MEM_CONFIG, sh_mem_config);
3836b843c749SSergey Zigachev WREG32(mmSH_MEM_APE1_BASE, 1);
3837b843c749SSergey Zigachev WREG32(mmSH_MEM_APE1_LIMIT, 0);
3838b843c749SSergey Zigachev WREG32(mmSH_MEM_BASES, sh_mem_bases);
3839b843c749SSergey Zigachev }
3840b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
3841b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
3842b843c749SSergey Zigachev }
3843b843c749SSergey Zigachev
gfx_v8_0_config_init(struct amdgpu_device * adev)3844b843c749SSergey Zigachev static void gfx_v8_0_config_init(struct amdgpu_device *adev)
3845b843c749SSergey Zigachev {
3846b843c749SSergey Zigachev switch (adev->asic_type) {
3847b843c749SSergey Zigachev default:
3848b843c749SSergey Zigachev adev->gfx.config.double_offchip_lds_buf = 1;
3849b843c749SSergey Zigachev break;
3850b843c749SSergey Zigachev case CHIP_CARRIZO:
3851b843c749SSergey Zigachev case CHIP_STONEY:
3852b843c749SSergey Zigachev adev->gfx.config.double_offchip_lds_buf = 0;
3853b843c749SSergey Zigachev break;
3854b843c749SSergey Zigachev }
3855b843c749SSergey Zigachev }
3856b843c749SSergey Zigachev
gfx_v8_0_gpu_init(struct amdgpu_device * adev)3857b843c749SSergey Zigachev static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
3858b843c749SSergey Zigachev {
3859b843c749SSergey Zigachev u32 tmp, sh_static_mem_cfg;
3860b843c749SSergey Zigachev int i;
3861b843c749SSergey Zigachev
3862b843c749SSergey Zigachev WREG32_FIELD(GRBM_CNTL, READ_TIMEOUT, 0xFF);
3863b843c749SSergey Zigachev WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
3864b843c749SSergey Zigachev WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
3865b843c749SSergey Zigachev WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
3866b843c749SSergey Zigachev
3867b843c749SSergey Zigachev gfx_v8_0_tiling_mode_table_init(adev);
3868b843c749SSergey Zigachev gfx_v8_0_setup_rb(adev);
3869b843c749SSergey Zigachev gfx_v8_0_get_cu_info(adev);
3870b843c749SSergey Zigachev gfx_v8_0_config_init(adev);
3871b843c749SSergey Zigachev
3872b843c749SSergey Zigachev /* XXX SH_MEM regs */
3873b843c749SSergey Zigachev /* where to put LDS, scratch, GPUVM in FSA64 space */
3874b843c749SSergey Zigachev sh_static_mem_cfg = REG_SET_FIELD(0, SH_STATIC_MEM_CONFIG,
3875b843c749SSergey Zigachev SWIZZLE_ENABLE, 1);
3876b843c749SSergey Zigachev sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG,
3877b843c749SSergey Zigachev ELEMENT_SIZE, 1);
3878b843c749SSergey Zigachev sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG,
3879b843c749SSergey Zigachev INDEX_STRIDE, 3);
3880b843c749SSergey Zigachev WREG32(mmSH_STATIC_MEM_CONFIG, sh_static_mem_cfg);
3881b843c749SSergey Zigachev
3882b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
3883b843c749SSergey Zigachev for (i = 0; i < adev->vm_manager.id_mgr[0].num_ids; i++) {
3884b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, i);
3885b843c749SSergey Zigachev /* CP and shaders */
3886b843c749SSergey Zigachev if (i == 0) {
3887b843c749SSergey Zigachev tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_UC);
3888b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC);
3889b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
3890b843c749SSergey Zigachev SH_MEM_ALIGNMENT_MODE_UNALIGNED);
3891b843c749SSergey Zigachev WREG32(mmSH_MEM_CONFIG, tmp);
3892b843c749SSergey Zigachev WREG32(mmSH_MEM_BASES, 0);
3893b843c749SSergey Zigachev } else {
3894b843c749SSergey Zigachev tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_NC);
3895b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC);
3896b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
3897b843c749SSergey Zigachev SH_MEM_ALIGNMENT_MODE_UNALIGNED);
3898b843c749SSergey Zigachev WREG32(mmSH_MEM_CONFIG, tmp);
3899b843c749SSergey Zigachev tmp = adev->gmc.shared_aperture_start >> 48;
3900b843c749SSergey Zigachev WREG32(mmSH_MEM_BASES, tmp);
3901b843c749SSergey Zigachev }
3902b843c749SSergey Zigachev
3903b843c749SSergey Zigachev WREG32(mmSH_MEM_APE1_BASE, 1);
3904b843c749SSergey Zigachev WREG32(mmSH_MEM_APE1_LIMIT, 0);
3905b843c749SSergey Zigachev }
3906b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
3907b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
3908b843c749SSergey Zigachev
3909b843c749SSergey Zigachev gfx_v8_0_init_compute_vmid(adev);
3910b843c749SSergey Zigachev
3911b843c749SSergey Zigachev mutex_lock(&adev->grbm_idx_mutex);
3912b843c749SSergey Zigachev /*
3913b843c749SSergey Zigachev * making sure that the following register writes will be broadcasted
3914b843c749SSergey Zigachev * to all the shaders
3915b843c749SSergey Zigachev */
3916b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3917b843c749SSergey Zigachev
3918b843c749SSergey Zigachev WREG32(mmPA_SC_FIFO_SIZE,
3919b843c749SSergey Zigachev (adev->gfx.config.sc_prim_fifo_size_frontend <<
3920b843c749SSergey Zigachev PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) |
3921b843c749SSergey Zigachev (adev->gfx.config.sc_prim_fifo_size_backend <<
3922b843c749SSergey Zigachev PA_SC_FIFO_SIZE__SC_BACKEND_PRIM_FIFO_SIZE__SHIFT) |
3923b843c749SSergey Zigachev (adev->gfx.config.sc_hiz_tile_fifo_size <<
3924b843c749SSergey Zigachev PA_SC_FIFO_SIZE__SC_HIZ_TILE_FIFO_SIZE__SHIFT) |
3925b843c749SSergey Zigachev (adev->gfx.config.sc_earlyz_tile_fifo_size <<
3926b843c749SSergey Zigachev PA_SC_FIFO_SIZE__SC_EARLYZ_TILE_FIFO_SIZE__SHIFT));
3927b843c749SSergey Zigachev
3928b843c749SSergey Zigachev tmp = RREG32(mmSPI_ARB_PRIORITY);
3929b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS0, 2);
3930b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS1, 2);
3931b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS2, 2);
3932b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS3, 2);
3933b843c749SSergey Zigachev WREG32(mmSPI_ARB_PRIORITY, tmp);
3934b843c749SSergey Zigachev
3935b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
3936b843c749SSergey Zigachev
3937b843c749SSergey Zigachev }
3938b843c749SSergey Zigachev
gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device * adev)3939b843c749SSergey Zigachev static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
3940b843c749SSergey Zigachev {
3941b843c749SSergey Zigachev u32 i, j, k;
3942b843c749SSergey Zigachev u32 mask;
3943b843c749SSergey Zigachev
3944b843c749SSergey Zigachev mutex_lock(&adev->grbm_idx_mutex);
3945b843c749SSergey Zigachev for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3946b843c749SSergey Zigachev for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3947b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff);
3948b843c749SSergey Zigachev for (k = 0; k < adev->usec_timeout; k++) {
3949b843c749SSergey Zigachev if (RREG32(mmRLC_SERDES_CU_MASTER_BUSY) == 0)
3950b843c749SSergey Zigachev break;
3951b843c749SSergey Zigachev udelay(1);
3952b843c749SSergey Zigachev }
3953b843c749SSergey Zigachev if (k == adev->usec_timeout) {
3954b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff,
3955b843c749SSergey Zigachev 0xffffffff, 0xffffffff);
3956b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
3957b843c749SSergey Zigachev DRM_INFO("Timeout wait for RLC serdes %u,%u\n",
3958b843c749SSergey Zigachev i, j);
3959b843c749SSergey Zigachev return;
3960b843c749SSergey Zigachev }
3961b843c749SSergey Zigachev }
3962b843c749SSergey Zigachev }
3963b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3964b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
3965b843c749SSergey Zigachev
3966b843c749SSergey Zigachev mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK |
3967b843c749SSergey Zigachev RLC_SERDES_NONCU_MASTER_BUSY__GC_MASTER_BUSY_MASK |
3968b843c749SSergey Zigachev RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK |
3969b843c749SSergey Zigachev RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK;
3970b843c749SSergey Zigachev for (k = 0; k < adev->usec_timeout; k++) {
3971b843c749SSergey Zigachev if ((RREG32(mmRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
3972b843c749SSergey Zigachev break;
3973b843c749SSergey Zigachev udelay(1);
3974b843c749SSergey Zigachev }
3975b843c749SSergey Zigachev }
3976b843c749SSergey Zigachev
gfx_v8_0_enable_gui_idle_interrupt(struct amdgpu_device * adev,bool enable)3977b843c749SSergey Zigachev static void gfx_v8_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
3978b843c749SSergey Zigachev bool enable)
3979b843c749SSergey Zigachev {
3980b843c749SSergey Zigachev u32 tmp = RREG32(mmCP_INT_CNTL_RING0);
3981b843c749SSergey Zigachev
3982b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE, enable ? 1 : 0);
3983b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_EMPTY_INT_ENABLE, enable ? 1 : 0);
3984b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0);
3985b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, GFX_IDLE_INT_ENABLE, enable ? 1 : 0);
3986b843c749SSergey Zigachev
3987b843c749SSergey Zigachev WREG32(mmCP_INT_CNTL_RING0, tmp);
3988b843c749SSergey Zigachev }
3989b843c749SSergey Zigachev
gfx_v8_0_init_csb(struct amdgpu_device * adev)3990b843c749SSergey Zigachev static void gfx_v8_0_init_csb(struct amdgpu_device *adev)
3991b843c749SSergey Zigachev {
3992b843c749SSergey Zigachev /* csib */
3993b843c749SSergey Zigachev WREG32(mmRLC_CSIB_ADDR_HI,
3994b843c749SSergey Zigachev adev->gfx.rlc.clear_state_gpu_addr >> 32);
3995b843c749SSergey Zigachev WREG32(mmRLC_CSIB_ADDR_LO,
3996b843c749SSergey Zigachev adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc);
3997b843c749SSergey Zigachev WREG32(mmRLC_CSIB_LENGTH,
3998b843c749SSergey Zigachev adev->gfx.rlc.clear_state_size);
3999b843c749SSergey Zigachev }
4000b843c749SSergey Zigachev
gfx_v8_0_parse_ind_reg_list(int * register_list_format,int ind_offset,int list_size,int * unique_indices,int * indices_count,int max_indices,int * ind_start_offsets,int * offset_count,int max_offset)4001b843c749SSergey Zigachev static void gfx_v8_0_parse_ind_reg_list(int *register_list_format,
4002b843c749SSergey Zigachev int ind_offset,
4003b843c749SSergey Zigachev int list_size,
4004b843c749SSergey Zigachev int *unique_indices,
4005b843c749SSergey Zigachev int *indices_count,
4006b843c749SSergey Zigachev int max_indices,
4007b843c749SSergey Zigachev int *ind_start_offsets,
4008b843c749SSergey Zigachev int *offset_count,
4009b843c749SSergey Zigachev int max_offset)
4010b843c749SSergey Zigachev {
4011b843c749SSergey Zigachev int indices;
4012b843c749SSergey Zigachev bool new_entry = true;
4013b843c749SSergey Zigachev
4014b843c749SSergey Zigachev for (; ind_offset < list_size; ind_offset++) {
4015b843c749SSergey Zigachev
4016b843c749SSergey Zigachev if (new_entry) {
4017b843c749SSergey Zigachev new_entry = false;
4018b843c749SSergey Zigachev ind_start_offsets[*offset_count] = ind_offset;
4019b843c749SSergey Zigachev *offset_count = *offset_count + 1;
4020b843c749SSergey Zigachev BUG_ON(*offset_count >= max_offset);
4021b843c749SSergey Zigachev }
4022b843c749SSergey Zigachev
4023b843c749SSergey Zigachev if (register_list_format[ind_offset] == 0xFFFFFFFF) {
4024b843c749SSergey Zigachev new_entry = true;
4025b843c749SSergey Zigachev continue;
4026b843c749SSergey Zigachev }
4027b843c749SSergey Zigachev
4028b843c749SSergey Zigachev ind_offset += 2;
4029b843c749SSergey Zigachev
4030b843c749SSergey Zigachev /* look for the matching indice */
4031b843c749SSergey Zigachev for (indices = 0;
4032b843c749SSergey Zigachev indices < *indices_count;
4033b843c749SSergey Zigachev indices++) {
4034b843c749SSergey Zigachev if (unique_indices[indices] ==
4035b843c749SSergey Zigachev register_list_format[ind_offset])
4036b843c749SSergey Zigachev break;
4037b843c749SSergey Zigachev }
4038b843c749SSergey Zigachev
4039b843c749SSergey Zigachev if (indices >= *indices_count) {
4040b843c749SSergey Zigachev unique_indices[*indices_count] =
4041b843c749SSergey Zigachev register_list_format[ind_offset];
4042b843c749SSergey Zigachev indices = *indices_count;
4043b843c749SSergey Zigachev *indices_count = *indices_count + 1;
4044b843c749SSergey Zigachev BUG_ON(*indices_count >= max_indices);
4045b843c749SSergey Zigachev }
4046b843c749SSergey Zigachev
4047b843c749SSergey Zigachev register_list_format[ind_offset] = indices;
4048b843c749SSergey Zigachev }
4049b843c749SSergey Zigachev }
4050b843c749SSergey Zigachev
gfx_v8_0_init_save_restore_list(struct amdgpu_device * adev)4051b843c749SSergey Zigachev static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
4052b843c749SSergey Zigachev {
4053b843c749SSergey Zigachev int i, temp, data;
4054b843c749SSergey Zigachev int unique_indices[] = {0, 0, 0, 0, 0, 0, 0, 0};
4055b843c749SSergey Zigachev int indices_count = 0;
4056b843c749SSergey Zigachev int indirect_start_offsets[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4057b843c749SSergey Zigachev int offset_count = 0;
4058b843c749SSergey Zigachev
4059b843c749SSergey Zigachev int list_size;
4060b843c749SSergey Zigachev unsigned int *register_list_format =
406178973132SSergey Zigachev kmalloc(adev->gfx.rlc.reg_list_format_size_bytes, M_DRM, GFP_KERNEL);
4062b843c749SSergey Zigachev if (!register_list_format)
4063b843c749SSergey Zigachev return -ENOMEM;
4064b843c749SSergey Zigachev memcpy(register_list_format, adev->gfx.rlc.register_list_format,
4065b843c749SSergey Zigachev adev->gfx.rlc.reg_list_format_size_bytes);
4066b843c749SSergey Zigachev
4067b843c749SSergey Zigachev gfx_v8_0_parse_ind_reg_list(register_list_format,
4068b843c749SSergey Zigachev RLC_FormatDirectRegListLength,
4069b843c749SSergey Zigachev adev->gfx.rlc.reg_list_format_size_bytes >> 2,
4070b843c749SSergey Zigachev unique_indices,
4071b843c749SSergey Zigachev &indices_count,
4072b843c749SSergey Zigachev ARRAY_SIZE(unique_indices),
4073b843c749SSergey Zigachev indirect_start_offsets,
4074b843c749SSergey Zigachev &offset_count,
4075b843c749SSergey Zigachev ARRAY_SIZE(indirect_start_offsets));
4076b843c749SSergey Zigachev
4077b843c749SSergey Zigachev /* save and restore list */
4078b843c749SSergey Zigachev WREG32_FIELD(RLC_SRM_CNTL, AUTO_INCR_ADDR, 1);
4079b843c749SSergey Zigachev
4080b843c749SSergey Zigachev WREG32(mmRLC_SRM_ARAM_ADDR, 0);
4081b843c749SSergey Zigachev for (i = 0; i < adev->gfx.rlc.reg_list_size_bytes >> 2; i++)
4082b843c749SSergey Zigachev WREG32(mmRLC_SRM_ARAM_DATA, adev->gfx.rlc.register_restore[i]);
4083b843c749SSergey Zigachev
4084b843c749SSergey Zigachev /* indirect list */
4085b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_ADDR, adev->gfx.rlc.reg_list_format_start);
4086b843c749SSergey Zigachev for (i = 0; i < adev->gfx.rlc.reg_list_format_size_bytes >> 2; i++)
4087b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_DATA, register_list_format[i]);
4088b843c749SSergey Zigachev
4089b843c749SSergey Zigachev list_size = adev->gfx.rlc.reg_list_size_bytes >> 2;
4090b843c749SSergey Zigachev list_size = list_size >> 1;
4091b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_ADDR, adev->gfx.rlc.reg_restore_list_size);
4092b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_DATA, list_size);
4093b843c749SSergey Zigachev
4094b843c749SSergey Zigachev /* starting offsets starts */
4095b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_ADDR,
4096b843c749SSergey Zigachev adev->gfx.rlc.starting_offsets_start);
4097b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(indirect_start_offsets); i++)
4098b843c749SSergey Zigachev WREG32(mmRLC_GPM_SCRATCH_DATA,
4099b843c749SSergey Zigachev indirect_start_offsets[i]);
4100b843c749SSergey Zigachev
4101b843c749SSergey Zigachev /* unique indices */
4102b843c749SSergey Zigachev temp = mmRLC_SRM_INDEX_CNTL_ADDR_0;
4103b843c749SSergey Zigachev data = mmRLC_SRM_INDEX_CNTL_DATA_0;
4104b843c749SSergey Zigachev for (i = 0; i < ARRAY_SIZE(unique_indices); i++) {
4105b843c749SSergey Zigachev if (unique_indices[i] != 0) {
4106b843c749SSergey Zigachev WREG32(temp + i, unique_indices[i] & 0x3FFFF);
4107b843c749SSergey Zigachev WREG32(data + i, unique_indices[i] >> 20);
4108b843c749SSergey Zigachev }
4109b843c749SSergey Zigachev }
4110b843c749SSergey Zigachev kfree(register_list_format);
4111b843c749SSergey Zigachev
4112b843c749SSergey Zigachev return 0;
4113b843c749SSergey Zigachev }
4114b843c749SSergey Zigachev
gfx_v8_0_enable_save_restore_machine(struct amdgpu_device * adev)4115b843c749SSergey Zigachev static void gfx_v8_0_enable_save_restore_machine(struct amdgpu_device *adev)
4116b843c749SSergey Zigachev {
4117b843c749SSergey Zigachev WREG32_FIELD(RLC_SRM_CNTL, SRM_ENABLE, 1);
4118b843c749SSergey Zigachev }
4119b843c749SSergey Zigachev
gfx_v8_0_init_power_gating(struct amdgpu_device * adev)4120b843c749SSergey Zigachev static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev)
4121b843c749SSergey Zigachev {
4122b843c749SSergey Zigachev uint32_t data;
4123b843c749SSergey Zigachev
4124b843c749SSergey Zigachev WREG32_FIELD(CP_RB_WPTR_POLL_CNTL, IDLE_POLL_COUNT, 0x60);
4125b843c749SSergey Zigachev
4126b843c749SSergey Zigachev data = REG_SET_FIELD(0, RLC_PG_DELAY, POWER_UP_DELAY, 0x10);
4127b843c749SSergey Zigachev data = REG_SET_FIELD(data, RLC_PG_DELAY, POWER_DOWN_DELAY, 0x10);
4128b843c749SSergey Zigachev data = REG_SET_FIELD(data, RLC_PG_DELAY, CMD_PROPAGATE_DELAY, 0x10);
4129b843c749SSergey Zigachev data = REG_SET_FIELD(data, RLC_PG_DELAY, MEM_SLEEP_DELAY, 0x10);
4130b843c749SSergey Zigachev WREG32(mmRLC_PG_DELAY, data);
4131b843c749SSergey Zigachev
4132b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_DELAY_2, SERDES_CMD_DELAY, 0x3);
4133b843c749SSergey Zigachev WREG32_FIELD(RLC_AUTO_PG_CTRL, GRBM_REG_SAVE_GFX_IDLE_THRESHOLD, 0x55f0);
4134b843c749SSergey Zigachev
4135b843c749SSergey Zigachev }
4136b843c749SSergey Zigachev
cz_enable_sck_slow_down_on_power_up(struct amdgpu_device * adev,bool enable)4137b843c749SSergey Zigachev static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev,
4138b843c749SSergey Zigachev bool enable)
4139b843c749SSergey Zigachev {
4140b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, SMU_CLK_SLOWDOWN_ON_PU_ENABLE, enable ? 1 : 0);
4141b843c749SSergey Zigachev }
4142b843c749SSergey Zigachev
cz_enable_sck_slow_down_on_power_down(struct amdgpu_device * adev,bool enable)4143b843c749SSergey Zigachev static void cz_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev,
4144b843c749SSergey Zigachev bool enable)
4145b843c749SSergey Zigachev {
4146b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, SMU_CLK_SLOWDOWN_ON_PD_ENABLE, enable ? 1 : 0);
4147b843c749SSergey Zigachev }
4148b843c749SSergey Zigachev
cz_enable_cp_power_gating(struct amdgpu_device * adev,bool enable)4149b843c749SSergey Zigachev static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable)
4150b843c749SSergey Zigachev {
4151b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, CP_PG_DISABLE, enable ? 0 : 1);
4152b843c749SSergey Zigachev }
4153b843c749SSergey Zigachev
gfx_v8_0_init_pg(struct amdgpu_device * adev)4154b843c749SSergey Zigachev static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
4155b843c749SSergey Zigachev {
4156b843c749SSergey Zigachev if ((adev->asic_type == CHIP_CARRIZO) ||
4157b843c749SSergey Zigachev (adev->asic_type == CHIP_STONEY)) {
4158b843c749SSergey Zigachev gfx_v8_0_init_csb(adev);
4159b843c749SSergey Zigachev gfx_v8_0_init_save_restore_list(adev);
4160b843c749SSergey Zigachev gfx_v8_0_enable_save_restore_machine(adev);
4161b843c749SSergey Zigachev WREG32(mmRLC_JUMP_TABLE_RESTORE, adev->gfx.rlc.cp_table_gpu_addr >> 8);
4162b843c749SSergey Zigachev gfx_v8_0_init_power_gating(adev);
4163b843c749SSergey Zigachev WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask);
4164b843c749SSergey Zigachev } else if ((adev->asic_type == CHIP_POLARIS11) ||
4165b843c749SSergey Zigachev (adev->asic_type == CHIP_POLARIS12) ||
4166b843c749SSergey Zigachev (adev->asic_type == CHIP_VEGAM)) {
4167b843c749SSergey Zigachev gfx_v8_0_init_csb(adev);
4168b843c749SSergey Zigachev gfx_v8_0_init_save_restore_list(adev);
4169b843c749SSergey Zigachev gfx_v8_0_enable_save_restore_machine(adev);
4170b843c749SSergey Zigachev gfx_v8_0_init_power_gating(adev);
4171b843c749SSergey Zigachev }
4172b843c749SSergey Zigachev
4173b843c749SSergey Zigachev }
4174b843c749SSergey Zigachev
gfx_v8_0_rlc_stop(struct amdgpu_device * adev)4175b843c749SSergey Zigachev static void gfx_v8_0_rlc_stop(struct amdgpu_device *adev)
4176b843c749SSergey Zigachev {
4177b843c749SSergey Zigachev WREG32_FIELD(RLC_CNTL, RLC_ENABLE_F32, 0);
4178b843c749SSergey Zigachev
4179b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, false);
4180b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
4181b843c749SSergey Zigachev }
4182b843c749SSergey Zigachev
gfx_v8_0_rlc_reset(struct amdgpu_device * adev)4183b843c749SSergey Zigachev static void gfx_v8_0_rlc_reset(struct amdgpu_device *adev)
4184b843c749SSergey Zigachev {
4185b843c749SSergey Zigachev WREG32_FIELD(GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
4186b843c749SSergey Zigachev udelay(50);
4187b843c749SSergey Zigachev
4188b843c749SSergey Zigachev WREG32_FIELD(GRBM_SOFT_RESET, SOFT_RESET_RLC, 0);
4189b843c749SSergey Zigachev udelay(50);
4190b843c749SSergey Zigachev }
4191b843c749SSergey Zigachev
gfx_v8_0_rlc_start(struct amdgpu_device * adev)4192b843c749SSergey Zigachev static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
4193b843c749SSergey Zigachev {
4194b843c749SSergey Zigachev WREG32_FIELD(RLC_CNTL, RLC_ENABLE_F32, 1);
4195b843c749SSergey Zigachev
4196b843c749SSergey Zigachev /* carrizo do enable cp interrupt after cp inited */
4197b843c749SSergey Zigachev if (!(adev->flags & AMD_IS_APU))
4198b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, true);
4199b843c749SSergey Zigachev
4200b843c749SSergey Zigachev udelay(50);
4201b843c749SSergey Zigachev }
4202b843c749SSergey Zigachev
gfx_v8_0_rlc_load_microcode(struct amdgpu_device * adev)4203b843c749SSergey Zigachev static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev)
4204b843c749SSergey Zigachev {
4205b843c749SSergey Zigachev const struct rlc_firmware_header_v2_0 *hdr;
4206b843c749SSergey Zigachev const __le32 *fw_data;
4207b843c749SSergey Zigachev unsigned i, fw_size;
4208b843c749SSergey Zigachev
4209b843c749SSergey Zigachev if (!adev->gfx.rlc_fw)
4210b843c749SSergey Zigachev return -EINVAL;
4211b843c749SSergey Zigachev
4212b843c749SSergey Zigachev hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
4213b843c749SSergey Zigachev amdgpu_ucode_print_rlc_hdr(&hdr->header);
4214b843c749SSergey Zigachev
4215b843c749SSergey Zigachev fw_data = (const __le32 *)(adev->gfx.rlc_fw->data +
4216b843c749SSergey Zigachev le32_to_cpu(hdr->header.ucode_array_offset_bytes));
4217b843c749SSergey Zigachev fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
4218b843c749SSergey Zigachev
4219b843c749SSergey Zigachev WREG32(mmRLC_GPM_UCODE_ADDR, 0);
4220b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4221b843c749SSergey Zigachev WREG32(mmRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
4222b843c749SSergey Zigachev WREG32(mmRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version);
4223b843c749SSergey Zigachev
4224b843c749SSergey Zigachev return 0;
4225b843c749SSergey Zigachev }
4226b843c749SSergey Zigachev
gfx_v8_0_rlc_resume(struct amdgpu_device * adev)4227b843c749SSergey Zigachev static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
4228b843c749SSergey Zigachev {
4229b843c749SSergey Zigachev int r;
4230b843c749SSergey Zigachev u32 tmp;
4231b843c749SSergey Zigachev
4232b843c749SSergey Zigachev gfx_v8_0_rlc_stop(adev);
4233b843c749SSergey Zigachev
4234b843c749SSergey Zigachev /* disable CG */
4235b843c749SSergey Zigachev tmp = RREG32(mmRLC_CGCG_CGLS_CTRL);
4236b843c749SSergey Zigachev tmp &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK |
4237b843c749SSergey Zigachev RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
4238b843c749SSergey Zigachev WREG32(mmRLC_CGCG_CGLS_CTRL, tmp);
4239b843c749SSergey Zigachev if (adev->asic_type == CHIP_POLARIS11 ||
4240b843c749SSergey Zigachev adev->asic_type == CHIP_POLARIS10 ||
4241b843c749SSergey Zigachev adev->asic_type == CHIP_POLARIS12 ||
4242b843c749SSergey Zigachev adev->asic_type == CHIP_VEGAM) {
4243b843c749SSergey Zigachev tmp = RREG32(mmRLC_CGCG_CGLS_CTRL_3D);
4244b843c749SSergey Zigachev tmp &= ~0x3;
4245b843c749SSergey Zigachev WREG32(mmRLC_CGCG_CGLS_CTRL_3D, tmp);
4246b843c749SSergey Zigachev }
4247b843c749SSergey Zigachev
4248b843c749SSergey Zigachev /* disable PG */
4249b843c749SSergey Zigachev WREG32(mmRLC_PG_CNTL, 0);
4250b843c749SSergey Zigachev
4251b843c749SSergey Zigachev gfx_v8_0_rlc_reset(adev);
4252b843c749SSergey Zigachev gfx_v8_0_init_pg(adev);
4253b843c749SSergey Zigachev
4254b843c749SSergey Zigachev
4255b843c749SSergey Zigachev if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) {
4256b843c749SSergey Zigachev /* legacy rlc firmware loading */
4257b843c749SSergey Zigachev r = gfx_v8_0_rlc_load_microcode(adev);
4258b843c749SSergey Zigachev if (r)
4259b843c749SSergey Zigachev return r;
4260b843c749SSergey Zigachev }
4261b843c749SSergey Zigachev
4262b843c749SSergey Zigachev gfx_v8_0_rlc_start(adev);
4263b843c749SSergey Zigachev
4264b843c749SSergey Zigachev return 0;
4265b843c749SSergey Zigachev }
4266b843c749SSergey Zigachev
gfx_v8_0_cp_gfx_enable(struct amdgpu_device * adev,bool enable)4267b843c749SSergey Zigachev static void gfx_v8_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
4268b843c749SSergey Zigachev {
4269b843c749SSergey Zigachev int i;
4270b843c749SSergey Zigachev u32 tmp = RREG32(mmCP_ME_CNTL);
4271b843c749SSergey Zigachev
4272b843c749SSergey Zigachev if (enable) {
4273b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 0);
4274b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 0);
4275b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 0);
4276b843c749SSergey Zigachev } else {
4277b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 1);
4278b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1);
4279b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1);
4280b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; i++)
4281b843c749SSergey Zigachev adev->gfx.gfx_ring[i].ready = false;
4282b843c749SSergey Zigachev }
4283b843c749SSergey Zigachev WREG32(mmCP_ME_CNTL, tmp);
4284b843c749SSergey Zigachev udelay(50);
4285b843c749SSergey Zigachev }
4286b843c749SSergey Zigachev
gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device * adev)4287b843c749SSergey Zigachev static int gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
4288b843c749SSergey Zigachev {
4289b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *pfp_hdr;
4290b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *ce_hdr;
4291b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *me_hdr;
4292b843c749SSergey Zigachev const __le32 *fw_data;
4293b843c749SSergey Zigachev unsigned i, fw_size;
4294b843c749SSergey Zigachev
4295b843c749SSergey Zigachev if (!adev->gfx.me_fw || !adev->gfx.pfp_fw || !adev->gfx.ce_fw)
4296b843c749SSergey Zigachev return -EINVAL;
4297b843c749SSergey Zigachev
4298b843c749SSergey Zigachev pfp_hdr = (const struct gfx_firmware_header_v1_0 *)
4299b843c749SSergey Zigachev adev->gfx.pfp_fw->data;
4300b843c749SSergey Zigachev ce_hdr = (const struct gfx_firmware_header_v1_0 *)
4301b843c749SSergey Zigachev adev->gfx.ce_fw->data;
4302b843c749SSergey Zigachev me_hdr = (const struct gfx_firmware_header_v1_0 *)
4303b843c749SSergey Zigachev adev->gfx.me_fw->data;
4304b843c749SSergey Zigachev
4305b843c749SSergey Zigachev amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header);
4306b843c749SSergey Zigachev amdgpu_ucode_print_gfx_hdr(&ce_hdr->header);
4307b843c749SSergey Zigachev amdgpu_ucode_print_gfx_hdr(&me_hdr->header);
4308b843c749SSergey Zigachev
4309b843c749SSergey Zigachev gfx_v8_0_cp_gfx_enable(adev, false);
4310b843c749SSergey Zigachev
4311b843c749SSergey Zigachev /* PFP */
4312b843c749SSergey Zigachev fw_data = (const __le32 *)
4313b843c749SSergey Zigachev (adev->gfx.pfp_fw->data +
4314b843c749SSergey Zigachev le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
4315b843c749SSergey Zigachev fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
4316b843c749SSergey Zigachev WREG32(mmCP_PFP_UCODE_ADDR, 0);
4317b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4318b843c749SSergey Zigachev WREG32(mmCP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
4319b843c749SSergey Zigachev WREG32(mmCP_PFP_UCODE_ADDR, adev->gfx.pfp_fw_version);
4320b843c749SSergey Zigachev
4321b843c749SSergey Zigachev /* CE */
4322b843c749SSergey Zigachev fw_data = (const __le32 *)
4323b843c749SSergey Zigachev (adev->gfx.ce_fw->data +
4324b843c749SSergey Zigachev le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
4325b843c749SSergey Zigachev fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
4326b843c749SSergey Zigachev WREG32(mmCP_CE_UCODE_ADDR, 0);
4327b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4328b843c749SSergey Zigachev WREG32(mmCP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
4329b843c749SSergey Zigachev WREG32(mmCP_CE_UCODE_ADDR, adev->gfx.ce_fw_version);
4330b843c749SSergey Zigachev
4331b843c749SSergey Zigachev /* ME */
4332b843c749SSergey Zigachev fw_data = (const __le32 *)
4333b843c749SSergey Zigachev (adev->gfx.me_fw->data +
4334b843c749SSergey Zigachev le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
4335b843c749SSergey Zigachev fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
4336b843c749SSergey Zigachev WREG32(mmCP_ME_RAM_WADDR, 0);
4337b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4338b843c749SSergey Zigachev WREG32(mmCP_ME_RAM_DATA, le32_to_cpup(fw_data++));
4339b843c749SSergey Zigachev WREG32(mmCP_ME_RAM_WADDR, adev->gfx.me_fw_version);
4340b843c749SSergey Zigachev
4341b843c749SSergey Zigachev return 0;
4342b843c749SSergey Zigachev }
4343b843c749SSergey Zigachev
gfx_v8_0_get_csb_size(struct amdgpu_device * adev)4344b843c749SSergey Zigachev static u32 gfx_v8_0_get_csb_size(struct amdgpu_device *adev)
4345b843c749SSergey Zigachev {
4346b843c749SSergey Zigachev u32 count = 0;
4347b843c749SSergey Zigachev const struct cs_section_def *sect = NULL;
4348b843c749SSergey Zigachev const struct cs_extent_def *ext = NULL;
4349b843c749SSergey Zigachev
4350b843c749SSergey Zigachev /* begin clear state */
4351b843c749SSergey Zigachev count += 2;
4352b843c749SSergey Zigachev /* context control state */
4353b843c749SSergey Zigachev count += 3;
4354b843c749SSergey Zigachev
4355b843c749SSergey Zigachev for (sect = vi_cs_data; sect->section != NULL; ++sect) {
4356b843c749SSergey Zigachev for (ext = sect->section; ext->extent != NULL; ++ext) {
4357b843c749SSergey Zigachev if (sect->id == SECT_CONTEXT)
4358b843c749SSergey Zigachev count += 2 + ext->reg_count;
4359b843c749SSergey Zigachev else
4360b843c749SSergey Zigachev return 0;
4361b843c749SSergey Zigachev }
4362b843c749SSergey Zigachev }
4363b843c749SSergey Zigachev /* pa_sc_raster_config/pa_sc_raster_config1 */
4364b843c749SSergey Zigachev count += 4;
4365b843c749SSergey Zigachev /* end clear state */
4366b843c749SSergey Zigachev count += 2;
4367b843c749SSergey Zigachev /* clear state */
4368b843c749SSergey Zigachev count += 2;
4369b843c749SSergey Zigachev
4370b843c749SSergey Zigachev return count;
4371b843c749SSergey Zigachev }
4372b843c749SSergey Zigachev
gfx_v8_0_cp_gfx_start(struct amdgpu_device * adev)4373b843c749SSergey Zigachev static int gfx_v8_0_cp_gfx_start(struct amdgpu_device *adev)
4374b843c749SSergey Zigachev {
4375b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.gfx_ring[0];
4376b843c749SSergey Zigachev const struct cs_section_def *sect = NULL;
4377b843c749SSergey Zigachev const struct cs_extent_def *ext = NULL;
4378b843c749SSergey Zigachev int r, i;
4379b843c749SSergey Zigachev
4380b843c749SSergey Zigachev /* init the CP */
4381b843c749SSergey Zigachev WREG32(mmCP_MAX_CONTEXT, adev->gfx.config.max_hw_contexts - 1);
4382b843c749SSergey Zigachev WREG32(mmCP_ENDIAN_SWAP, 0);
4383b843c749SSergey Zigachev WREG32(mmCP_DEVICE_ID, 1);
4384b843c749SSergey Zigachev
4385b843c749SSergey Zigachev gfx_v8_0_cp_gfx_enable(adev, true);
4386b843c749SSergey Zigachev
4387b843c749SSergey Zigachev r = amdgpu_ring_alloc(ring, gfx_v8_0_get_csb_size(adev) + 4);
4388b843c749SSergey Zigachev if (r) {
4389b843c749SSergey Zigachev DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
4390b843c749SSergey Zigachev return r;
4391b843c749SSergey Zigachev }
4392b843c749SSergey Zigachev
4393b843c749SSergey Zigachev /* clear state buffer */
4394b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4395b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
4396b843c749SSergey Zigachev
4397b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
4398b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x80000000);
4399b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x80000000);
4400b843c749SSergey Zigachev
4401b843c749SSergey Zigachev for (sect = vi_cs_data; sect->section != NULL; ++sect) {
4402b843c749SSergey Zigachev for (ext = sect->section; ext->extent != NULL; ++ext) {
4403b843c749SSergey Zigachev if (sect->id == SECT_CONTEXT) {
4404b843c749SSergey Zigachev amdgpu_ring_write(ring,
4405b843c749SSergey Zigachev PACKET3(PACKET3_SET_CONTEXT_REG,
4406b843c749SSergey Zigachev ext->reg_count));
4407b843c749SSergey Zigachev amdgpu_ring_write(ring,
4408b843c749SSergey Zigachev ext->reg_index - PACKET3_SET_CONTEXT_REG_START);
4409b843c749SSergey Zigachev for (i = 0; i < ext->reg_count; i++)
4410b843c749SSergey Zigachev amdgpu_ring_write(ring, ext->extent[i]);
4411b843c749SSergey Zigachev }
4412b843c749SSergey Zigachev }
4413b843c749SSergey Zigachev }
4414b843c749SSergey Zigachev
4415b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
4416b843c749SSergey Zigachev amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
4417b843c749SSergey Zigachev amdgpu_ring_write(ring, adev->gfx.config.rb_config[0][0].raster_config);
4418b843c749SSergey Zigachev amdgpu_ring_write(ring, adev->gfx.config.rb_config[0][0].raster_config_1);
4419b843c749SSergey Zigachev
4420b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4421b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
4422b843c749SSergey Zigachev
4423b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
4424b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
4425b843c749SSergey Zigachev
4426b843c749SSergey Zigachev /* init the CE partitions */
4427b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
4428b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
4429b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x8000);
4430b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x8000);
4431b843c749SSergey Zigachev
4432b843c749SSergey Zigachev amdgpu_ring_commit(ring);
4433b843c749SSergey Zigachev
4434b843c749SSergey Zigachev return 0;
4435b843c749SSergey Zigachev }
gfx_v8_0_set_cpg_door_bell(struct amdgpu_device * adev,struct amdgpu_ring * ring)4436b843c749SSergey Zigachev static void gfx_v8_0_set_cpg_door_bell(struct amdgpu_device *adev, struct amdgpu_ring *ring)
4437b843c749SSergey Zigachev {
4438b843c749SSergey Zigachev u32 tmp;
4439b843c749SSergey Zigachev /* no gfx doorbells on iceland */
4440b843c749SSergey Zigachev if (adev->asic_type == CHIP_TOPAZ)
4441b843c749SSergey Zigachev return;
4442b843c749SSergey Zigachev
4443b843c749SSergey Zigachev tmp = RREG32(mmCP_RB_DOORBELL_CONTROL);
4444b843c749SSergey Zigachev
4445b843c749SSergey Zigachev if (ring->use_doorbell) {
4446b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
4447b843c749SSergey Zigachev DOORBELL_OFFSET, ring->doorbell_index);
4448b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
4449b843c749SSergey Zigachev DOORBELL_HIT, 0);
4450b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
4451b843c749SSergey Zigachev DOORBELL_EN, 1);
4452b843c749SSergey Zigachev } else {
4453b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_EN, 0);
4454b843c749SSergey Zigachev }
4455b843c749SSergey Zigachev
4456b843c749SSergey Zigachev WREG32(mmCP_RB_DOORBELL_CONTROL, tmp);
4457b843c749SSergey Zigachev
4458b843c749SSergey Zigachev if (adev->flags & AMD_IS_APU)
4459b843c749SSergey Zigachev return;
4460b843c749SSergey Zigachev
4461b843c749SSergey Zigachev tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER,
4462b843c749SSergey Zigachev DOORBELL_RANGE_LOWER,
4463b843c749SSergey Zigachev AMDGPU_DOORBELL_GFX_RING0);
4464b843c749SSergey Zigachev WREG32(mmCP_RB_DOORBELL_RANGE_LOWER, tmp);
4465b843c749SSergey Zigachev
4466b843c749SSergey Zigachev WREG32(mmCP_RB_DOORBELL_RANGE_UPPER,
4467b843c749SSergey Zigachev CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK);
4468b843c749SSergey Zigachev }
4469b843c749SSergey Zigachev
gfx_v8_0_cp_gfx_resume(struct amdgpu_device * adev)4470b843c749SSergey Zigachev static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)
4471b843c749SSergey Zigachev {
4472b843c749SSergey Zigachev struct amdgpu_ring *ring;
4473b843c749SSergey Zigachev u32 tmp;
4474b843c749SSergey Zigachev u32 rb_bufsz;
4475b843c749SSergey Zigachev u64 rb_addr, rptr_addr, wptr_gpu_addr;
4476b843c749SSergey Zigachev int r;
4477b843c749SSergey Zigachev
4478b843c749SSergey Zigachev /* Set the write pointer delay */
4479b843c749SSergey Zigachev WREG32(mmCP_RB_WPTR_DELAY, 0);
4480b843c749SSergey Zigachev
4481b843c749SSergey Zigachev /* set the RB to use vmid 0 */
4482b843c749SSergey Zigachev WREG32(mmCP_RB_VMID, 0);
4483b843c749SSergey Zigachev
4484b843c749SSergey Zigachev /* Set ring buffer size */
4485b843c749SSergey Zigachev ring = &adev->gfx.gfx_ring[0];
4486b843c749SSergey Zigachev rb_bufsz = order_base_2(ring->ring_size / 8);
4487b843c749SSergey Zigachev tmp = REG_SET_FIELD(0, CP_RB0_CNTL, RB_BUFSZ, rb_bufsz);
4488b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, RB_BLKSZ, rb_bufsz - 2);
4489b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, MTYPE, 3);
4490b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, MIN_IB_AVAILSZ, 1);
4491b843c749SSergey Zigachev #ifdef __BIG_ENDIAN
4492b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, BUF_SWAP, 1);
4493b843c749SSergey Zigachev #endif
4494b843c749SSergey Zigachev WREG32(mmCP_RB0_CNTL, tmp);
4495b843c749SSergey Zigachev
4496b843c749SSergey Zigachev /* Initialize the ring buffer's read and write pointers */
4497b843c749SSergey Zigachev WREG32(mmCP_RB0_CNTL, tmp | CP_RB0_CNTL__RB_RPTR_WR_ENA_MASK);
4498b843c749SSergey Zigachev ring->wptr = 0;
4499b843c749SSergey Zigachev WREG32(mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
4500b843c749SSergey Zigachev
4501b843c749SSergey Zigachev /* set the wb address wether it's enabled or not */
4502b843c749SSergey Zigachev rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
4503b843c749SSergey Zigachev WREG32(mmCP_RB0_RPTR_ADDR, lower_32_bits(rptr_addr));
4504b843c749SSergey Zigachev WREG32(mmCP_RB0_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & 0xFF);
4505b843c749SSergey Zigachev
4506b843c749SSergey Zigachev wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
4507b843c749SSergey Zigachev WREG32(mmCP_RB_WPTR_POLL_ADDR_LO, lower_32_bits(wptr_gpu_addr));
4508b843c749SSergey Zigachev WREG32(mmCP_RB_WPTR_POLL_ADDR_HI, upper_32_bits(wptr_gpu_addr));
4509b843c749SSergey Zigachev mdelay(1);
4510b843c749SSergey Zigachev WREG32(mmCP_RB0_CNTL, tmp);
4511b843c749SSergey Zigachev
4512b843c749SSergey Zigachev rb_addr = ring->gpu_addr >> 8;
4513b843c749SSergey Zigachev WREG32(mmCP_RB0_BASE, rb_addr);
4514b843c749SSergey Zigachev WREG32(mmCP_RB0_BASE_HI, upper_32_bits(rb_addr));
4515b843c749SSergey Zigachev
4516b843c749SSergey Zigachev gfx_v8_0_set_cpg_door_bell(adev, ring);
4517b843c749SSergey Zigachev /* start the ring */
4518b843c749SSergey Zigachev amdgpu_ring_clear_ring(ring);
4519b843c749SSergey Zigachev gfx_v8_0_cp_gfx_start(adev);
4520b843c749SSergey Zigachev ring->ready = true;
4521b843c749SSergey Zigachev r = amdgpu_ring_test_ring(ring);
4522b843c749SSergey Zigachev if (r)
4523b843c749SSergey Zigachev ring->ready = false;
4524b843c749SSergey Zigachev
4525b843c749SSergey Zigachev return r;
4526b843c749SSergey Zigachev }
4527b843c749SSergey Zigachev
gfx_v8_0_cp_compute_enable(struct amdgpu_device * adev,bool enable)4528b843c749SSergey Zigachev static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
4529b843c749SSergey Zigachev {
4530b843c749SSergey Zigachev int i;
4531b843c749SSergey Zigachev
4532b843c749SSergey Zigachev if (enable) {
4533b843c749SSergey Zigachev WREG32(mmCP_MEC_CNTL, 0);
4534b843c749SSergey Zigachev } else {
4535b843c749SSergey Zigachev WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
4536b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++)
4537b843c749SSergey Zigachev adev->gfx.compute_ring[i].ready = false;
4538b843c749SSergey Zigachev adev->gfx.kiq.ring.ready = false;
4539b843c749SSergey Zigachev }
4540b843c749SSergey Zigachev udelay(50);
4541b843c749SSergey Zigachev }
4542b843c749SSergey Zigachev
gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device * adev)4543b843c749SSergey Zigachev static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev)
4544b843c749SSergey Zigachev {
4545b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *mec_hdr;
4546b843c749SSergey Zigachev const __le32 *fw_data;
4547b843c749SSergey Zigachev unsigned i, fw_size;
4548b843c749SSergey Zigachev
4549b843c749SSergey Zigachev if (!adev->gfx.mec_fw)
4550b843c749SSergey Zigachev return -EINVAL;
4551b843c749SSergey Zigachev
4552b843c749SSergey Zigachev gfx_v8_0_cp_compute_enable(adev, false);
4553b843c749SSergey Zigachev
4554b843c749SSergey Zigachev mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
4555b843c749SSergey Zigachev amdgpu_ucode_print_gfx_hdr(&mec_hdr->header);
4556b843c749SSergey Zigachev
4557b843c749SSergey Zigachev fw_data = (const __le32 *)
4558b843c749SSergey Zigachev (adev->gfx.mec_fw->data +
4559b843c749SSergey Zigachev le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
4560b843c749SSergey Zigachev fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
4561b843c749SSergey Zigachev
4562b843c749SSergey Zigachev /* MEC1 */
4563b843c749SSergey Zigachev WREG32(mmCP_MEC_ME1_UCODE_ADDR, 0);
4564b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4565b843c749SSergey Zigachev WREG32(mmCP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data+i));
4566b843c749SSergey Zigachev WREG32(mmCP_MEC_ME1_UCODE_ADDR, adev->gfx.mec_fw_version);
4567b843c749SSergey Zigachev
4568b843c749SSergey Zigachev /* Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */
4569b843c749SSergey Zigachev if (adev->gfx.mec2_fw) {
4570b843c749SSergey Zigachev const struct gfx_firmware_header_v1_0 *mec2_hdr;
4571b843c749SSergey Zigachev
4572b843c749SSergey Zigachev mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
4573b843c749SSergey Zigachev amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header);
4574b843c749SSergey Zigachev
4575b843c749SSergey Zigachev fw_data = (const __le32 *)
4576b843c749SSergey Zigachev (adev->gfx.mec2_fw->data +
4577b843c749SSergey Zigachev le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
4578b843c749SSergey Zigachev fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
4579b843c749SSergey Zigachev
4580b843c749SSergey Zigachev WREG32(mmCP_MEC_ME2_UCODE_ADDR, 0);
4581b843c749SSergey Zigachev for (i = 0; i < fw_size; i++)
4582b843c749SSergey Zigachev WREG32(mmCP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data+i));
4583b843c749SSergey Zigachev WREG32(mmCP_MEC_ME2_UCODE_ADDR, adev->gfx.mec2_fw_version);
4584b843c749SSergey Zigachev }
4585b843c749SSergey Zigachev
4586b843c749SSergey Zigachev return 0;
4587b843c749SSergey Zigachev }
4588b843c749SSergey Zigachev
4589b843c749SSergey Zigachev /* KIQ functions */
gfx_v8_0_kiq_setting(struct amdgpu_ring * ring)4590b843c749SSergey Zigachev static void gfx_v8_0_kiq_setting(struct amdgpu_ring *ring)
4591b843c749SSergey Zigachev {
4592b843c749SSergey Zigachev uint32_t tmp;
4593b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
4594b843c749SSergey Zigachev
4595b843c749SSergey Zigachev /* tell RLC which is KIQ queue */
4596b843c749SSergey Zigachev tmp = RREG32(mmRLC_CP_SCHEDULERS);
4597b843c749SSergey Zigachev tmp &= 0xffffff00;
4598b843c749SSergey Zigachev tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue);
4599b843c749SSergey Zigachev WREG32(mmRLC_CP_SCHEDULERS, tmp);
4600b843c749SSergey Zigachev tmp |= 0x80;
4601b843c749SSergey Zigachev WREG32(mmRLC_CP_SCHEDULERS, tmp);
4602b843c749SSergey Zigachev }
4603b843c749SSergey Zigachev
gfx_v8_0_kiq_kcq_enable(struct amdgpu_device * adev)4604b843c749SSergey Zigachev static int gfx_v8_0_kiq_kcq_enable(struct amdgpu_device *adev)
4605b843c749SSergey Zigachev {
4606b843c749SSergey Zigachev struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring;
4607b843c749SSergey Zigachev uint32_t scratch, tmp = 0;
4608b843c749SSergey Zigachev uint64_t queue_mask = 0;
4609b843c749SSergey Zigachev int r, i;
4610b843c749SSergey Zigachev
4611b843c749SSergey Zigachev for (i = 0; i < AMDGPU_MAX_COMPUTE_QUEUES; ++i) {
4612b843c749SSergey Zigachev if (!test_bit(i, adev->gfx.mec.queue_bitmap))
4613b843c749SSergey Zigachev continue;
4614b843c749SSergey Zigachev
4615b843c749SSergey Zigachev /* This situation may be hit in the future if a new HW
4616b843c749SSergey Zigachev * generation exposes more than 64 queues. If so, the
4617b843c749SSergey Zigachev * definition of queue_mask needs updating */
4618b843c749SSergey Zigachev if (WARN_ON(i >= (sizeof(queue_mask)*8))) {
4619b843c749SSergey Zigachev DRM_ERROR("Invalid KCQ enabled: %d\n", i);
4620b843c749SSergey Zigachev break;
4621b843c749SSergey Zigachev }
4622b843c749SSergey Zigachev
4623b843c749SSergey Zigachev queue_mask |= (1ull << i);
4624b843c749SSergey Zigachev }
4625b843c749SSergey Zigachev
4626b843c749SSergey Zigachev r = amdgpu_gfx_scratch_get(adev, &scratch);
4627b843c749SSergey Zigachev if (r) {
4628b843c749SSergey Zigachev DRM_ERROR("Failed to get scratch reg (%d).\n", r);
4629b843c749SSergey Zigachev return r;
4630b843c749SSergey Zigachev }
4631b843c749SSergey Zigachev WREG32(scratch, 0xCAFEDEAD);
4632b843c749SSergey Zigachev
4633b843c749SSergey Zigachev r = amdgpu_ring_alloc(kiq_ring, (8 * adev->gfx.num_compute_rings) + 11);
4634b843c749SSergey Zigachev if (r) {
4635b843c749SSergey Zigachev DRM_ERROR("Failed to lock KIQ (%d).\n", r);
4636b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
4637b843c749SSergey Zigachev return r;
4638b843c749SSergey Zigachev }
4639b843c749SSergey Zigachev /* set resources */
4640b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6));
4641b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0); /* vmid_mask:0 queue_type:0 (KIQ) */
4642b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, lower_32_bits(queue_mask)); /* queue mask lo */
4643b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, upper_32_bits(queue_mask)); /* queue mask hi */
4644b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0); /* gws mask lo */
4645b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0); /* gws mask hi */
4646b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0); /* oac mask */
4647b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0); /* gds heap base:0, gds heap size:0 */
4648b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
4649b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
4650b843c749SSergey Zigachev uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);
4651b843c749SSergey Zigachev uint64_t wptr_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
4652b843c749SSergey Zigachev
4653b843c749SSergey Zigachev /* map queues */
4654b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5));
4655b843c749SSergey Zigachev /* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/
4656b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring,
4657b843c749SSergey Zigachev PACKET3_MAP_QUEUES_NUM_QUEUES(1));
4658b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring,
4659b843c749SSergey Zigachev PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index) |
4660b843c749SSergey Zigachev PACKET3_MAP_QUEUES_QUEUE(ring->queue) |
4661b843c749SSergey Zigachev PACKET3_MAP_QUEUES_PIPE(ring->pipe) |
4662b843c749SSergey Zigachev PACKET3_MAP_QUEUES_ME(ring->me == 1 ? 0 : 1)); /* doorbell */
4663b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr));
4664b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr));
4665b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr));
4666b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
4667b843c749SSergey Zigachev }
4668b843c749SSergey Zigachev /* write to scratch for completion */
4669b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
4670b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
4671b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0xDEADBEEF);
4672b843c749SSergey Zigachev amdgpu_ring_commit(kiq_ring);
4673b843c749SSergey Zigachev
4674b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
4675b843c749SSergey Zigachev tmp = RREG32(scratch);
4676b843c749SSergey Zigachev if (tmp == 0xDEADBEEF)
4677b843c749SSergey Zigachev break;
4678b843c749SSergey Zigachev DRM_UDELAY(1);
4679b843c749SSergey Zigachev }
4680b843c749SSergey Zigachev if (i >= adev->usec_timeout) {
4681b843c749SSergey Zigachev DRM_ERROR("KCQ enable failed (scratch(0x%04X)=0x%08X)\n",
4682b843c749SSergey Zigachev scratch, tmp);
4683b843c749SSergey Zigachev r = -EINVAL;
4684b843c749SSergey Zigachev }
4685b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
4686b843c749SSergey Zigachev
4687b843c749SSergey Zigachev return r;
4688b843c749SSergey Zigachev }
4689b843c749SSergey Zigachev
gfx_v8_0_deactivate_hqd(struct amdgpu_device * adev,u32 req)4690b843c749SSergey Zigachev static int gfx_v8_0_deactivate_hqd(struct amdgpu_device *adev, u32 req)
4691b843c749SSergey Zigachev {
4692b843c749SSergey Zigachev int i, r = 0;
4693b843c749SSergey Zigachev
4694b843c749SSergey Zigachev if (RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK) {
4695b843c749SSergey Zigachev WREG32_FIELD(CP_HQD_DEQUEUE_REQUEST, DEQUEUE_REQ, req);
4696b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
4697b843c749SSergey Zigachev if (!(RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK))
4698b843c749SSergey Zigachev break;
4699b843c749SSergey Zigachev udelay(1);
4700b843c749SSergey Zigachev }
4701b843c749SSergey Zigachev if (i == adev->usec_timeout)
4702b843c749SSergey Zigachev r = -ETIMEDOUT;
4703b843c749SSergey Zigachev }
4704b843c749SSergey Zigachev WREG32(mmCP_HQD_DEQUEUE_REQUEST, 0);
4705b843c749SSergey Zigachev WREG32(mmCP_HQD_PQ_RPTR, 0);
4706b843c749SSergey Zigachev WREG32(mmCP_HQD_PQ_WPTR, 0);
4707b843c749SSergey Zigachev
4708b843c749SSergey Zigachev return r;
4709b843c749SSergey Zigachev }
4710b843c749SSergey Zigachev
gfx_v8_0_mqd_init(struct amdgpu_ring * ring)4711b843c749SSergey Zigachev static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring)
4712b843c749SSergey Zigachev {
4713b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
4714b843c749SSergey Zigachev struct vi_mqd *mqd = ring->mqd_ptr;
4715b843c749SSergey Zigachev uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;
4716b843c749SSergey Zigachev uint32_t tmp;
4717b843c749SSergey Zigachev
4718b843c749SSergey Zigachev mqd->header = 0xC0310800;
4719b843c749SSergey Zigachev mqd->compute_pipelinestat_enable = 0x00000001;
4720b843c749SSergey Zigachev mqd->compute_static_thread_mgmt_se0 = 0xffffffff;
4721b843c749SSergey Zigachev mqd->compute_static_thread_mgmt_se1 = 0xffffffff;
4722b843c749SSergey Zigachev mqd->compute_static_thread_mgmt_se2 = 0xffffffff;
4723b843c749SSergey Zigachev mqd->compute_static_thread_mgmt_se3 = 0xffffffff;
4724b843c749SSergey Zigachev mqd->compute_misc_reserved = 0x00000003;
4725b843c749SSergey Zigachev mqd->dynamic_cu_mask_addr_lo = lower_32_bits(ring->mqd_gpu_addr
4726b843c749SSergey Zigachev + offsetof(struct vi_mqd_allocation, dynamic_cu_mask));
4727b843c749SSergey Zigachev mqd->dynamic_cu_mask_addr_hi = upper_32_bits(ring->mqd_gpu_addr
4728b843c749SSergey Zigachev + offsetof(struct vi_mqd_allocation, dynamic_cu_mask));
4729b843c749SSergey Zigachev eop_base_addr = ring->eop_gpu_addr >> 8;
4730b843c749SSergey Zigachev mqd->cp_hqd_eop_base_addr_lo = eop_base_addr;
4731b843c749SSergey Zigachev mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr);
4732b843c749SSergey Zigachev
4733b843c749SSergey Zigachev /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4734b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_EOP_CONTROL);
4735b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE,
4736b843c749SSergey Zigachev (order_base_2(GFX8_MEC_HPD_SIZE / 4) - 1));
4737b843c749SSergey Zigachev
4738b843c749SSergey Zigachev mqd->cp_hqd_eop_control = tmp;
4739b843c749SSergey Zigachev
4740b843c749SSergey Zigachev /* enable doorbell? */
4741b843c749SSergey Zigachev tmp = REG_SET_FIELD(RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL),
4742b843c749SSergey Zigachev CP_HQD_PQ_DOORBELL_CONTROL,
4743b843c749SSergey Zigachev DOORBELL_EN,
4744b843c749SSergey Zigachev ring->use_doorbell ? 1 : 0);
4745b843c749SSergey Zigachev
4746b843c749SSergey Zigachev mqd->cp_hqd_pq_doorbell_control = tmp;
4747b843c749SSergey Zigachev
4748b843c749SSergey Zigachev /* set the pointer to the MQD */
4749b843c749SSergey Zigachev mqd->cp_mqd_base_addr_lo = ring->mqd_gpu_addr & 0xfffffffc;
4750b843c749SSergey Zigachev mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr);
4751b843c749SSergey Zigachev
4752b843c749SSergey Zigachev /* set MQD vmid to 0 */
4753b843c749SSergey Zigachev tmp = RREG32(mmCP_MQD_CONTROL);
4754b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);
4755b843c749SSergey Zigachev mqd->cp_mqd_control = tmp;
4756b843c749SSergey Zigachev
4757b843c749SSergey Zigachev /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4758b843c749SSergey Zigachev hqd_gpu_addr = ring->gpu_addr >> 8;
4759b843c749SSergey Zigachev mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;
4760b843c749SSergey Zigachev mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
4761b843c749SSergey Zigachev
4762b843c749SSergey Zigachev /* set up the HQD, this is similar to CP_RB0_CNTL */
4763b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_PQ_CONTROL);
4764b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
4765b843c749SSergey Zigachev (order_base_2(ring->ring_size / 4) - 1));
4766b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
4767b843c749SSergey Zigachev ((order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1) << 8));
4768b843c749SSergey Zigachev #ifdef __BIG_ENDIAN
4769b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ENDIAN_SWAP, 1);
4770b843c749SSergey Zigachev #endif
4771b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 0);
4772b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0);
4773b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
4774b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);
4775b843c749SSergey Zigachev mqd->cp_hqd_pq_control = tmp;
4776b843c749SSergey Zigachev
4777b843c749SSergey Zigachev /* set the wb address whether it's enabled or not */
4778b843c749SSergey Zigachev wb_gpu_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
4779b843c749SSergey Zigachev mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc;
4780b843c749SSergey Zigachev mqd->cp_hqd_pq_rptr_report_addr_hi =
4781b843c749SSergey Zigachev upper_32_bits(wb_gpu_addr) & 0xffff;
4782b843c749SSergey Zigachev
4783b843c749SSergey Zigachev /* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */
4784b843c749SSergey Zigachev wb_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
4785b843c749SSergey Zigachev mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc;
4786b843c749SSergey Zigachev mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4787b843c749SSergey Zigachev
4788b843c749SSergey Zigachev tmp = 0;
4789b843c749SSergey Zigachev /* enable the doorbell if requested */
4790b843c749SSergey Zigachev if (ring->use_doorbell) {
4791b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL);
4792b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
4793b843c749SSergey Zigachev DOORBELL_OFFSET, ring->doorbell_index);
4794b843c749SSergey Zigachev
4795b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
4796b843c749SSergey Zigachev DOORBELL_EN, 1);
4797b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
4798b843c749SSergey Zigachev DOORBELL_SOURCE, 0);
4799b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
4800b843c749SSergey Zigachev DOORBELL_HIT, 0);
4801b843c749SSergey Zigachev }
4802b843c749SSergey Zigachev
4803b843c749SSergey Zigachev mqd->cp_hqd_pq_doorbell_control = tmp;
4804b843c749SSergey Zigachev
4805b843c749SSergey Zigachev /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
4806b843c749SSergey Zigachev ring->wptr = 0;
4807b843c749SSergey Zigachev mqd->cp_hqd_pq_wptr = ring->wptr;
4808b843c749SSergey Zigachev mqd->cp_hqd_pq_rptr = RREG32(mmCP_HQD_PQ_RPTR);
4809b843c749SSergey Zigachev
4810b843c749SSergey Zigachev /* set the vmid for the queue */
4811b843c749SSergey Zigachev mqd->cp_hqd_vmid = 0;
4812b843c749SSergey Zigachev
4813b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_PERSISTENT_STATE);
4814b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);
4815b843c749SSergey Zigachev mqd->cp_hqd_persistent_state = tmp;
4816b843c749SSergey Zigachev
4817b843c749SSergey Zigachev /* set MTYPE */
4818b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_IB_CONTROL);
4819b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3);
4820b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MTYPE, 3);
4821b843c749SSergey Zigachev mqd->cp_hqd_ib_control = tmp;
4822b843c749SSergey Zigachev
4823b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_IQ_TIMER);
4824b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_IQ_TIMER, MTYPE, 3);
4825b843c749SSergey Zigachev mqd->cp_hqd_iq_timer = tmp;
4826b843c749SSergey Zigachev
4827b843c749SSergey Zigachev tmp = RREG32(mmCP_HQD_CTX_SAVE_CONTROL);
4828b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, CP_HQD_CTX_SAVE_CONTROL, MTYPE, 3);
4829b843c749SSergey Zigachev mqd->cp_hqd_ctx_save_control = tmp;
4830b843c749SSergey Zigachev
4831b843c749SSergey Zigachev /* defaults */
4832b843c749SSergey Zigachev mqd->cp_hqd_eop_rptr = RREG32(mmCP_HQD_EOP_RPTR);
4833b843c749SSergey Zigachev mqd->cp_hqd_eop_wptr = RREG32(mmCP_HQD_EOP_WPTR);
4834b843c749SSergey Zigachev mqd->cp_hqd_pipe_priority = RREG32(mmCP_HQD_PIPE_PRIORITY);
4835b843c749SSergey Zigachev mqd->cp_hqd_queue_priority = RREG32(mmCP_HQD_QUEUE_PRIORITY);
4836b843c749SSergey Zigachev mqd->cp_hqd_quantum = RREG32(mmCP_HQD_QUANTUM);
4837b843c749SSergey Zigachev mqd->cp_hqd_ctx_save_base_addr_lo = RREG32(mmCP_HQD_CTX_SAVE_BASE_ADDR_LO);
4838b843c749SSergey Zigachev mqd->cp_hqd_ctx_save_base_addr_hi = RREG32(mmCP_HQD_CTX_SAVE_BASE_ADDR_HI);
4839b843c749SSergey Zigachev mqd->cp_hqd_cntl_stack_offset = RREG32(mmCP_HQD_CNTL_STACK_OFFSET);
4840b843c749SSergey Zigachev mqd->cp_hqd_cntl_stack_size = RREG32(mmCP_HQD_CNTL_STACK_SIZE);
4841b843c749SSergey Zigachev mqd->cp_hqd_wg_state_offset = RREG32(mmCP_HQD_WG_STATE_OFFSET);
4842b843c749SSergey Zigachev mqd->cp_hqd_ctx_save_size = RREG32(mmCP_HQD_CTX_SAVE_SIZE);
4843b843c749SSergey Zigachev mqd->cp_hqd_eop_done_events = RREG32(mmCP_HQD_EOP_EVENTS);
4844b843c749SSergey Zigachev mqd->cp_hqd_error = RREG32(mmCP_HQD_ERROR);
4845b843c749SSergey Zigachev mqd->cp_hqd_eop_wptr_mem = RREG32(mmCP_HQD_EOP_WPTR_MEM);
4846b843c749SSergey Zigachev mqd->cp_hqd_eop_dones = RREG32(mmCP_HQD_EOP_DONES);
4847b843c749SSergey Zigachev
4848b843c749SSergey Zigachev /* activate the queue */
4849b843c749SSergey Zigachev mqd->cp_hqd_active = 1;
4850b843c749SSergey Zigachev
4851b843c749SSergey Zigachev return 0;
4852b843c749SSergey Zigachev }
4853b843c749SSergey Zigachev
4854b843c749SSergey Zigachev int gfx_v8_0_mqd_commit(struct amdgpu_device *adev,
485578973132SSergey Zigachev struct vi_mqd *mqd);
gfx_v8_0_mqd_commit(struct amdgpu_device * adev,struct vi_mqd * mqd)485678973132SSergey Zigachev int gfx_v8_0_mqd_commit(struct amdgpu_device *adev,
4857b843c749SSergey Zigachev struct vi_mqd *mqd)
4858b843c749SSergey Zigachev {
4859b843c749SSergey Zigachev uint32_t mqd_reg;
4860b843c749SSergey Zigachev uint32_t *mqd_data;
4861b843c749SSergey Zigachev
4862b843c749SSergey Zigachev /* HQD registers extend from mmCP_MQD_BASE_ADDR to mmCP_HQD_ERROR */
4863b843c749SSergey Zigachev mqd_data = &mqd->cp_mqd_base_addr_lo;
4864b843c749SSergey Zigachev
4865b843c749SSergey Zigachev /* disable wptr polling */
4866b843c749SSergey Zigachev WREG32_FIELD(CP_PQ_WPTR_POLL_CNTL, EN, 0);
4867b843c749SSergey Zigachev
4868b843c749SSergey Zigachev /* program all HQD registers */
4869b843c749SSergey Zigachev for (mqd_reg = mmCP_HQD_VMID; mqd_reg <= mmCP_HQD_EOP_CONTROL; mqd_reg++)
4870b843c749SSergey Zigachev WREG32(mqd_reg, mqd_data[mqd_reg - mmCP_MQD_BASE_ADDR]);
4871b843c749SSergey Zigachev
4872b843c749SSergey Zigachev /* Tonga errata: EOP RPTR/WPTR should be left unmodified.
4873b843c749SSergey Zigachev * This is safe since EOP RPTR==WPTR for any inactive HQD
4874b843c749SSergey Zigachev * on ASICs that do not support context-save.
4875b843c749SSergey Zigachev * EOP writes/reads can start anywhere in the ring.
4876b843c749SSergey Zigachev */
4877b843c749SSergey Zigachev if (adev->asic_type != CHIP_TONGA) {
4878b843c749SSergey Zigachev WREG32(mmCP_HQD_EOP_RPTR, mqd->cp_hqd_eop_rptr);
4879b843c749SSergey Zigachev WREG32(mmCP_HQD_EOP_WPTR, mqd->cp_hqd_eop_wptr);
4880b843c749SSergey Zigachev WREG32(mmCP_HQD_EOP_WPTR_MEM, mqd->cp_hqd_eop_wptr_mem);
4881b843c749SSergey Zigachev }
4882b843c749SSergey Zigachev
4883b843c749SSergey Zigachev for (mqd_reg = mmCP_HQD_EOP_EVENTS; mqd_reg <= mmCP_HQD_ERROR; mqd_reg++)
4884b843c749SSergey Zigachev WREG32(mqd_reg, mqd_data[mqd_reg - mmCP_MQD_BASE_ADDR]);
4885b843c749SSergey Zigachev
4886b843c749SSergey Zigachev /* activate the HQD */
4887b843c749SSergey Zigachev for (mqd_reg = mmCP_MQD_BASE_ADDR; mqd_reg <= mmCP_HQD_ACTIVE; mqd_reg++)
4888b843c749SSergey Zigachev WREG32(mqd_reg, mqd_data[mqd_reg - mmCP_MQD_BASE_ADDR]);
4889b843c749SSergey Zigachev
4890b843c749SSergey Zigachev return 0;
4891b843c749SSergey Zigachev }
4892b843c749SSergey Zigachev
gfx_v8_0_kiq_init_queue(struct amdgpu_ring * ring)4893b843c749SSergey Zigachev static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
4894b843c749SSergey Zigachev {
4895b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
4896b843c749SSergey Zigachev struct vi_mqd *mqd = ring->mqd_ptr;
4897b843c749SSergey Zigachev int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;
4898b843c749SSergey Zigachev
4899b843c749SSergey Zigachev gfx_v8_0_kiq_setting(ring);
4900b843c749SSergey Zigachev
4901b843c749SSergey Zigachev if (adev->in_gpu_reset) { /* for GPU_RESET case */
4902b843c749SSergey Zigachev /* reset MQD to a clean status */
4903b843c749SSergey Zigachev if (adev->gfx.mec.mqd_backup[mqd_idx])
4904b843c749SSergey Zigachev memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation));
4905b843c749SSergey Zigachev
4906b843c749SSergey Zigachev /* reset ring buffer */
4907b843c749SSergey Zigachev ring->wptr = 0;
4908b843c749SSergey Zigachev amdgpu_ring_clear_ring(ring);
4909b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
4910b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
4911b843c749SSergey Zigachev gfx_v8_0_mqd_commit(adev, mqd);
4912b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
4913b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
4914b843c749SSergey Zigachev } else {
4915b843c749SSergey Zigachev memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
4916b843c749SSergey Zigachev ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
4917b843c749SSergey Zigachev ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
4918b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
4919b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
4920b843c749SSergey Zigachev gfx_v8_0_mqd_init(ring);
4921b843c749SSergey Zigachev gfx_v8_0_mqd_commit(adev, mqd);
4922b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
4923b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
4924b843c749SSergey Zigachev
4925b843c749SSergey Zigachev if (adev->gfx.mec.mqd_backup[mqd_idx])
4926b843c749SSergey Zigachev memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation));
4927b843c749SSergey Zigachev }
4928b843c749SSergey Zigachev
4929b843c749SSergey Zigachev return 0;
4930b843c749SSergey Zigachev }
4931b843c749SSergey Zigachev
gfx_v8_0_kcq_init_queue(struct amdgpu_ring * ring)4932b843c749SSergey Zigachev static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)
4933b843c749SSergey Zigachev {
4934b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
4935b843c749SSergey Zigachev struct vi_mqd *mqd = ring->mqd_ptr;
4936b843c749SSergey Zigachev int mqd_idx = ring - &adev->gfx.compute_ring[0];
4937b843c749SSergey Zigachev
4938b843c749SSergey Zigachev if (!adev->in_gpu_reset && !adev->gfx.in_suspend) {
4939b843c749SSergey Zigachev memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
4940b843c749SSergey Zigachev ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
4941b843c749SSergey Zigachev ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
4942b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
4943b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
4944b843c749SSergey Zigachev gfx_v8_0_mqd_init(ring);
4945b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
4946b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
4947b843c749SSergey Zigachev
4948b843c749SSergey Zigachev if (adev->gfx.mec.mqd_backup[mqd_idx])
4949b843c749SSergey Zigachev memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation));
4950b843c749SSergey Zigachev } else if (adev->in_gpu_reset) { /* for GPU_RESET case */
4951b843c749SSergey Zigachev /* reset MQD to a clean status */
4952b843c749SSergey Zigachev if (adev->gfx.mec.mqd_backup[mqd_idx])
4953b843c749SSergey Zigachev memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation));
4954b843c749SSergey Zigachev /* reset ring buffer */
4955b843c749SSergey Zigachev ring->wptr = 0;
4956b843c749SSergey Zigachev amdgpu_ring_clear_ring(ring);
4957b843c749SSergey Zigachev } else {
4958b843c749SSergey Zigachev amdgpu_ring_clear_ring(ring);
4959b843c749SSergey Zigachev }
4960b843c749SSergey Zigachev return 0;
4961b843c749SSergey Zigachev }
4962b843c749SSergey Zigachev
gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device * adev)4963b843c749SSergey Zigachev static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev)
4964b843c749SSergey Zigachev {
4965b843c749SSergey Zigachev if (adev->asic_type > CHIP_TONGA) {
4966b843c749SSergey Zigachev WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, AMDGPU_DOORBELL_KIQ << 2);
4967b843c749SSergey Zigachev WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, AMDGPU_DOORBELL_MEC_RING7 << 2);
4968b843c749SSergey Zigachev }
4969b843c749SSergey Zigachev /* enable doorbells */
4970b843c749SSergey Zigachev WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1);
4971b843c749SSergey Zigachev }
4972b843c749SSergey Zigachev
gfx_v8_0_kiq_resume(struct amdgpu_device * adev)4973b843c749SSergey Zigachev static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)
4974b843c749SSergey Zigachev {
4975b843c749SSergey Zigachev struct amdgpu_ring *ring = NULL;
4976b843c749SSergey Zigachev int r = 0, i;
4977b843c749SSergey Zigachev
4978b843c749SSergey Zigachev gfx_v8_0_cp_compute_enable(adev, true);
4979b843c749SSergey Zigachev
4980b843c749SSergey Zigachev ring = &adev->gfx.kiq.ring;
4981b843c749SSergey Zigachev
4982b843c749SSergey Zigachev r = amdgpu_bo_reserve(ring->mqd_obj, false);
4983b843c749SSergey Zigachev if (unlikely(r != 0))
4984b843c749SSergey Zigachev goto done;
4985b843c749SSergey Zigachev
4986b843c749SSergey Zigachev r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr);
4987b843c749SSergey Zigachev if (!r) {
4988b843c749SSergey Zigachev r = gfx_v8_0_kiq_init_queue(ring);
4989b843c749SSergey Zigachev amdgpu_bo_kunmap(ring->mqd_obj);
4990b843c749SSergey Zigachev ring->mqd_ptr = NULL;
4991b843c749SSergey Zigachev }
4992b843c749SSergey Zigachev amdgpu_bo_unreserve(ring->mqd_obj);
4993b843c749SSergey Zigachev if (r)
4994b843c749SSergey Zigachev goto done;
4995b843c749SSergey Zigachev
4996b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
4997b843c749SSergey Zigachev ring = &adev->gfx.compute_ring[i];
4998b843c749SSergey Zigachev
4999b843c749SSergey Zigachev r = amdgpu_bo_reserve(ring->mqd_obj, false);
5000b843c749SSergey Zigachev if (unlikely(r != 0))
5001b843c749SSergey Zigachev goto done;
5002b843c749SSergey Zigachev r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr);
5003b843c749SSergey Zigachev if (!r) {
5004b843c749SSergey Zigachev r = gfx_v8_0_kcq_init_queue(ring);
5005b843c749SSergey Zigachev amdgpu_bo_kunmap(ring->mqd_obj);
5006b843c749SSergey Zigachev ring->mqd_ptr = NULL;
5007b843c749SSergey Zigachev }
5008b843c749SSergey Zigachev amdgpu_bo_unreserve(ring->mqd_obj);
5009b843c749SSergey Zigachev if (r)
5010b843c749SSergey Zigachev goto done;
5011b843c749SSergey Zigachev }
5012b843c749SSergey Zigachev
5013b843c749SSergey Zigachev gfx_v8_0_set_mec_doorbell_range(adev);
5014b843c749SSergey Zigachev
5015b843c749SSergey Zigachev r = gfx_v8_0_kiq_kcq_enable(adev);
5016b843c749SSergey Zigachev if (r)
5017b843c749SSergey Zigachev goto done;
5018b843c749SSergey Zigachev
5019b843c749SSergey Zigachev /* Test KIQ */
5020b843c749SSergey Zigachev ring = &adev->gfx.kiq.ring;
5021b843c749SSergey Zigachev ring->ready = true;
5022b843c749SSergey Zigachev r = amdgpu_ring_test_ring(ring);
5023b843c749SSergey Zigachev if (r) {
5024b843c749SSergey Zigachev ring->ready = false;
5025b843c749SSergey Zigachev goto done;
5026b843c749SSergey Zigachev }
5027b843c749SSergey Zigachev
5028b843c749SSergey Zigachev /* Test KCQs */
5029b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5030b843c749SSergey Zigachev ring = &adev->gfx.compute_ring[i];
5031b843c749SSergey Zigachev ring->ready = true;
5032b843c749SSergey Zigachev r = amdgpu_ring_test_ring(ring);
5033b843c749SSergey Zigachev if (r)
5034b843c749SSergey Zigachev ring->ready = false;
5035b843c749SSergey Zigachev }
5036b843c749SSergey Zigachev
5037b843c749SSergey Zigachev done:
5038b843c749SSergey Zigachev return r;
5039b843c749SSergey Zigachev }
5040b843c749SSergey Zigachev
gfx_v8_0_cp_resume(struct amdgpu_device * adev)5041b843c749SSergey Zigachev static int gfx_v8_0_cp_resume(struct amdgpu_device *adev)
5042b843c749SSergey Zigachev {
5043b843c749SSergey Zigachev int r;
5044b843c749SSergey Zigachev
5045b843c749SSergey Zigachev if (!(adev->flags & AMD_IS_APU))
5046b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, false);
5047b843c749SSergey Zigachev
5048b843c749SSergey Zigachev if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) {
5049b843c749SSergey Zigachev /* legacy firmware loading */
5050b843c749SSergey Zigachev r = gfx_v8_0_cp_gfx_load_microcode(adev);
5051b843c749SSergey Zigachev if (r)
5052b843c749SSergey Zigachev return r;
5053b843c749SSergey Zigachev
5054b843c749SSergey Zigachev r = gfx_v8_0_cp_compute_load_microcode(adev);
5055b843c749SSergey Zigachev if (r)
5056b843c749SSergey Zigachev return r;
5057b843c749SSergey Zigachev }
5058b843c749SSergey Zigachev
5059b843c749SSergey Zigachev r = gfx_v8_0_cp_gfx_resume(adev);
5060b843c749SSergey Zigachev if (r)
5061b843c749SSergey Zigachev return r;
5062b843c749SSergey Zigachev
5063b843c749SSergey Zigachev r = gfx_v8_0_kiq_resume(adev);
5064b843c749SSergey Zigachev if (r)
5065b843c749SSergey Zigachev return r;
5066b843c749SSergey Zigachev
5067b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, true);
5068b843c749SSergey Zigachev
5069b843c749SSergey Zigachev return 0;
5070b843c749SSergey Zigachev }
5071b843c749SSergey Zigachev
gfx_v8_0_cp_enable(struct amdgpu_device * adev,bool enable)5072b843c749SSergey Zigachev static void gfx_v8_0_cp_enable(struct amdgpu_device *adev, bool enable)
5073b843c749SSergey Zigachev {
5074b843c749SSergey Zigachev gfx_v8_0_cp_gfx_enable(adev, enable);
5075b843c749SSergey Zigachev gfx_v8_0_cp_compute_enable(adev, enable);
5076b843c749SSergey Zigachev }
5077b843c749SSergey Zigachev
gfx_v8_0_hw_init(void * handle)5078b843c749SSergey Zigachev static int gfx_v8_0_hw_init(void *handle)
5079b843c749SSergey Zigachev {
5080b843c749SSergey Zigachev int r;
5081b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5082b843c749SSergey Zigachev
5083b843c749SSergey Zigachev gfx_v8_0_init_golden_registers(adev);
5084b843c749SSergey Zigachev gfx_v8_0_gpu_init(adev);
5085b843c749SSergey Zigachev
5086b843c749SSergey Zigachev r = gfx_v8_0_rlc_resume(adev);
5087b843c749SSergey Zigachev if (r)
5088b843c749SSergey Zigachev return r;
5089b843c749SSergey Zigachev
5090b843c749SSergey Zigachev r = gfx_v8_0_cp_resume(adev);
5091b843c749SSergey Zigachev
5092b843c749SSergey Zigachev return r;
5093b843c749SSergey Zigachev }
5094b843c749SSergey Zigachev
gfx_v8_0_kcq_disable(struct amdgpu_ring * kiq_ring,struct amdgpu_ring * ring)5095b843c749SSergey Zigachev static int gfx_v8_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring *ring)
5096b843c749SSergey Zigachev {
5097b843c749SSergey Zigachev struct amdgpu_device *adev = kiq_ring->adev;
5098b843c749SSergey Zigachev uint32_t scratch, tmp = 0;
5099b843c749SSergey Zigachev int r, i;
5100b843c749SSergey Zigachev
5101b843c749SSergey Zigachev r = amdgpu_gfx_scratch_get(adev, &scratch);
5102b843c749SSergey Zigachev if (r) {
5103b843c749SSergey Zigachev DRM_ERROR("Failed to get scratch reg (%d).\n", r);
5104b843c749SSergey Zigachev return r;
5105b843c749SSergey Zigachev }
5106b843c749SSergey Zigachev WREG32(scratch, 0xCAFEDEAD);
5107b843c749SSergey Zigachev
5108b843c749SSergey Zigachev r = amdgpu_ring_alloc(kiq_ring, 10);
5109b843c749SSergey Zigachev if (r) {
5110b843c749SSergey Zigachev DRM_ERROR("Failed to lock KIQ (%d).\n", r);
5111b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
5112b843c749SSergey Zigachev return r;
5113b843c749SSergey Zigachev }
5114b843c749SSergey Zigachev
5115b843c749SSergey Zigachev /* unmap queues */
5116b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
5117b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
5118b843c749SSergey Zigachev PACKET3_UNMAP_QUEUES_ACTION(1) | /* RESET_QUEUES */
5119b843c749SSergey Zigachev PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
5120b843c749SSergey Zigachev PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) |
5121b843c749SSergey Zigachev PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
5122b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));
5123b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0);
5124b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0);
5125b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0);
5126b843c749SSergey Zigachev /* write to scratch for completion */
5127b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
5128b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
5129b843c749SSergey Zigachev amdgpu_ring_write(kiq_ring, 0xDEADBEEF);
5130b843c749SSergey Zigachev amdgpu_ring_commit(kiq_ring);
5131b843c749SSergey Zigachev
5132b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
5133b843c749SSergey Zigachev tmp = RREG32(scratch);
5134b843c749SSergey Zigachev if (tmp == 0xDEADBEEF)
5135b843c749SSergey Zigachev break;
5136b843c749SSergey Zigachev DRM_UDELAY(1);
5137b843c749SSergey Zigachev }
5138b843c749SSergey Zigachev if (i >= adev->usec_timeout) {
5139b843c749SSergey Zigachev DRM_ERROR("KCQ disabled failed (scratch(0x%04X)=0x%08X)\n", scratch, tmp);
5140b843c749SSergey Zigachev r = -EINVAL;
5141b843c749SSergey Zigachev }
5142b843c749SSergey Zigachev amdgpu_gfx_scratch_free(adev, scratch);
5143b843c749SSergey Zigachev return r;
5144b843c749SSergey Zigachev }
5145b843c749SSergey Zigachev
gfx_v8_0_hw_fini(void * handle)5146b843c749SSergey Zigachev static int gfx_v8_0_hw_fini(void *handle)
5147b843c749SSergey Zigachev {
5148b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5149b843c749SSergey Zigachev int i;
5150b843c749SSergey Zigachev
5151b843c749SSergey Zigachev amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
5152b843c749SSergey Zigachev amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
5153b843c749SSergey Zigachev
5154b843c749SSergey Zigachev amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
5155b843c749SSergey Zigachev
5156b843c749SSergey Zigachev amdgpu_irq_put(adev, &adev->gfx.sq_irq, 0);
5157b843c749SSergey Zigachev
5158b843c749SSergey Zigachev /* disable KCQ to avoid CPC touch memory not valid anymore */
5159b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++)
5160b843c749SSergey Zigachev gfx_v8_0_kcq_disable(&adev->gfx.kiq.ring, &adev->gfx.compute_ring[i]);
5161b843c749SSergey Zigachev
5162b843c749SSergey Zigachev if (amdgpu_sriov_vf(adev)) {
5163b843c749SSergey Zigachev pr_debug("For SRIOV client, shouldn't do anything.\n");
5164b843c749SSergey Zigachev return 0;
5165b843c749SSergey Zigachev }
5166b843c749SSergey Zigachev gfx_v8_0_cp_enable(adev, false);
5167b843c749SSergey Zigachev gfx_v8_0_rlc_stop(adev);
5168b843c749SSergey Zigachev
5169b843c749SSergey Zigachev amdgpu_device_ip_set_powergating_state(adev,
5170b843c749SSergey Zigachev AMD_IP_BLOCK_TYPE_GFX,
5171b843c749SSergey Zigachev AMD_PG_STATE_UNGATE);
5172b843c749SSergey Zigachev
5173b843c749SSergey Zigachev return 0;
5174b843c749SSergey Zigachev }
5175b843c749SSergey Zigachev
gfx_v8_0_suspend(void * handle)5176b843c749SSergey Zigachev static int gfx_v8_0_suspend(void *handle)
5177b843c749SSergey Zigachev {
5178b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5179b843c749SSergey Zigachev adev->gfx.in_suspend = true;
5180b843c749SSergey Zigachev return gfx_v8_0_hw_fini(adev);
5181b843c749SSergey Zigachev }
5182b843c749SSergey Zigachev
gfx_v8_0_resume(void * handle)5183b843c749SSergey Zigachev static int gfx_v8_0_resume(void *handle)
5184b843c749SSergey Zigachev {
5185b843c749SSergey Zigachev int r;
5186b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5187b843c749SSergey Zigachev
5188b843c749SSergey Zigachev r = gfx_v8_0_hw_init(adev);
5189b843c749SSergey Zigachev adev->gfx.in_suspend = false;
5190b843c749SSergey Zigachev return r;
5191b843c749SSergey Zigachev }
5192b843c749SSergey Zigachev
gfx_v8_0_is_idle(void * handle)5193b843c749SSergey Zigachev static bool gfx_v8_0_is_idle(void *handle)
5194b843c749SSergey Zigachev {
5195b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5196b843c749SSergey Zigachev
5197b843c749SSergey Zigachev if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE))
5198b843c749SSergey Zigachev return false;
5199b843c749SSergey Zigachev else
5200b843c749SSergey Zigachev return true;
5201b843c749SSergey Zigachev }
5202b843c749SSergey Zigachev
gfx_v8_0_wait_for_idle(void * handle)5203b843c749SSergey Zigachev static int gfx_v8_0_wait_for_idle(void *handle)
5204b843c749SSergey Zigachev {
5205b843c749SSergey Zigachev unsigned i;
5206b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5207b843c749SSergey Zigachev
5208b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
5209b843c749SSergey Zigachev if (gfx_v8_0_is_idle(handle))
5210b843c749SSergey Zigachev return 0;
5211b843c749SSergey Zigachev
5212b843c749SSergey Zigachev udelay(1);
5213b843c749SSergey Zigachev }
5214b843c749SSergey Zigachev return -ETIMEDOUT;
5215b843c749SSergey Zigachev }
5216b843c749SSergey Zigachev
gfx_v8_0_check_soft_reset(void * handle)5217b843c749SSergey Zigachev static bool gfx_v8_0_check_soft_reset(void *handle)
5218b843c749SSergey Zigachev {
5219b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5220b843c749SSergey Zigachev u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5221b843c749SSergey Zigachev u32 tmp;
5222b843c749SSergey Zigachev
5223b843c749SSergey Zigachev /* GRBM_STATUS */
5224b843c749SSergey Zigachev tmp = RREG32(mmGRBM_STATUS);
5225b843c749SSergey Zigachev if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK |
5226b843c749SSergey Zigachev GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK |
5227b843c749SSergey Zigachev GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK |
5228b843c749SSergey Zigachev GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK |
5229b843c749SSergey Zigachev GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK |
5230b843c749SSergey Zigachev GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK |
5231b843c749SSergey Zigachev GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) {
5232b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5233b843c749SSergey Zigachev GRBM_SOFT_RESET, SOFT_RESET_CP, 1);
5234b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5235b843c749SSergey Zigachev GRBM_SOFT_RESET, SOFT_RESET_GFX, 1);
5236b843c749SSergey Zigachev srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5237b843c749SSergey Zigachev SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1);
5238b843c749SSergey Zigachev }
5239b843c749SSergey Zigachev
5240b843c749SSergey Zigachev /* GRBM_STATUS2 */
5241b843c749SSergey Zigachev tmp = RREG32(mmGRBM_STATUS2);
5242b843c749SSergey Zigachev if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY))
5243b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5244b843c749SSergey Zigachev GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
5245b843c749SSergey Zigachev
5246b843c749SSergey Zigachev if (REG_GET_FIELD(tmp, GRBM_STATUS2, CPF_BUSY) ||
5247b843c749SSergey Zigachev REG_GET_FIELD(tmp, GRBM_STATUS2, CPC_BUSY) ||
5248b843c749SSergey Zigachev REG_GET_FIELD(tmp, GRBM_STATUS2, CPG_BUSY)) {
5249b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5250b843c749SSergey Zigachev SOFT_RESET_CPF, 1);
5251b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5252b843c749SSergey Zigachev SOFT_RESET_CPC, 1);
5253b843c749SSergey Zigachev grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5254b843c749SSergey Zigachev SOFT_RESET_CPG, 1);
5255b843c749SSergey Zigachev srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET,
5256b843c749SSergey Zigachev SOFT_RESET_GRBM, 1);
5257b843c749SSergey Zigachev }
5258b843c749SSergey Zigachev
5259b843c749SSergey Zigachev /* SRBM_STATUS */
5260b843c749SSergey Zigachev tmp = RREG32(mmSRBM_STATUS);
5261b843c749SSergey Zigachev if (REG_GET_FIELD(tmp, SRBM_STATUS, GRBM_RQ_PENDING))
5262b843c749SSergey Zigachev srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5263b843c749SSergey Zigachev SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1);
5264b843c749SSergey Zigachev if (REG_GET_FIELD(tmp, SRBM_STATUS, SEM_BUSY))
5265b843c749SSergey Zigachev srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5266b843c749SSergey Zigachev SRBM_SOFT_RESET, SOFT_RESET_SEM, 1);
5267b843c749SSergey Zigachev
5268b843c749SSergey Zigachev if (grbm_soft_reset || srbm_soft_reset) {
5269b843c749SSergey Zigachev adev->gfx.grbm_soft_reset = grbm_soft_reset;
5270b843c749SSergey Zigachev adev->gfx.srbm_soft_reset = srbm_soft_reset;
5271b843c749SSergey Zigachev return true;
5272b843c749SSergey Zigachev } else {
5273b843c749SSergey Zigachev adev->gfx.grbm_soft_reset = 0;
5274b843c749SSergey Zigachev adev->gfx.srbm_soft_reset = 0;
5275b843c749SSergey Zigachev return false;
5276b843c749SSergey Zigachev }
5277b843c749SSergey Zigachev }
5278b843c749SSergey Zigachev
gfx_v8_0_pre_soft_reset(void * handle)5279b843c749SSergey Zigachev static int gfx_v8_0_pre_soft_reset(void *handle)
5280b843c749SSergey Zigachev {
5281b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5282b843c749SSergey Zigachev u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5283b843c749SSergey Zigachev
5284b843c749SSergey Zigachev if ((!adev->gfx.grbm_soft_reset) &&
5285b843c749SSergey Zigachev (!adev->gfx.srbm_soft_reset))
5286b843c749SSergey Zigachev return 0;
5287b843c749SSergey Zigachev
5288b843c749SSergey Zigachev grbm_soft_reset = adev->gfx.grbm_soft_reset;
5289b843c749SSergey Zigachev srbm_soft_reset = adev->gfx.srbm_soft_reset;
5290b843c749SSergey Zigachev
5291b843c749SSergey Zigachev /* stop the rlc */
5292b843c749SSergey Zigachev gfx_v8_0_rlc_stop(adev);
5293b843c749SSergey Zigachev
5294b843c749SSergey Zigachev if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5295b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5296b843c749SSergey Zigachev /* Disable GFX parsing/prefetching */
5297b843c749SSergey Zigachev gfx_v8_0_cp_gfx_enable(adev, false);
5298b843c749SSergey Zigachev
5299b843c749SSergey Zigachev if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5300b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPF) ||
5301b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPC) ||
5302b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPG)) {
5303b843c749SSergey Zigachev int i;
5304b843c749SSergey Zigachev
5305b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5306b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
5307b843c749SSergey Zigachev
5308b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
5309b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
5310b843c749SSergey Zigachev gfx_v8_0_deactivate_hqd(adev, 2);
5311b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
5312b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
5313b843c749SSergey Zigachev }
5314b843c749SSergey Zigachev /* Disable MEC parsing/prefetching */
5315b843c749SSergey Zigachev gfx_v8_0_cp_compute_enable(adev, false);
5316b843c749SSergey Zigachev }
5317b843c749SSergey Zigachev
5318b843c749SSergey Zigachev return 0;
5319b843c749SSergey Zigachev }
5320b843c749SSergey Zigachev
gfx_v8_0_soft_reset(void * handle)5321b843c749SSergey Zigachev static int gfx_v8_0_soft_reset(void *handle)
5322b843c749SSergey Zigachev {
5323b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5324b843c749SSergey Zigachev u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5325b843c749SSergey Zigachev u32 tmp;
5326b843c749SSergey Zigachev
5327b843c749SSergey Zigachev if ((!adev->gfx.grbm_soft_reset) &&
5328b843c749SSergey Zigachev (!adev->gfx.srbm_soft_reset))
5329b843c749SSergey Zigachev return 0;
5330b843c749SSergey Zigachev
5331b843c749SSergey Zigachev grbm_soft_reset = adev->gfx.grbm_soft_reset;
5332b843c749SSergey Zigachev srbm_soft_reset = adev->gfx.srbm_soft_reset;
5333b843c749SSergey Zigachev
5334b843c749SSergey Zigachev if (grbm_soft_reset || srbm_soft_reset) {
5335b843c749SSergey Zigachev tmp = RREG32(mmGMCON_DEBUG);
5336b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_STALL, 1);
5337b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_CLEAR, 1);
5338b843c749SSergey Zigachev WREG32(mmGMCON_DEBUG, tmp);
5339b843c749SSergey Zigachev udelay(50);
5340b843c749SSergey Zigachev }
5341b843c749SSergey Zigachev
5342b843c749SSergey Zigachev if (grbm_soft_reset) {
5343b843c749SSergey Zigachev tmp = RREG32(mmGRBM_SOFT_RESET);
5344b843c749SSergey Zigachev tmp |= grbm_soft_reset;
5345b843c749SSergey Zigachev dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5346b843c749SSergey Zigachev WREG32(mmGRBM_SOFT_RESET, tmp);
5347b843c749SSergey Zigachev tmp = RREG32(mmGRBM_SOFT_RESET);
5348b843c749SSergey Zigachev
5349b843c749SSergey Zigachev udelay(50);
5350b843c749SSergey Zigachev
5351b843c749SSergey Zigachev tmp &= ~grbm_soft_reset;
5352b843c749SSergey Zigachev WREG32(mmGRBM_SOFT_RESET, tmp);
5353b843c749SSergey Zigachev tmp = RREG32(mmGRBM_SOFT_RESET);
5354b843c749SSergey Zigachev }
5355b843c749SSergey Zigachev
5356b843c749SSergey Zigachev if (srbm_soft_reset) {
5357b843c749SSergey Zigachev tmp = RREG32(mmSRBM_SOFT_RESET);
5358b843c749SSergey Zigachev tmp |= srbm_soft_reset;
5359b843c749SSergey Zigachev dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5360b843c749SSergey Zigachev WREG32(mmSRBM_SOFT_RESET, tmp);
5361b843c749SSergey Zigachev tmp = RREG32(mmSRBM_SOFT_RESET);
5362b843c749SSergey Zigachev
5363b843c749SSergey Zigachev udelay(50);
5364b843c749SSergey Zigachev
5365b843c749SSergey Zigachev tmp &= ~srbm_soft_reset;
5366b843c749SSergey Zigachev WREG32(mmSRBM_SOFT_RESET, tmp);
5367b843c749SSergey Zigachev tmp = RREG32(mmSRBM_SOFT_RESET);
5368b843c749SSergey Zigachev }
5369b843c749SSergey Zigachev
5370b843c749SSergey Zigachev if (grbm_soft_reset || srbm_soft_reset) {
5371b843c749SSergey Zigachev tmp = RREG32(mmGMCON_DEBUG);
5372b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_STALL, 0);
5373b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_CLEAR, 0);
5374b843c749SSergey Zigachev WREG32(mmGMCON_DEBUG, tmp);
5375b843c749SSergey Zigachev }
5376b843c749SSergey Zigachev
5377b843c749SSergey Zigachev /* Wait a little for things to settle down */
5378b843c749SSergey Zigachev udelay(50);
5379b843c749SSergey Zigachev
5380b843c749SSergey Zigachev return 0;
5381b843c749SSergey Zigachev }
5382b843c749SSergey Zigachev
gfx_v8_0_post_soft_reset(void * handle)5383b843c749SSergey Zigachev static int gfx_v8_0_post_soft_reset(void *handle)
5384b843c749SSergey Zigachev {
5385b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5386b843c749SSergey Zigachev u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5387b843c749SSergey Zigachev
5388b843c749SSergey Zigachev if ((!adev->gfx.grbm_soft_reset) &&
5389b843c749SSergey Zigachev (!adev->gfx.srbm_soft_reset))
5390b843c749SSergey Zigachev return 0;
5391b843c749SSergey Zigachev
5392b843c749SSergey Zigachev grbm_soft_reset = adev->gfx.grbm_soft_reset;
5393b843c749SSergey Zigachev srbm_soft_reset = adev->gfx.srbm_soft_reset;
5394b843c749SSergey Zigachev
5395b843c749SSergey Zigachev if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5396b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5397b843c749SSergey Zigachev gfx_v8_0_cp_gfx_resume(adev);
5398b843c749SSergey Zigachev
5399b843c749SSergey Zigachev if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5400b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPF) ||
5401b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPC) ||
5402b843c749SSergey Zigachev REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPG)) {
5403b843c749SSergey Zigachev int i;
5404b843c749SSergey Zigachev
5405b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5406b843c749SSergey Zigachev struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
5407b843c749SSergey Zigachev
5408b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
5409b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
5410b843c749SSergey Zigachev gfx_v8_0_deactivate_hqd(adev, 2);
5411b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
5412b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
5413b843c749SSergey Zigachev }
5414b843c749SSergey Zigachev gfx_v8_0_kiq_resume(adev);
5415b843c749SSergey Zigachev }
5416b843c749SSergey Zigachev gfx_v8_0_rlc_start(adev);
5417b843c749SSergey Zigachev
5418b843c749SSergey Zigachev return 0;
5419b843c749SSergey Zigachev }
5420b843c749SSergey Zigachev
5421b843c749SSergey Zigachev /**
5422b843c749SSergey Zigachev * gfx_v8_0_get_gpu_clock_counter - return GPU clock counter snapshot
5423b843c749SSergey Zigachev *
5424b843c749SSergey Zigachev * @adev: amdgpu_device pointer
5425b843c749SSergey Zigachev *
5426b843c749SSergey Zigachev * Fetches a GPU clock counter snapshot.
5427b843c749SSergey Zigachev * Returns the 64 bit clock counter snapshot.
5428b843c749SSergey Zigachev */
gfx_v8_0_get_gpu_clock_counter(struct amdgpu_device * adev)5429b843c749SSergey Zigachev static uint64_t gfx_v8_0_get_gpu_clock_counter(struct amdgpu_device *adev)
5430b843c749SSergey Zigachev {
5431b843c749SSergey Zigachev uint64_t clock;
5432b843c749SSergey Zigachev
5433b843c749SSergey Zigachev mutex_lock(&adev->gfx.gpu_clock_mutex);
5434b843c749SSergey Zigachev WREG32(mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
5435b843c749SSergey Zigachev clock = (uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_LSB) |
5436b843c749SSergey Zigachev ((uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
5437b843c749SSergey Zigachev mutex_unlock(&adev->gfx.gpu_clock_mutex);
5438b843c749SSergey Zigachev return clock;
5439b843c749SSergey Zigachev }
5440b843c749SSergey Zigachev
gfx_v8_0_ring_emit_gds_switch(struct amdgpu_ring * ring,uint32_t vmid,uint32_t gds_base,uint32_t gds_size,uint32_t gws_base,uint32_t gws_size,uint32_t oa_base,uint32_t oa_size)5441b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
5442b843c749SSergey Zigachev uint32_t vmid,
5443b843c749SSergey Zigachev uint32_t gds_base, uint32_t gds_size,
5444b843c749SSergey Zigachev uint32_t gws_base, uint32_t gws_size,
5445b843c749SSergey Zigachev uint32_t oa_base, uint32_t oa_size)
5446b843c749SSergey Zigachev {
5447b843c749SSergey Zigachev gds_base = gds_base >> AMDGPU_GDS_SHIFT;
5448b843c749SSergey Zigachev gds_size = gds_size >> AMDGPU_GDS_SHIFT;
5449b843c749SSergey Zigachev
5450b843c749SSergey Zigachev gws_base = gws_base >> AMDGPU_GWS_SHIFT;
5451b843c749SSergey Zigachev gws_size = gws_size >> AMDGPU_GWS_SHIFT;
5452b843c749SSergey Zigachev
5453b843c749SSergey Zigachev oa_base = oa_base >> AMDGPU_OA_SHIFT;
5454b843c749SSergey Zigachev oa_size = oa_size >> AMDGPU_OA_SHIFT;
5455b843c749SSergey Zigachev
5456b843c749SSergey Zigachev /* GDS Base */
5457b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5458b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5459b843c749SSergey Zigachev WRITE_DATA_DST_SEL(0)));
5460b843c749SSergey Zigachev amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_base);
5461b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
5462b843c749SSergey Zigachev amdgpu_ring_write(ring, gds_base);
5463b843c749SSergey Zigachev
5464b843c749SSergey Zigachev /* GDS Size */
5465b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5466b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5467b843c749SSergey Zigachev WRITE_DATA_DST_SEL(0)));
5468b843c749SSergey Zigachev amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_size);
5469b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
5470b843c749SSergey Zigachev amdgpu_ring_write(ring, gds_size);
5471b843c749SSergey Zigachev
5472b843c749SSergey Zigachev /* GWS */
5473b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5474b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5475b843c749SSergey Zigachev WRITE_DATA_DST_SEL(0)));
5476b843c749SSergey Zigachev amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].gws);
5477b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
5478b843c749SSergey Zigachev amdgpu_ring_write(ring, gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
5479b843c749SSergey Zigachev
5480b843c749SSergey Zigachev /* OA */
5481b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5482b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5483b843c749SSergey Zigachev WRITE_DATA_DST_SEL(0)));
5484b843c749SSergey Zigachev amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].oa);
5485b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
5486b843c749SSergey Zigachev amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base));
5487b843c749SSergey Zigachev }
5488b843c749SSergey Zigachev
wave_read_ind(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t address)5489b843c749SSergey Zigachev static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
5490b843c749SSergey Zigachev {
5491b843c749SSergey Zigachev WREG32(mmSQ_IND_INDEX,
5492b843c749SSergey Zigachev (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
5493b843c749SSergey Zigachev (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
5494b843c749SSergey Zigachev (address << SQ_IND_INDEX__INDEX__SHIFT) |
5495b843c749SSergey Zigachev (SQ_IND_INDEX__FORCE_READ_MASK));
5496b843c749SSergey Zigachev return RREG32(mmSQ_IND_DATA);
5497b843c749SSergey Zigachev }
5498b843c749SSergey Zigachev
wave_read_regs(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t thread,uint32_t regno,uint32_t num,uint32_t * out)5499b843c749SSergey Zigachev static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,
5500b843c749SSergey Zigachev uint32_t wave, uint32_t thread,
5501b843c749SSergey Zigachev uint32_t regno, uint32_t num, uint32_t *out)
5502b843c749SSergey Zigachev {
5503b843c749SSergey Zigachev WREG32(mmSQ_IND_INDEX,
5504b843c749SSergey Zigachev (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
5505b843c749SSergey Zigachev (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
5506b843c749SSergey Zigachev (regno << SQ_IND_INDEX__INDEX__SHIFT) |
5507b843c749SSergey Zigachev (thread << SQ_IND_INDEX__THREAD_ID__SHIFT) |
5508b843c749SSergey Zigachev (SQ_IND_INDEX__FORCE_READ_MASK) |
5509b843c749SSergey Zigachev (SQ_IND_INDEX__AUTO_INCR_MASK));
5510b843c749SSergey Zigachev while (num--)
5511b843c749SSergey Zigachev *(out++) = RREG32(mmSQ_IND_DATA);
5512b843c749SSergey Zigachev }
5513b843c749SSergey Zigachev
gfx_v8_0_read_wave_data(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t * dst,int * no_fields)5514b843c749SSergey Zigachev static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)
5515b843c749SSergey Zigachev {
5516b843c749SSergey Zigachev /* type 0 wave data */
5517b843c749SSergey Zigachev dst[(*no_fields)++] = 0;
5518b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
5519b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
5520b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
5521b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
5522b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
5523b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID);
5524b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
5525b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
5526b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC);
5527b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC);
5528b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS);
5529b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
5530b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_LO);
5531b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_HI);
5532b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_LO);
5533b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_HI);
5534b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0);
5535b843c749SSergey Zigachev dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0);
5536b843c749SSergey Zigachev }
5537b843c749SSergey Zigachev
gfx_v8_0_read_wave_sgprs(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t start,uint32_t size,uint32_t * dst)5538b843c749SSergey Zigachev static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
5539b843c749SSergey Zigachev uint32_t wave, uint32_t start,
5540b843c749SSergey Zigachev uint32_t size, uint32_t *dst)
5541b843c749SSergey Zigachev {
5542b843c749SSergey Zigachev wave_read_regs(
5543b843c749SSergey Zigachev adev, simd, wave, 0,
5544b843c749SSergey Zigachev start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
5545b843c749SSergey Zigachev }
5546b843c749SSergey Zigachev
5547b843c749SSergey Zigachev
5548b843c749SSergey Zigachev static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = {
5549b843c749SSergey Zigachev .get_gpu_clock_counter = &gfx_v8_0_get_gpu_clock_counter,
5550b843c749SSergey Zigachev .select_se_sh = &gfx_v8_0_select_se_sh,
5551b843c749SSergey Zigachev .read_wave_data = &gfx_v8_0_read_wave_data,
5552b843c749SSergey Zigachev .read_wave_sgprs = &gfx_v8_0_read_wave_sgprs,
5553b843c749SSergey Zigachev .select_me_pipe_q = &gfx_v8_0_select_me_pipe_q
5554b843c749SSergey Zigachev };
5555b843c749SSergey Zigachev
gfx_v8_0_early_init(void * handle)5556b843c749SSergey Zigachev static int gfx_v8_0_early_init(void *handle)
5557b843c749SSergey Zigachev {
5558b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5559b843c749SSergey Zigachev
5560b843c749SSergey Zigachev adev->gfx.num_gfx_rings = GFX8_NUM_GFX_RINGS;
5561b843c749SSergey Zigachev adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS;
5562b843c749SSergey Zigachev adev->gfx.funcs = &gfx_v8_0_gfx_funcs;
5563b843c749SSergey Zigachev gfx_v8_0_set_ring_funcs(adev);
5564b843c749SSergey Zigachev gfx_v8_0_set_irq_funcs(adev);
5565b843c749SSergey Zigachev gfx_v8_0_set_gds_init(adev);
5566b843c749SSergey Zigachev gfx_v8_0_set_rlc_funcs(adev);
5567b843c749SSergey Zigachev
5568b843c749SSergey Zigachev return 0;
5569b843c749SSergey Zigachev }
5570b843c749SSergey Zigachev
gfx_v8_0_late_init(void * handle)5571b843c749SSergey Zigachev static int gfx_v8_0_late_init(void *handle)
5572b843c749SSergey Zigachev {
5573b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5574b843c749SSergey Zigachev int r;
5575b843c749SSergey Zigachev
5576b843c749SSergey Zigachev r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0);
5577b843c749SSergey Zigachev if (r)
5578b843c749SSergey Zigachev return r;
5579b843c749SSergey Zigachev
5580b843c749SSergey Zigachev r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0);
5581b843c749SSergey Zigachev if (r)
5582b843c749SSergey Zigachev return r;
5583b843c749SSergey Zigachev
5584b843c749SSergey Zigachev /* requires IBs so do in late init after IB pool is initialized */
5585b843c749SSergey Zigachev r = gfx_v8_0_do_edc_gpr_workarounds(adev);
5586b843c749SSergey Zigachev if (r)
5587b843c749SSergey Zigachev return r;
5588b843c749SSergey Zigachev
5589b843c749SSergey Zigachev r = amdgpu_irq_get(adev, &adev->gfx.cp_ecc_error_irq, 0);
5590b843c749SSergey Zigachev if (r) {
5591b843c749SSergey Zigachev DRM_ERROR("amdgpu_irq_get() failed to get IRQ for EDC, r: %d.\n", r);
5592b843c749SSergey Zigachev return r;
5593b843c749SSergey Zigachev }
5594b843c749SSergey Zigachev
5595b843c749SSergey Zigachev r = amdgpu_irq_get(adev, &adev->gfx.sq_irq, 0);
5596b843c749SSergey Zigachev if (r) {
5597b843c749SSergey Zigachev DRM_ERROR(
5598b843c749SSergey Zigachev "amdgpu_irq_get() failed to get IRQ for SQ, r: %d.\n",
5599b843c749SSergey Zigachev r);
5600b843c749SSergey Zigachev return r;
5601b843c749SSergey Zigachev }
5602b843c749SSergey Zigachev
5603b843c749SSergey Zigachev return 0;
5604b843c749SSergey Zigachev }
5605b843c749SSergey Zigachev
gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device * adev,bool enable)5606b843c749SSergey Zigachev static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev,
5607b843c749SSergey Zigachev bool enable)
5608b843c749SSergey Zigachev {
5609b843c749SSergey Zigachev if (((adev->asic_type == CHIP_POLARIS11) ||
5610b843c749SSergey Zigachev (adev->asic_type == CHIP_POLARIS12) ||
5611b843c749SSergey Zigachev (adev->asic_type == CHIP_VEGAM)) &&
5612b843c749SSergey Zigachev adev->powerplay.pp_funcs->set_powergating_by_smu)
5613b843c749SSergey Zigachev /* Send msg to SMU via Powerplay */
5614b843c749SSergey Zigachev amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, enable);
5615b843c749SSergey Zigachev
5616b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, STATIC_PER_CU_PG_ENABLE, enable ? 1 : 0);
5617b843c749SSergey Zigachev }
5618b843c749SSergey Zigachev
gfx_v8_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device * adev,bool enable)5619b843c749SSergey Zigachev static void gfx_v8_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device *adev,
5620b843c749SSergey Zigachev bool enable)
5621b843c749SSergey Zigachev {
5622b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, DYN_PER_CU_PG_ENABLE, enable ? 1 : 0);
5623b843c749SSergey Zigachev }
5624b843c749SSergey Zigachev
polaris11_enable_gfx_quick_mg_power_gating(struct amdgpu_device * adev,bool enable)5625b843c749SSergey Zigachev static void polaris11_enable_gfx_quick_mg_power_gating(struct amdgpu_device *adev,
5626b843c749SSergey Zigachev bool enable)
5627b843c749SSergey Zigachev {
5628b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, QUICK_PG_ENABLE, enable ? 1 : 0);
5629b843c749SSergey Zigachev }
5630b843c749SSergey Zigachev
cz_enable_gfx_cg_power_gating(struct amdgpu_device * adev,bool enable)5631b843c749SSergey Zigachev static void cz_enable_gfx_cg_power_gating(struct amdgpu_device *adev,
5632b843c749SSergey Zigachev bool enable)
5633b843c749SSergey Zigachev {
5634b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, GFX_POWER_GATING_ENABLE, enable ? 1 : 0);
5635b843c749SSergey Zigachev }
5636b843c749SSergey Zigachev
cz_enable_gfx_pipeline_power_gating(struct amdgpu_device * adev,bool enable)5637b843c749SSergey Zigachev static void cz_enable_gfx_pipeline_power_gating(struct amdgpu_device *adev,
5638b843c749SSergey Zigachev bool enable)
5639b843c749SSergey Zigachev {
5640b843c749SSergey Zigachev WREG32_FIELD(RLC_PG_CNTL, GFX_PIPELINE_PG_ENABLE, enable ? 1 : 0);
5641b843c749SSergey Zigachev
5642b843c749SSergey Zigachev /* Read any GFX register to wake up GFX. */
5643b843c749SSergey Zigachev if (!enable)
5644b843c749SSergey Zigachev RREG32(mmDB_RENDER_CONTROL);
5645b843c749SSergey Zigachev }
5646b843c749SSergey Zigachev
cz_update_gfx_cg_power_gating(struct amdgpu_device * adev,bool enable)5647b843c749SSergey Zigachev static void cz_update_gfx_cg_power_gating(struct amdgpu_device *adev,
5648b843c749SSergey Zigachev bool enable)
5649b843c749SSergey Zigachev {
5650b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) {
5651b843c749SSergey Zigachev cz_enable_gfx_cg_power_gating(adev, true);
5652b843c749SSergey Zigachev if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PIPELINE)
5653b843c749SSergey Zigachev cz_enable_gfx_pipeline_power_gating(adev, true);
5654b843c749SSergey Zigachev } else {
5655b843c749SSergey Zigachev cz_enable_gfx_cg_power_gating(adev, false);
5656b843c749SSergey Zigachev cz_enable_gfx_pipeline_power_gating(adev, false);
5657b843c749SSergey Zigachev }
5658b843c749SSergey Zigachev }
5659b843c749SSergey Zigachev
gfx_v8_0_set_powergating_state(void * handle,enum amd_powergating_state state)5660b843c749SSergey Zigachev static int gfx_v8_0_set_powergating_state(void *handle,
5661b843c749SSergey Zigachev enum amd_powergating_state state)
5662b843c749SSergey Zigachev {
5663b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5664b843c749SSergey Zigachev bool enable = (state == AMD_PG_STATE_GATE);
5665b843c749SSergey Zigachev
5666b843c749SSergey Zigachev if (amdgpu_sriov_vf(adev))
5667b843c749SSergey Zigachev return 0;
5668b843c749SSergey Zigachev
5669b843c749SSergey Zigachev if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_SMG |
5670b843c749SSergey Zigachev AMD_PG_SUPPORT_RLC_SMU_HS |
5671b843c749SSergey Zigachev AMD_PG_SUPPORT_CP |
5672b843c749SSergey Zigachev AMD_PG_SUPPORT_GFX_DMG))
5673b843c749SSergey Zigachev adev->gfx.rlc.funcs->enter_safe_mode(adev);
5674b843c749SSergey Zigachev switch (adev->asic_type) {
5675b843c749SSergey Zigachev case CHIP_CARRIZO:
5676b843c749SSergey Zigachev case CHIP_STONEY:
5677b843c749SSergey Zigachev
5678b843c749SSergey Zigachev if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {
5679b843c749SSergey Zigachev cz_enable_sck_slow_down_on_power_up(adev, true);
5680b843c749SSergey Zigachev cz_enable_sck_slow_down_on_power_down(adev, true);
5681b843c749SSergey Zigachev } else {
5682b843c749SSergey Zigachev cz_enable_sck_slow_down_on_power_up(adev, false);
5683b843c749SSergey Zigachev cz_enable_sck_slow_down_on_power_down(adev, false);
5684b843c749SSergey Zigachev }
5685b843c749SSergey Zigachev if (adev->pg_flags & AMD_PG_SUPPORT_CP)
5686b843c749SSergey Zigachev cz_enable_cp_power_gating(adev, true);
5687b843c749SSergey Zigachev else
5688b843c749SSergey Zigachev cz_enable_cp_power_gating(adev, false);
5689b843c749SSergey Zigachev
5690b843c749SSergey Zigachev cz_update_gfx_cg_power_gating(adev, enable);
5691b843c749SSergey Zigachev
5692b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG) && enable)
5693b843c749SSergey Zigachev gfx_v8_0_enable_gfx_static_mg_power_gating(adev, true);
5694b843c749SSergey Zigachev else
5695b843c749SSergey Zigachev gfx_v8_0_enable_gfx_static_mg_power_gating(adev, false);
5696b843c749SSergey Zigachev
5697b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG) && enable)
5698b843c749SSergey Zigachev gfx_v8_0_enable_gfx_dynamic_mg_power_gating(adev, true);
5699b843c749SSergey Zigachev else
5700b843c749SSergey Zigachev gfx_v8_0_enable_gfx_dynamic_mg_power_gating(adev, false);
5701b843c749SSergey Zigachev break;
5702b843c749SSergey Zigachev case CHIP_POLARIS11:
5703b843c749SSergey Zigachev case CHIP_POLARIS12:
5704b843c749SSergey Zigachev case CHIP_VEGAM:
5705b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG) && enable)
5706b843c749SSergey Zigachev gfx_v8_0_enable_gfx_static_mg_power_gating(adev, true);
5707b843c749SSergey Zigachev else
5708b843c749SSergey Zigachev gfx_v8_0_enable_gfx_static_mg_power_gating(adev, false);
5709b843c749SSergey Zigachev
5710b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG) && enable)
5711b843c749SSergey Zigachev gfx_v8_0_enable_gfx_dynamic_mg_power_gating(adev, true);
5712b843c749SSergey Zigachev else
5713b843c749SSergey Zigachev gfx_v8_0_enable_gfx_dynamic_mg_power_gating(adev, false);
5714b843c749SSergey Zigachev
5715b843c749SSergey Zigachev if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_QUICK_MG) && enable)
5716b843c749SSergey Zigachev polaris11_enable_gfx_quick_mg_power_gating(adev, true);
5717b843c749SSergey Zigachev else
5718b843c749SSergey Zigachev polaris11_enable_gfx_quick_mg_power_gating(adev, false);
5719b843c749SSergey Zigachev break;
5720b843c749SSergey Zigachev default:
5721b843c749SSergey Zigachev break;
5722b843c749SSergey Zigachev }
5723b843c749SSergey Zigachev if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_SMG |
5724b843c749SSergey Zigachev AMD_PG_SUPPORT_RLC_SMU_HS |
5725b843c749SSergey Zigachev AMD_PG_SUPPORT_CP |
5726b843c749SSergey Zigachev AMD_PG_SUPPORT_GFX_DMG))
5727b843c749SSergey Zigachev adev->gfx.rlc.funcs->exit_safe_mode(adev);
5728b843c749SSergey Zigachev return 0;
5729b843c749SSergey Zigachev }
5730b843c749SSergey Zigachev
gfx_v8_0_get_clockgating_state(void * handle,u32 * flags)5731b843c749SSergey Zigachev static void gfx_v8_0_get_clockgating_state(void *handle, u32 *flags)
5732b843c749SSergey Zigachev {
5733b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5734b843c749SSergey Zigachev int data;
5735b843c749SSergey Zigachev
5736b843c749SSergey Zigachev if (amdgpu_sriov_vf(adev))
5737b843c749SSergey Zigachev *flags = 0;
5738b843c749SSergey Zigachev
5739b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_MGCG */
5740b843c749SSergey Zigachev data = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
5741b843c749SSergey Zigachev if (!(data & RLC_CGTT_MGCG_OVERRIDE__CPF_MASK))
5742b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_MGCG;
5743b843c749SSergey Zigachev
5744b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_CGLG */
5745b843c749SSergey Zigachev data = RREG32(mmRLC_CGCG_CGLS_CTRL);
5746b843c749SSergey Zigachev if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK)
5747b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_CGCG;
5748b843c749SSergey Zigachev
5749b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_CGLS */
5750b843c749SSergey Zigachev if (data & RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK)
5751b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_CGLS;
5752b843c749SSergey Zigachev
5753b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_CGTS */
5754b843c749SSergey Zigachev data = RREG32(mmCGTS_SM_CTRL_REG);
5755b843c749SSergey Zigachev if (!(data & CGTS_SM_CTRL_REG__OVERRIDE_MASK))
5756b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_CGTS;
5757b843c749SSergey Zigachev
5758b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_CGTS_LS */
5759b843c749SSergey Zigachev if (!(data & CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK))
5760b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_CGTS_LS;
5761b843c749SSergey Zigachev
5762b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_RLC_LS */
5763b843c749SSergey Zigachev data = RREG32(mmRLC_MEM_SLP_CNTL);
5764b843c749SSergey Zigachev if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK)
5765b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS;
5766b843c749SSergey Zigachev
5767b843c749SSergey Zigachev /* AMD_CG_SUPPORT_GFX_CP_LS */
5768b843c749SSergey Zigachev data = RREG32(mmCP_MEM_SLP_CNTL);
5769b843c749SSergey Zigachev if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK)
5770b843c749SSergey Zigachev *flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS;
5771b843c749SSergey Zigachev }
5772b843c749SSergey Zigachev
gfx_v8_0_send_serdes_cmd(struct amdgpu_device * adev,uint32_t reg_addr,uint32_t cmd)5773b843c749SSergey Zigachev static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,
5774b843c749SSergey Zigachev uint32_t reg_addr, uint32_t cmd)
5775b843c749SSergey Zigachev {
5776b843c749SSergey Zigachev uint32_t data;
5777b843c749SSergey Zigachev
5778b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
5779b843c749SSergey Zigachev
5780b843c749SSergey Zigachev WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5781b843c749SSergey Zigachev WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5782b843c749SSergey Zigachev
5783b843c749SSergey Zigachev data = RREG32(mmRLC_SERDES_WR_CTRL);
5784b843c749SSergey Zigachev if (adev->asic_type == CHIP_STONEY)
5785b843c749SSergey Zigachev data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
5786b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
5787b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__P1_SELECT_MASK |
5788b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__P2_SELECT_MASK |
5789b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__RDDATA_RESET_MASK |
5790b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__POWER_DOWN_MASK |
5791b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__POWER_UP_MASK |
5792b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK |
5793b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK);
5794b843c749SSergey Zigachev else
5795b843c749SSergey Zigachev data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
5796b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
5797b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__P1_SELECT_MASK |
5798b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__P2_SELECT_MASK |
5799b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__RDDATA_RESET_MASK |
5800b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__POWER_DOWN_MASK |
5801b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__POWER_UP_MASK |
5802b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK |
5803b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__BPM_DATA_MASK |
5804b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__REG_ADDR_MASK |
5805b843c749SSergey Zigachev RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK);
5806b843c749SSergey Zigachev data |= (RLC_SERDES_WR_CTRL__RSVD_BPM_ADDR_MASK |
5807b843c749SSergey Zigachev (cmd << RLC_SERDES_WR_CTRL__BPM_DATA__SHIFT) |
5808b843c749SSergey Zigachev (reg_addr << RLC_SERDES_WR_CTRL__REG_ADDR__SHIFT) |
5809b843c749SSergey Zigachev (0xff << RLC_SERDES_WR_CTRL__BPM_ADDR__SHIFT));
5810b843c749SSergey Zigachev
5811b843c749SSergey Zigachev WREG32(mmRLC_SERDES_WR_CTRL, data);
5812b843c749SSergey Zigachev }
5813b843c749SSergey Zigachev
5814b843c749SSergey Zigachev #define MSG_ENTER_RLC_SAFE_MODE 1
5815b843c749SSergey Zigachev #define MSG_EXIT_RLC_SAFE_MODE 0
5816b843c749SSergey Zigachev #define RLC_GPR_REG2__REQ_MASK 0x00000001
5817b843c749SSergey Zigachev #define RLC_GPR_REG2__REQ__SHIFT 0
5818b843c749SSergey Zigachev #define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001
5819b843c749SSergey Zigachev #define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e
5820b843c749SSergey Zigachev
iceland_enter_rlc_safe_mode(struct amdgpu_device * adev)5821b843c749SSergey Zigachev static void iceland_enter_rlc_safe_mode(struct amdgpu_device *adev)
5822b843c749SSergey Zigachev {
5823b843c749SSergey Zigachev u32 data;
5824b843c749SSergey Zigachev unsigned i;
5825b843c749SSergey Zigachev
5826b843c749SSergey Zigachev data = RREG32(mmRLC_CNTL);
5827b843c749SSergey Zigachev if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK))
5828b843c749SSergey Zigachev return;
5829b843c749SSergey Zigachev
5830b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) {
5831b843c749SSergey Zigachev data |= RLC_SAFE_MODE__CMD_MASK;
5832b843c749SSergey Zigachev data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5833b843c749SSergey Zigachev data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
5834b843c749SSergey Zigachev WREG32(mmRLC_SAFE_MODE, data);
5835b843c749SSergey Zigachev
5836b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
5837b843c749SSergey Zigachev if ((RREG32(mmRLC_GPM_STAT) &
5838b843c749SSergey Zigachev (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
5839b843c749SSergey Zigachev RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) ==
5840b843c749SSergey Zigachev (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
5841b843c749SSergey Zigachev RLC_GPM_STAT__GFX_POWER_STATUS_MASK))
5842b843c749SSergey Zigachev break;
5843b843c749SSergey Zigachev udelay(1);
5844b843c749SSergey Zigachev }
5845b843c749SSergey Zigachev
5846b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
5847b843c749SSergey Zigachev if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
5848b843c749SSergey Zigachev break;
5849b843c749SSergey Zigachev udelay(1);
5850b843c749SSergey Zigachev }
5851b843c749SSergey Zigachev adev->gfx.rlc.in_safe_mode = true;
5852b843c749SSergey Zigachev }
5853b843c749SSergey Zigachev }
5854b843c749SSergey Zigachev
iceland_exit_rlc_safe_mode(struct amdgpu_device * adev)5855b843c749SSergey Zigachev static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev)
5856b843c749SSergey Zigachev {
5857b843c749SSergey Zigachev u32 data = 0;
5858b843c749SSergey Zigachev unsigned i;
5859b843c749SSergey Zigachev
5860b843c749SSergey Zigachev data = RREG32(mmRLC_CNTL);
5861b843c749SSergey Zigachev if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK))
5862b843c749SSergey Zigachev return;
5863b843c749SSergey Zigachev
5864b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) {
5865b843c749SSergey Zigachev if (adev->gfx.rlc.in_safe_mode) {
5866b843c749SSergey Zigachev data |= RLC_SAFE_MODE__CMD_MASK;
5867b843c749SSergey Zigachev data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5868b843c749SSergey Zigachev WREG32(mmRLC_SAFE_MODE, data);
5869b843c749SSergey Zigachev adev->gfx.rlc.in_safe_mode = false;
5870b843c749SSergey Zigachev }
5871b843c749SSergey Zigachev }
5872b843c749SSergey Zigachev
5873b843c749SSergey Zigachev for (i = 0; i < adev->usec_timeout; i++) {
5874b843c749SSergey Zigachev if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
5875b843c749SSergey Zigachev break;
5876b843c749SSergey Zigachev udelay(1);
5877b843c749SSergey Zigachev }
5878b843c749SSergey Zigachev }
5879b843c749SSergey Zigachev
5880b843c749SSergey Zigachev static const struct amdgpu_rlc_funcs iceland_rlc_funcs = {
5881b843c749SSergey Zigachev .enter_safe_mode = iceland_enter_rlc_safe_mode,
5882b843c749SSergey Zigachev .exit_safe_mode = iceland_exit_rlc_safe_mode
5883b843c749SSergey Zigachev };
5884b843c749SSergey Zigachev
gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device * adev,bool enable)5885b843c749SSergey Zigachev static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
5886b843c749SSergey Zigachev bool enable)
5887b843c749SSergey Zigachev {
5888b843c749SSergey Zigachev uint32_t temp, data;
5889b843c749SSergey Zigachev
5890b843c749SSergey Zigachev adev->gfx.rlc.funcs->enter_safe_mode(adev);
5891b843c749SSergey Zigachev
5892b843c749SSergey Zigachev /* It is disabled by HW by default */
5893b843c749SSergey Zigachev if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
5894b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
5895b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS)
5896b843c749SSergey Zigachev /* 1 - RLC memory Light sleep */
5897b843c749SSergey Zigachev WREG32_FIELD(RLC_MEM_SLP_CNTL, RLC_MEM_LS_EN, 1);
5898b843c749SSergey Zigachev
5899b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS)
5900b843c749SSergey Zigachev WREG32_FIELD(CP_MEM_SLP_CNTL, CP_MEM_LS_EN, 1);
5901b843c749SSergey Zigachev }
5902b843c749SSergey Zigachev
5903b843c749SSergey Zigachev /* 3 - RLC_CGTT_MGCG_OVERRIDE */
5904b843c749SSergey Zigachev temp = data = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
5905b843c749SSergey Zigachev if (adev->flags & AMD_IS_APU)
5906b843c749SSergey Zigachev data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
5907b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
5908b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK);
5909b843c749SSergey Zigachev else
5910b843c749SSergey Zigachev data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
5911b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
5912b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK |
5913b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__GRBM_MASK);
5914b843c749SSergey Zigachev
5915b843c749SSergey Zigachev if (temp != data)
5916b843c749SSergey Zigachev WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data);
5917b843c749SSergey Zigachev
5918b843c749SSergey Zigachev /* 4 - wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
5919b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
5920b843c749SSergey Zigachev
5921b843c749SSergey Zigachev /* 5 - clear mgcg override */
5922b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
5923b843c749SSergey Zigachev
5924b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS) {
5925b843c749SSergey Zigachev /* 6 - Enable CGTS(Tree Shade) MGCG /MGLS */
5926b843c749SSergey Zigachev temp = data = RREG32(mmCGTS_SM_CTRL_REG);
5927b843c749SSergey Zigachev data &= ~(CGTS_SM_CTRL_REG__SM_MODE_MASK);
5928b843c749SSergey Zigachev data |= (0x2 << CGTS_SM_CTRL_REG__SM_MODE__SHIFT);
5929b843c749SSergey Zigachev data |= CGTS_SM_CTRL_REG__SM_MODE_ENABLE_MASK;
5930b843c749SSergey Zigachev data &= ~CGTS_SM_CTRL_REG__OVERRIDE_MASK;
5931b843c749SSergey Zigachev if ((adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) &&
5932b843c749SSergey Zigachev (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS_LS))
5933b843c749SSergey Zigachev data &= ~CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK;
5934b843c749SSergey Zigachev data |= CGTS_SM_CTRL_REG__ON_MONITOR_ADD_EN_MASK;
5935b843c749SSergey Zigachev data |= (0x96 << CGTS_SM_CTRL_REG__ON_MONITOR_ADD__SHIFT);
5936b843c749SSergey Zigachev if (temp != data)
5937b843c749SSergey Zigachev WREG32(mmCGTS_SM_CTRL_REG, data);
5938b843c749SSergey Zigachev }
5939b843c749SSergey Zigachev udelay(50);
5940b843c749SSergey Zigachev
5941b843c749SSergey Zigachev /* 7 - wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
5942b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
5943b843c749SSergey Zigachev } else {
5944b843c749SSergey Zigachev /* 1 - MGCG_OVERRIDE[0] for CP and MGCG_OVERRIDE[1] for RLC */
5945b843c749SSergey Zigachev temp = data = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
5946b843c749SSergey Zigachev data |= (RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
5947b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
5948b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK |
5949b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__GRBM_MASK);
5950b843c749SSergey Zigachev if (temp != data)
5951b843c749SSergey Zigachev WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data);
5952b843c749SSergey Zigachev
5953b843c749SSergey Zigachev /* 2 - disable MGLS in RLC */
5954b843c749SSergey Zigachev data = RREG32(mmRLC_MEM_SLP_CNTL);
5955b843c749SSergey Zigachev if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) {
5956b843c749SSergey Zigachev data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
5957b843c749SSergey Zigachev WREG32(mmRLC_MEM_SLP_CNTL, data);
5958b843c749SSergey Zigachev }
5959b843c749SSergey Zigachev
5960b843c749SSergey Zigachev /* 3 - disable MGLS in CP */
5961b843c749SSergey Zigachev data = RREG32(mmCP_MEM_SLP_CNTL);
5962b843c749SSergey Zigachev if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) {
5963b843c749SSergey Zigachev data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
5964b843c749SSergey Zigachev WREG32(mmCP_MEM_SLP_CNTL, data);
5965b843c749SSergey Zigachev }
5966b843c749SSergey Zigachev
5967b843c749SSergey Zigachev /* 4 - Disable CGTS(Tree Shade) MGCG and MGLS */
5968b843c749SSergey Zigachev temp = data = RREG32(mmCGTS_SM_CTRL_REG);
5969b843c749SSergey Zigachev data |= (CGTS_SM_CTRL_REG__OVERRIDE_MASK |
5970b843c749SSergey Zigachev CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK);
5971b843c749SSergey Zigachev if (temp != data)
5972b843c749SSergey Zigachev WREG32(mmCGTS_SM_CTRL_REG, data);
5973b843c749SSergey Zigachev
5974b843c749SSergey Zigachev /* 5 - wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
5975b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
5976b843c749SSergey Zigachev
5977b843c749SSergey Zigachev /* 6 - set mgcg override */
5978b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, SET_BPM_SERDES_CMD);
5979b843c749SSergey Zigachev
5980b843c749SSergey Zigachev udelay(50);
5981b843c749SSergey Zigachev
5982b843c749SSergey Zigachev /* 7- wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
5983b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
5984b843c749SSergey Zigachev }
5985b843c749SSergey Zigachev
5986b843c749SSergey Zigachev adev->gfx.rlc.funcs->exit_safe_mode(adev);
5987b843c749SSergey Zigachev }
5988b843c749SSergey Zigachev
gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device * adev,bool enable)5989b843c749SSergey Zigachev static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
5990b843c749SSergey Zigachev bool enable)
5991b843c749SSergey Zigachev {
5992b843c749SSergey Zigachev uint32_t temp, temp1, data, data1;
5993b843c749SSergey Zigachev
5994b843c749SSergey Zigachev temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL);
5995b843c749SSergey Zigachev
5996b843c749SSergey Zigachev adev->gfx.rlc.funcs->enter_safe_mode(adev);
5997b843c749SSergey Zigachev
5998b843c749SSergey Zigachev if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
5999b843c749SSergey Zigachev temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
6000b843c749SSergey Zigachev data1 &= ~RLC_CGTT_MGCG_OVERRIDE__CGCG_MASK;
6001b843c749SSergey Zigachev if (temp1 != data1)
6002b843c749SSergey Zigachev WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data1);
6003b843c749SSergey Zigachev
6004b843c749SSergey Zigachev /* : wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
6005b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
6006b843c749SSergey Zigachev
6007b843c749SSergey Zigachev /* 2 - clear cgcg override */
6008b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
6009b843c749SSergey Zigachev
6010b843c749SSergey Zigachev /* wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
6011b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
6012b843c749SSergey Zigachev
6013b843c749SSergey Zigachev /* 3 - write cmd to set CGLS */
6014b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGLS_EN, SET_BPM_SERDES_CMD);
6015b843c749SSergey Zigachev
6016b843c749SSergey Zigachev /* 4 - enable cgcg */
6017b843c749SSergey Zigachev data |= RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;
6018b843c749SSergey Zigachev
6019b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
6020b843c749SSergey Zigachev /* enable cgls*/
6021b843c749SSergey Zigachev data |= RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
6022b843c749SSergey Zigachev
6023b843c749SSergey Zigachev temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
6024b843c749SSergey Zigachev data1 &= ~RLC_CGTT_MGCG_OVERRIDE__CGLS_MASK;
6025b843c749SSergey Zigachev
6026b843c749SSergey Zigachev if (temp1 != data1)
6027b843c749SSergey Zigachev WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data1);
6028b843c749SSergey Zigachev } else {
6029b843c749SSergey Zigachev data &= ~RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
6030b843c749SSergey Zigachev }
6031b843c749SSergey Zigachev
6032b843c749SSergey Zigachev if (temp != data)
6033b843c749SSergey Zigachev WREG32(mmRLC_CGCG_CGLS_CTRL, data);
6034b843c749SSergey Zigachev
6035b843c749SSergey Zigachev /* 5 enable cntx_empty_int_enable/cntx_busy_int_enable/
6036b843c749SSergey Zigachev * Cmp_busy/GFX_Idle interrupts
6037b843c749SSergey Zigachev */
6038b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, true);
6039b843c749SSergey Zigachev } else {
6040b843c749SSergey Zigachev /* disable cntx_empty_int_enable & GFX Idle interrupt */
6041b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, false);
6042b843c749SSergey Zigachev
6043b843c749SSergey Zigachev /* TEST CGCG */
6044b843c749SSergey Zigachev temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
6045b843c749SSergey Zigachev data1 |= (RLC_CGTT_MGCG_OVERRIDE__CGCG_MASK |
6046b843c749SSergey Zigachev RLC_CGTT_MGCG_OVERRIDE__CGLS_MASK);
6047b843c749SSergey Zigachev if (temp1 != data1)
6048b843c749SSergey Zigachev WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data1);
6049b843c749SSergey Zigachev
6050b843c749SSergey Zigachev /* read gfx register to wake up cgcg */
6051b843c749SSergey Zigachev RREG32(mmCB_CGTT_SCLK_CTRL);
6052b843c749SSergey Zigachev RREG32(mmCB_CGTT_SCLK_CTRL);
6053b843c749SSergey Zigachev RREG32(mmCB_CGTT_SCLK_CTRL);
6054b843c749SSergey Zigachev RREG32(mmCB_CGTT_SCLK_CTRL);
6055b843c749SSergey Zigachev
6056b843c749SSergey Zigachev /* wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
6057b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
6058b843c749SSergey Zigachev
6059b843c749SSergey Zigachev /* write cmd to Set CGCG Overrride */
6060b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, SET_BPM_SERDES_CMD);
6061b843c749SSergey Zigachev
6062b843c749SSergey Zigachev /* wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
6063b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
6064b843c749SSergey Zigachev
6065b843c749SSergey Zigachev /* write cmd to Clear CGLS */
6066b843c749SSergey Zigachev gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGLS_EN, CLE_BPM_SERDES_CMD);
6067b843c749SSergey Zigachev
6068b843c749SSergey Zigachev /* disable cgcg, cgls should be disabled too. */
6069b843c749SSergey Zigachev data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK |
6070b843c749SSergey Zigachev RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
6071b843c749SSergey Zigachev if (temp != data)
6072b843c749SSergey Zigachev WREG32(mmRLC_CGCG_CGLS_CTRL, data);
6073b843c749SSergey Zigachev /* enable interrupts again for PG */
6074b843c749SSergey Zigachev gfx_v8_0_enable_gui_idle_interrupt(adev, true);
6075b843c749SSergey Zigachev }
6076b843c749SSergey Zigachev
6077b843c749SSergey Zigachev gfx_v8_0_wait_for_rlc_serdes(adev);
6078b843c749SSergey Zigachev
6079b843c749SSergey Zigachev adev->gfx.rlc.funcs->exit_safe_mode(adev);
6080b843c749SSergey Zigachev }
gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device * adev,bool enable)6081b843c749SSergey Zigachev static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
6082b843c749SSergey Zigachev bool enable)
6083b843c749SSergey Zigachev {
6084b843c749SSergey Zigachev if (enable) {
6085b843c749SSergey Zigachev /* CGCG/CGLS should be enabled after MGCG/MGLS/TS(CG/LS)
6086b843c749SSergey Zigachev * === MGCG + MGLS + TS(CG/LS) ===
6087b843c749SSergey Zigachev */
6088b843c749SSergey Zigachev gfx_v8_0_update_medium_grain_clock_gating(adev, enable);
6089b843c749SSergey Zigachev gfx_v8_0_update_coarse_grain_clock_gating(adev, enable);
6090b843c749SSergey Zigachev } else {
6091b843c749SSergey Zigachev /* CGCG/CGLS should be disabled before MGCG/MGLS/TS(CG/LS)
6092b843c749SSergey Zigachev * === CGCG + CGLS ===
6093b843c749SSergey Zigachev */
6094b843c749SSergey Zigachev gfx_v8_0_update_coarse_grain_clock_gating(adev, enable);
6095b843c749SSergey Zigachev gfx_v8_0_update_medium_grain_clock_gating(adev, enable);
6096b843c749SSergey Zigachev }
6097b843c749SSergey Zigachev return 0;
6098b843c749SSergey Zigachev }
6099b843c749SSergey Zigachev
gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device * adev,enum amd_clockgating_state state)6100b843c749SSergey Zigachev static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev,
6101b843c749SSergey Zigachev enum amd_clockgating_state state)
6102b843c749SSergey Zigachev {
6103b843c749SSergey Zigachev uint32_t msg_id, pp_state = 0;
6104b843c749SSergey Zigachev uint32_t pp_support_state = 0;
6105b843c749SSergey Zigachev
6106b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS)) {
6107b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
6108b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6109b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6110b843c749SSergey Zigachev }
6111b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG) {
6112b843c749SSergey Zigachev pp_support_state |= PP_STATE_SUPPORT_CG;
6113b843c749SSergey Zigachev pp_state |= PP_STATE_CG;
6114b843c749SSergey Zigachev }
6115b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6116b843c749SSergey Zigachev pp_state = 0;
6117b843c749SSergey Zigachev
6118b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6119b843c749SSergey Zigachev PP_BLOCK_GFX_CG,
6120b843c749SSergey Zigachev pp_support_state,
6121b843c749SSergey Zigachev pp_state);
6122b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6123b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6124b843c749SSergey Zigachev }
6125b843c749SSergey Zigachev
6126b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) {
6127b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
6128b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6129b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6130b843c749SSergey Zigachev }
6131b843c749SSergey Zigachev
6132b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG) {
6133b843c749SSergey Zigachev pp_support_state |= PP_STATE_SUPPORT_CG;
6134b843c749SSergey Zigachev pp_state |= PP_STATE_CG;
6135b843c749SSergey Zigachev }
6136b843c749SSergey Zigachev
6137b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6138b843c749SSergey Zigachev pp_state = 0;
6139b843c749SSergey Zigachev
6140b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6141b843c749SSergey Zigachev PP_BLOCK_GFX_MG,
6142b843c749SSergey Zigachev pp_support_state,
6143b843c749SSergey Zigachev pp_state);
6144b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6145b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6146b843c749SSergey Zigachev }
6147b843c749SSergey Zigachev
6148b843c749SSergey Zigachev return 0;
6149b843c749SSergey Zigachev }
6150b843c749SSergey Zigachev
gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device * adev,enum amd_clockgating_state state)6151b843c749SSergey Zigachev static int gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device *adev,
6152b843c749SSergey Zigachev enum amd_clockgating_state state)
6153b843c749SSergey Zigachev {
6154b843c749SSergey Zigachev
6155b843c749SSergey Zigachev uint32_t msg_id, pp_state = 0;
6156b843c749SSergey Zigachev uint32_t pp_support_state = 0;
6157b843c749SSergey Zigachev
6158b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS)) {
6159b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
6160b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6161b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6162b843c749SSergey Zigachev }
6163b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG) {
6164b843c749SSergey Zigachev pp_support_state |= PP_STATE_SUPPORT_CG;
6165b843c749SSergey Zigachev pp_state |= PP_STATE_CG;
6166b843c749SSergey Zigachev }
6167b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6168b843c749SSergey Zigachev pp_state = 0;
6169b843c749SSergey Zigachev
6170b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6171b843c749SSergey Zigachev PP_BLOCK_GFX_CG,
6172b843c749SSergey Zigachev pp_support_state,
6173b843c749SSergey Zigachev pp_state);
6174b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6175b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6176b843c749SSergey Zigachev }
6177b843c749SSergey Zigachev
6178b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_3D_CGCG | AMD_CG_SUPPORT_GFX_3D_CGLS)) {
6179b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS) {
6180b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6181b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6182b843c749SSergey Zigachev }
6183b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG) {
6184b843c749SSergey Zigachev pp_support_state |= PP_STATE_SUPPORT_CG;
6185b843c749SSergey Zigachev pp_state |= PP_STATE_CG;
6186b843c749SSergey Zigachev }
6187b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6188b843c749SSergey Zigachev pp_state = 0;
6189b843c749SSergey Zigachev
6190b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6191b843c749SSergey Zigachev PP_BLOCK_GFX_3D,
6192b843c749SSergey Zigachev pp_support_state,
6193b843c749SSergey Zigachev pp_state);
6194b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6195b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6196b843c749SSergey Zigachev }
6197b843c749SSergey Zigachev
6198b843c749SSergey Zigachev if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) {
6199b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
6200b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6201b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6202b843c749SSergey Zigachev }
6203b843c749SSergey Zigachev
6204b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG) {
6205b843c749SSergey Zigachev pp_support_state |= PP_STATE_SUPPORT_CG;
6206b843c749SSergey Zigachev pp_state |= PP_STATE_CG;
6207b843c749SSergey Zigachev }
6208b843c749SSergey Zigachev
6209b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6210b843c749SSergey Zigachev pp_state = 0;
6211b843c749SSergey Zigachev
6212b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6213b843c749SSergey Zigachev PP_BLOCK_GFX_MG,
6214b843c749SSergey Zigachev pp_support_state,
6215b843c749SSergey Zigachev pp_state);
6216b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6217b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6218b843c749SSergey Zigachev }
6219b843c749SSergey Zigachev
6220b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {
6221b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6222b843c749SSergey Zigachev
6223b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6224b843c749SSergey Zigachev pp_state = 0;
6225b843c749SSergey Zigachev else
6226b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6227b843c749SSergey Zigachev
6228b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6229b843c749SSergey Zigachev PP_BLOCK_GFX_RLC,
6230b843c749SSergey Zigachev pp_support_state,
6231b843c749SSergey Zigachev pp_state);
6232b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6233b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6234b843c749SSergey Zigachev }
6235b843c749SSergey Zigachev
6236b843c749SSergey Zigachev if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
6237b843c749SSergey Zigachev pp_support_state = PP_STATE_SUPPORT_LS;
6238b843c749SSergey Zigachev
6239b843c749SSergey Zigachev if (state == AMD_CG_STATE_UNGATE)
6240b843c749SSergey Zigachev pp_state = 0;
6241b843c749SSergey Zigachev else
6242b843c749SSergey Zigachev pp_state = PP_STATE_LS;
6243b843c749SSergey Zigachev msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6244b843c749SSergey Zigachev PP_BLOCK_GFX_CP,
6245b843c749SSergey Zigachev pp_support_state,
6246b843c749SSergey Zigachev pp_state);
6247b843c749SSergey Zigachev if (adev->powerplay.pp_funcs->set_clockgating_by_smu)
6248b843c749SSergey Zigachev amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
6249b843c749SSergey Zigachev }
6250b843c749SSergey Zigachev
6251b843c749SSergey Zigachev return 0;
6252b843c749SSergey Zigachev }
6253b843c749SSergey Zigachev
gfx_v8_0_set_clockgating_state(void * handle,enum amd_clockgating_state state)6254b843c749SSergey Zigachev static int gfx_v8_0_set_clockgating_state(void *handle,
6255b843c749SSergey Zigachev enum amd_clockgating_state state)
6256b843c749SSergey Zigachev {
6257b843c749SSergey Zigachev struct amdgpu_device *adev = (struct amdgpu_device *)handle;
6258b843c749SSergey Zigachev
6259b843c749SSergey Zigachev if (amdgpu_sriov_vf(adev))
6260b843c749SSergey Zigachev return 0;
6261b843c749SSergey Zigachev
6262b843c749SSergey Zigachev switch (adev->asic_type) {
6263b843c749SSergey Zigachev case CHIP_FIJI:
6264b843c749SSergey Zigachev case CHIP_CARRIZO:
6265b843c749SSergey Zigachev case CHIP_STONEY:
6266b843c749SSergey Zigachev gfx_v8_0_update_gfx_clock_gating(adev,
6267b843c749SSergey Zigachev state == AMD_CG_STATE_GATE);
6268b843c749SSergey Zigachev break;
6269b843c749SSergey Zigachev case CHIP_TONGA:
6270b843c749SSergey Zigachev gfx_v8_0_tonga_update_gfx_clock_gating(adev, state);
6271b843c749SSergey Zigachev break;
6272b843c749SSergey Zigachev case CHIP_POLARIS10:
6273b843c749SSergey Zigachev case CHIP_POLARIS11:
6274b843c749SSergey Zigachev case CHIP_POLARIS12:
6275b843c749SSergey Zigachev case CHIP_VEGAM:
6276b843c749SSergey Zigachev gfx_v8_0_polaris_update_gfx_clock_gating(adev, state);
6277b843c749SSergey Zigachev break;
6278b843c749SSergey Zigachev default:
6279b843c749SSergey Zigachev break;
6280b843c749SSergey Zigachev }
6281b843c749SSergey Zigachev return 0;
6282b843c749SSergey Zigachev }
6283b843c749SSergey Zigachev
gfx_v8_0_ring_get_rptr(struct amdgpu_ring * ring)628478973132SSergey Zigachev static uint64_t gfx_v8_0_ring_get_rptr(struct amdgpu_ring *ring)
6285b843c749SSergey Zigachev {
6286b843c749SSergey Zigachev return ring->adev->wb.wb[ring->rptr_offs];
6287b843c749SSergey Zigachev }
6288b843c749SSergey Zigachev
gfx_v8_0_ring_get_wptr_gfx(struct amdgpu_ring * ring)628978973132SSergey Zigachev static uint64_t gfx_v8_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)
6290b843c749SSergey Zigachev {
6291b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6292b843c749SSergey Zigachev
6293b843c749SSergey Zigachev if (ring->use_doorbell)
6294b843c749SSergey Zigachev /* XXX check if swapping is necessary on BE */
6295b843c749SSergey Zigachev return ring->adev->wb.wb[ring->wptr_offs];
6296b843c749SSergey Zigachev else
6297b843c749SSergey Zigachev return RREG32(mmCP_RB0_WPTR);
6298b843c749SSergey Zigachev }
6299b843c749SSergey Zigachev
gfx_v8_0_ring_set_wptr_gfx(struct amdgpu_ring * ring)6300b843c749SSergey Zigachev static void gfx_v8_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
6301b843c749SSergey Zigachev {
6302b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6303b843c749SSergey Zigachev
6304b843c749SSergey Zigachev if (ring->use_doorbell) {
6305b843c749SSergey Zigachev /* XXX check if swapping is necessary on BE */
6306b843c749SSergey Zigachev adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
6307b843c749SSergey Zigachev WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
6308b843c749SSergey Zigachev } else {
6309b843c749SSergey Zigachev WREG32(mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
6310b843c749SSergey Zigachev (void)RREG32(mmCP_RB0_WPTR);
6311b843c749SSergey Zigachev }
6312b843c749SSergey Zigachev }
6313b843c749SSergey Zigachev
gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring * ring)6314b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
6315b843c749SSergey Zigachev {
6316b843c749SSergey Zigachev u32 ref_and_mask, reg_mem_engine;
6317b843c749SSergey Zigachev
6318b843c749SSergey Zigachev if ((ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) ||
6319b843c749SSergey Zigachev (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)) {
6320b843c749SSergey Zigachev switch (ring->me) {
6321b843c749SSergey Zigachev case 1:
6322b843c749SSergey Zigachev ref_and_mask = GPU_HDP_FLUSH_DONE__CP2_MASK << ring->pipe;
6323b843c749SSergey Zigachev break;
6324b843c749SSergey Zigachev case 2:
6325b843c749SSergey Zigachev ref_and_mask = GPU_HDP_FLUSH_DONE__CP6_MASK << ring->pipe;
6326b843c749SSergey Zigachev break;
6327b843c749SSergey Zigachev default:
6328b843c749SSergey Zigachev return;
6329b843c749SSergey Zigachev }
6330b843c749SSergey Zigachev reg_mem_engine = 0;
6331b843c749SSergey Zigachev } else {
6332b843c749SSergey Zigachev ref_and_mask = GPU_HDP_FLUSH_DONE__CP0_MASK;
6333b843c749SSergey Zigachev reg_mem_engine = WAIT_REG_MEM_ENGINE(1); /* pfp */
6334b843c749SSergey Zigachev }
6335b843c749SSergey Zigachev
6336b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
6337b843c749SSergey Zigachev amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
6338b843c749SSergey Zigachev WAIT_REG_MEM_FUNCTION(3) | /* == */
6339b843c749SSergey Zigachev reg_mem_engine));
6340b843c749SSergey Zigachev amdgpu_ring_write(ring, mmGPU_HDP_FLUSH_REQ);
6341b843c749SSergey Zigachev amdgpu_ring_write(ring, mmGPU_HDP_FLUSH_DONE);
6342b843c749SSergey Zigachev amdgpu_ring_write(ring, ref_and_mask);
6343b843c749SSergey Zigachev amdgpu_ring_write(ring, ref_and_mask);
6344b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x20); /* poll interval */
6345b843c749SSergey Zigachev }
6346b843c749SSergey Zigachev
gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring * ring)6347b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring)
6348b843c749SSergey Zigachev {
6349b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0));
6350b843c749SSergey Zigachev amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) |
6351b843c749SSergey Zigachev EVENT_INDEX(4));
6352b843c749SSergey Zigachev
6353b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0));
6354b843c749SSergey Zigachev amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) |
6355b843c749SSergey Zigachev EVENT_INDEX(0));
6356b843c749SSergey Zigachev }
6357b843c749SSergey Zigachev
gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring * ring,struct amdgpu_ib * ib,unsigned vmid,bool ctx_switch)6358b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
6359b843c749SSergey Zigachev struct amdgpu_ib *ib,
6360b843c749SSergey Zigachev unsigned vmid, bool ctx_switch)
6361b843c749SSergey Zigachev {
6362b843c749SSergey Zigachev u32 header, control = 0;
6363b843c749SSergey Zigachev
6364b843c749SSergey Zigachev if (ib->flags & AMDGPU_IB_FLAG_CE)
6365b843c749SSergey Zigachev header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
6366b843c749SSergey Zigachev else
6367b843c749SSergey Zigachev header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
6368b843c749SSergey Zigachev
6369b843c749SSergey Zigachev control |= ib->length_dw | (vmid << 24);
6370b843c749SSergey Zigachev
6371b843c749SSergey Zigachev if (amdgpu_sriov_vf(ring->adev) && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) {
6372b843c749SSergey Zigachev control |= INDIRECT_BUFFER_PRE_ENB(1);
6373b843c749SSergey Zigachev
6374b843c749SSergey Zigachev if (!(ib->flags & AMDGPU_IB_FLAG_CE))
6375b843c749SSergey Zigachev gfx_v8_0_ring_emit_de_meta(ring);
6376b843c749SSergey Zigachev }
6377b843c749SSergey Zigachev
6378b843c749SSergey Zigachev amdgpu_ring_write(ring, header);
6379b843c749SSergey Zigachev amdgpu_ring_write(ring,
6380b843c749SSergey Zigachev #ifdef __BIG_ENDIAN
6381b843c749SSergey Zigachev (2 << 0) |
6382b843c749SSergey Zigachev #endif
6383b843c749SSergey Zigachev (ib->gpu_addr & 0xFFFFFFFC));
6384b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
6385b843c749SSergey Zigachev amdgpu_ring_write(ring, control);
6386b843c749SSergey Zigachev }
6387b843c749SSergey Zigachev
gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring * ring,struct amdgpu_ib * ib,unsigned vmid,bool ctx_switch)6388b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
6389b843c749SSergey Zigachev struct amdgpu_ib *ib,
6390b843c749SSergey Zigachev unsigned vmid, bool ctx_switch)
6391b843c749SSergey Zigachev {
6392b843c749SSergey Zigachev u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
6393b843c749SSergey Zigachev
6394b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
6395b843c749SSergey Zigachev amdgpu_ring_write(ring,
6396b843c749SSergey Zigachev #ifdef __BIG_ENDIAN
6397b843c749SSergey Zigachev (2 << 0) |
6398b843c749SSergey Zigachev #endif
6399b843c749SSergey Zigachev (ib->gpu_addr & 0xFFFFFFFC));
6400b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
6401b843c749SSergey Zigachev amdgpu_ring_write(ring, control);
6402b843c749SSergey Zigachev }
6403b843c749SSergey Zigachev
gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring * ring,uint64_t addr,uint64_t seq,unsigned flags)640478973132SSergey Zigachev static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, uint64_t addr,
640578973132SSergey Zigachev uint64_t seq, unsigned flags)
6406b843c749SSergey Zigachev {
6407b843c749SSergey Zigachev bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
6408b843c749SSergey Zigachev bool int_sel = flags & AMDGPU_FENCE_FLAG_INT;
6409b843c749SSergey Zigachev
6410b843c749SSergey Zigachev /* Workaround for cache flush problems. First send a dummy EOP
6411b843c749SSergey Zigachev * event down the pipe with seq one below.
6412b843c749SSergey Zigachev */
6413b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
6414b843c749SSergey Zigachev amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN |
6415b843c749SSergey Zigachev EOP_TC_ACTION_EN |
6416b843c749SSergey Zigachev EOP_TC_WB_ACTION_EN |
6417b843c749SSergey Zigachev EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
6418b843c749SSergey Zigachev EVENT_INDEX(5)));
6419b843c749SSergey Zigachev amdgpu_ring_write(ring, addr & 0xfffffffc);
6420b843c749SSergey Zigachev amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) |
6421b843c749SSergey Zigachev DATA_SEL(1) | INT_SEL(0));
6422b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(seq - 1));
6423b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(seq - 1));
6424b843c749SSergey Zigachev
6425b843c749SSergey Zigachev /* Then send the real EOP event down the pipe:
6426b843c749SSergey Zigachev * EVENT_WRITE_EOP - flush caches, send int */
6427b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
6428b843c749SSergey Zigachev amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN |
6429b843c749SSergey Zigachev EOP_TC_ACTION_EN |
6430b843c749SSergey Zigachev EOP_TC_WB_ACTION_EN |
6431b843c749SSergey Zigachev EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
6432b843c749SSergey Zigachev EVENT_INDEX(5)));
6433b843c749SSergey Zigachev amdgpu_ring_write(ring, addr & 0xfffffffc);
6434b843c749SSergey Zigachev amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) |
6435b843c749SSergey Zigachev DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));
6436b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(seq));
6437b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(seq));
6438b843c749SSergey Zigachev
6439b843c749SSergey Zigachev }
6440b843c749SSergey Zigachev
gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring * ring)6441b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
6442b843c749SSergey Zigachev {
6443b843c749SSergey Zigachev int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
6444b843c749SSergey Zigachev uint32_t seq = ring->fence_drv.sync_seq;
6445b843c749SSergey Zigachev uint64_t addr = ring->fence_drv.gpu_addr;
6446b843c749SSergey Zigachev
6447b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
6448b843c749SSergey Zigachev amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
6449b843c749SSergey Zigachev WAIT_REG_MEM_FUNCTION(3) | /* equal */
6450b843c749SSergey Zigachev WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
6451b843c749SSergey Zigachev amdgpu_ring_write(ring, addr & 0xfffffffc);
6452b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
6453b843c749SSergey Zigachev amdgpu_ring_write(ring, seq);
6454b843c749SSergey Zigachev amdgpu_ring_write(ring, 0xffffffff);
6455b843c749SSergey Zigachev amdgpu_ring_write(ring, 4); /* poll interval */
6456b843c749SSergey Zigachev }
6457b843c749SSergey Zigachev
gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring * ring,unsigned vmid,uint64_t pd_addr)6458b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
6459b843c749SSergey Zigachev unsigned vmid, uint64_t pd_addr)
6460b843c749SSergey Zigachev {
6461b843c749SSergey Zigachev int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
6462b843c749SSergey Zigachev
6463b843c749SSergey Zigachev amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
6464b843c749SSergey Zigachev
6465b843c749SSergey Zigachev /* wait for the invalidate to complete */
6466b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
6467b843c749SSergey Zigachev amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */
6468b843c749SSergey Zigachev WAIT_REG_MEM_FUNCTION(0) | /* always */
6469b843c749SSergey Zigachev WAIT_REG_MEM_ENGINE(0))); /* me */
6470b843c749SSergey Zigachev amdgpu_ring_write(ring, mmVM_INVALIDATE_REQUEST);
6471b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6472b843c749SSergey Zigachev amdgpu_ring_write(ring, 0); /* ref */
6473b843c749SSergey Zigachev amdgpu_ring_write(ring, 0); /* mask */
6474b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x20); /* poll interval */
6475b843c749SSergey Zigachev
6476b843c749SSergey Zigachev /* compute doesn't have PFP */
6477b843c749SSergey Zigachev if (usepfp) {
6478b843c749SSergey Zigachev /* sync PFP to ME, otherwise we might get invalid PFP reads */
6479b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6480b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x0);
6481b843c749SSergey Zigachev }
6482b843c749SSergey Zigachev }
6483b843c749SSergey Zigachev
gfx_v8_0_ring_get_wptr_compute(struct amdgpu_ring * ring)648478973132SSergey Zigachev static uint64_t gfx_v8_0_ring_get_wptr_compute(struct amdgpu_ring *ring)
6485b843c749SSergey Zigachev {
6486b843c749SSergey Zigachev return ring->adev->wb.wb[ring->wptr_offs];
6487b843c749SSergey Zigachev }
6488b843c749SSergey Zigachev
gfx_v8_0_ring_set_wptr_compute(struct amdgpu_ring * ring)6489b843c749SSergey Zigachev static void gfx_v8_0_ring_set_wptr_compute(struct amdgpu_ring *ring)
6490b843c749SSergey Zigachev {
6491b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6492b843c749SSergey Zigachev
6493b843c749SSergey Zigachev /* XXX check if swapping is necessary on BE */
6494b843c749SSergey Zigachev adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
6495b843c749SSergey Zigachev WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
6496b843c749SSergey Zigachev }
6497b843c749SSergey Zigachev
gfx_v8_0_ring_set_pipe_percent(struct amdgpu_ring * ring,bool acquire)6498b843c749SSergey Zigachev static void gfx_v8_0_ring_set_pipe_percent(struct amdgpu_ring *ring,
6499b843c749SSergey Zigachev bool acquire)
6500b843c749SSergey Zigachev {
6501b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6502b843c749SSergey Zigachev int pipe_num, tmp, reg;
6503b843c749SSergey Zigachev int pipe_percent = acquire ? SPI_WCL_PIPE_PERCENT_GFX__VALUE_MASK : 0x1;
6504b843c749SSergey Zigachev
6505b843c749SSergey Zigachev pipe_num = ring->me * adev->gfx.mec.num_pipe_per_mec + ring->pipe;
6506b843c749SSergey Zigachev
6507b843c749SSergey Zigachev /* first me only has 2 entries, GFX and HP3D */
6508b843c749SSergey Zigachev if (ring->me > 0)
6509b843c749SSergey Zigachev pipe_num -= 2;
6510b843c749SSergey Zigachev
6511b843c749SSergey Zigachev reg = mmSPI_WCL_PIPE_PERCENT_GFX + pipe_num;
6512b843c749SSergey Zigachev tmp = RREG32(reg);
6513b843c749SSergey Zigachev tmp = REG_SET_FIELD(tmp, SPI_WCL_PIPE_PERCENT_GFX, VALUE, pipe_percent);
6514b843c749SSergey Zigachev WREG32(reg, tmp);
6515b843c749SSergey Zigachev }
6516b843c749SSergey Zigachev
gfx_v8_0_pipe_reserve_resources(struct amdgpu_device * adev,struct amdgpu_ring * ring,bool acquire)6517b843c749SSergey Zigachev static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev,
6518b843c749SSergey Zigachev struct amdgpu_ring *ring,
6519b843c749SSergey Zigachev bool acquire)
6520b843c749SSergey Zigachev {
6521b843c749SSergey Zigachev int i, pipe;
6522b843c749SSergey Zigachev bool reserve;
6523b843c749SSergey Zigachev struct amdgpu_ring *iring;
6524b843c749SSergey Zigachev
6525b843c749SSergey Zigachev mutex_lock(&adev->gfx.pipe_reserve_mutex);
6526b843c749SSergey Zigachev pipe = amdgpu_gfx_queue_to_bit(adev, ring->me, ring->pipe, 0);
6527b843c749SSergey Zigachev if (acquire)
6528b843c749SSergey Zigachev set_bit(pipe, adev->gfx.pipe_reserve_bitmap);
6529b843c749SSergey Zigachev else
6530b843c749SSergey Zigachev clear_bit(pipe, adev->gfx.pipe_reserve_bitmap);
6531b843c749SSergey Zigachev
6532b843c749SSergey Zigachev if (!bitmap_weight(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES)) {
6533b843c749SSergey Zigachev /* Clear all reservations - everyone reacquires all resources */
6534b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; ++i)
6535b843c749SSergey Zigachev gfx_v8_0_ring_set_pipe_percent(&adev->gfx.gfx_ring[i],
6536b843c749SSergey Zigachev true);
6537b843c749SSergey Zigachev
6538b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; ++i)
6539b843c749SSergey Zigachev gfx_v8_0_ring_set_pipe_percent(&adev->gfx.compute_ring[i],
6540b843c749SSergey Zigachev true);
6541b843c749SSergey Zigachev } else {
6542b843c749SSergey Zigachev /* Lower all pipes without a current reservation */
6543b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; ++i) {
6544b843c749SSergey Zigachev iring = &adev->gfx.gfx_ring[i];
6545b843c749SSergey Zigachev pipe = amdgpu_gfx_queue_to_bit(adev,
6546b843c749SSergey Zigachev iring->me,
6547b843c749SSergey Zigachev iring->pipe,
6548b843c749SSergey Zigachev 0);
6549b843c749SSergey Zigachev reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
6550b843c749SSergey Zigachev gfx_v8_0_ring_set_pipe_percent(iring, reserve);
6551b843c749SSergey Zigachev }
6552b843c749SSergey Zigachev
6553b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; ++i) {
6554b843c749SSergey Zigachev iring = &adev->gfx.compute_ring[i];
6555b843c749SSergey Zigachev pipe = amdgpu_gfx_queue_to_bit(adev,
6556b843c749SSergey Zigachev iring->me,
6557b843c749SSergey Zigachev iring->pipe,
6558b843c749SSergey Zigachev 0);
6559b843c749SSergey Zigachev reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
6560b843c749SSergey Zigachev gfx_v8_0_ring_set_pipe_percent(iring, reserve);
6561b843c749SSergey Zigachev }
6562b843c749SSergey Zigachev }
6563b843c749SSergey Zigachev
6564b843c749SSergey Zigachev mutex_unlock(&adev->gfx.pipe_reserve_mutex);
6565b843c749SSergey Zigachev }
6566b843c749SSergey Zigachev
gfx_v8_0_hqd_set_priority(struct amdgpu_device * adev,struct amdgpu_ring * ring,bool acquire)6567b843c749SSergey Zigachev static void gfx_v8_0_hqd_set_priority(struct amdgpu_device *adev,
6568b843c749SSergey Zigachev struct amdgpu_ring *ring,
6569b843c749SSergey Zigachev bool acquire)
6570b843c749SSergey Zigachev {
6571b843c749SSergey Zigachev uint32_t pipe_priority = acquire ? 0x2 : 0x0;
6572b843c749SSergey Zigachev uint32_t queue_priority = acquire ? 0xf : 0x0;
6573b843c749SSergey Zigachev
6574b843c749SSergey Zigachev mutex_lock(&adev->srbm_mutex);
6575b843c749SSergey Zigachev vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
6576b843c749SSergey Zigachev
6577b843c749SSergey Zigachev WREG32(mmCP_HQD_PIPE_PRIORITY, pipe_priority);
6578b843c749SSergey Zigachev WREG32(mmCP_HQD_QUEUE_PRIORITY, queue_priority);
6579b843c749SSergey Zigachev
6580b843c749SSergey Zigachev vi_srbm_select(adev, 0, 0, 0, 0);
6581b843c749SSergey Zigachev mutex_unlock(&adev->srbm_mutex);
6582b843c749SSergey Zigachev }
gfx_v8_0_ring_set_priority_compute(struct amdgpu_ring * ring,enum drm_sched_priority priority)6583b843c749SSergey Zigachev static void gfx_v8_0_ring_set_priority_compute(struct amdgpu_ring *ring,
6584b843c749SSergey Zigachev enum drm_sched_priority priority)
6585b843c749SSergey Zigachev {
6586b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6587b843c749SSergey Zigachev bool acquire = priority == DRM_SCHED_PRIORITY_HIGH_HW;
6588b843c749SSergey Zigachev
6589b843c749SSergey Zigachev if (ring->funcs->type != AMDGPU_RING_TYPE_COMPUTE)
6590b843c749SSergey Zigachev return;
6591b843c749SSergey Zigachev
6592b843c749SSergey Zigachev gfx_v8_0_hqd_set_priority(adev, ring, acquire);
6593b843c749SSergey Zigachev gfx_v8_0_pipe_reserve_resources(adev, ring, acquire);
6594b843c749SSergey Zigachev }
6595b843c749SSergey Zigachev
gfx_v8_0_ring_emit_fence_compute(struct amdgpu_ring * ring,uint64_t addr,uint64_t seq,unsigned flags)6596b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
659778973132SSergey Zigachev uint64_t addr, uint64_t seq,
6598b843c749SSergey Zigachev unsigned flags)
6599b843c749SSergey Zigachev {
6600b843c749SSergey Zigachev bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
6601b843c749SSergey Zigachev bool int_sel = flags & AMDGPU_FENCE_FLAG_INT;
6602b843c749SSergey Zigachev
6603b843c749SSergey Zigachev /* RELEASE_MEM - flush caches, send int */
6604b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
6605b843c749SSergey Zigachev amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN |
6606b843c749SSergey Zigachev EOP_TC_ACTION_EN |
6607b843c749SSergey Zigachev EOP_TC_WB_ACTION_EN |
6608b843c749SSergey Zigachev EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
6609b843c749SSergey Zigachev EVENT_INDEX(5)));
6610b843c749SSergey Zigachev amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));
6611b843c749SSergey Zigachev amdgpu_ring_write(ring, addr & 0xfffffffc);
6612b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(addr));
6613b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(seq));
6614b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(seq));
6615b843c749SSergey Zigachev }
6616b843c749SSergey Zigachev
gfx_v8_0_ring_emit_fence_kiq(struct amdgpu_ring * ring,uint64_t addr,uint64_t seq,unsigned int flags)661778973132SSergey Zigachev static void gfx_v8_0_ring_emit_fence_kiq(struct amdgpu_ring *ring, uint64_t addr,
661878973132SSergey Zigachev uint64_t seq, unsigned int flags)
6619b843c749SSergey Zigachev {
6620b843c749SSergey Zigachev /* we only allocate 32bit for each seq wb address */
6621b843c749SSergey Zigachev BUG_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
6622b843c749SSergey Zigachev
6623b843c749SSergey Zigachev /* write fence seq to the "addr" */
6624b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6625b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
6626b843c749SSergey Zigachev WRITE_DATA_DST_SEL(5) | WR_CONFIRM));
6627b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(addr));
6628b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(addr));
6629b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(seq));
6630b843c749SSergey Zigachev
6631b843c749SSergey Zigachev if (flags & AMDGPU_FENCE_FLAG_INT) {
6632b843c749SSergey Zigachev /* set register to trigger INT */
6633b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6634b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
6635b843c749SSergey Zigachev WRITE_DATA_DST_SEL(0) | WR_CONFIRM));
6636b843c749SSergey Zigachev amdgpu_ring_write(ring, mmCPC_INT_STATUS);
6637b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6638b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x20000000); /* src_id is 178 */
6639b843c749SSergey Zigachev }
6640b843c749SSergey Zigachev }
6641b843c749SSergey Zigachev
gfx_v8_ring_emit_sb(struct amdgpu_ring * ring)6642b843c749SSergey Zigachev static void gfx_v8_ring_emit_sb(struct amdgpu_ring *ring)
6643b843c749SSergey Zigachev {
6644b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
6645b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6646b843c749SSergey Zigachev }
6647b843c749SSergey Zigachev
gfx_v8_ring_emit_cntxcntl(struct amdgpu_ring * ring,uint32_t flags)6648b843c749SSergey Zigachev static void gfx_v8_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)
6649b843c749SSergey Zigachev {
6650b843c749SSergey Zigachev uint32_t dw2 = 0;
6651b843c749SSergey Zigachev
6652b843c749SSergey Zigachev if (amdgpu_sriov_vf(ring->adev))
6653b843c749SSergey Zigachev gfx_v8_0_ring_emit_ce_meta(ring);
6654b843c749SSergey Zigachev
6655b843c749SSergey Zigachev dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */
6656b843c749SSergey Zigachev if (flags & AMDGPU_HAVE_CTX_SWITCH) {
6657b843c749SSergey Zigachev gfx_v8_0_ring_emit_vgt_flush(ring);
6658b843c749SSergey Zigachev /* set load_global_config & load_global_uconfig */
6659b843c749SSergey Zigachev dw2 |= 0x8001;
6660b843c749SSergey Zigachev /* set load_cs_sh_regs */
6661b843c749SSergey Zigachev dw2 |= 0x01000000;
6662b843c749SSergey Zigachev /* set load_per_context_state & load_gfx_sh_regs for GFX */
6663b843c749SSergey Zigachev dw2 |= 0x10002;
6664b843c749SSergey Zigachev
6665b843c749SSergey Zigachev /* set load_ce_ram if preamble presented */
6666b843c749SSergey Zigachev if (AMDGPU_PREAMBLE_IB_PRESENT & flags)
6667b843c749SSergey Zigachev dw2 |= 0x10000000;
6668b843c749SSergey Zigachev } else {
6669b843c749SSergey Zigachev /* still load_ce_ram if this is the first time preamble presented
6670b843c749SSergey Zigachev * although there is no context switch happens.
6671b843c749SSergey Zigachev */
6672b843c749SSergey Zigachev if (AMDGPU_PREAMBLE_IB_PRESENT_FIRST & flags)
6673b843c749SSergey Zigachev dw2 |= 0x10000000;
6674b843c749SSergey Zigachev }
6675b843c749SSergey Zigachev
6676b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
6677b843c749SSergey Zigachev amdgpu_ring_write(ring, dw2);
6678b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6679b843c749SSergey Zigachev }
6680b843c749SSergey Zigachev
gfx_v8_0_ring_emit_init_cond_exec(struct amdgpu_ring * ring)6681b843c749SSergey Zigachev static unsigned gfx_v8_0_ring_emit_init_cond_exec(struct amdgpu_ring *ring)
6682b843c749SSergey Zigachev {
6683b843c749SSergey Zigachev unsigned ret;
6684b843c749SSergey Zigachev
6685b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_COND_EXEC, 3));
6686b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(ring->cond_exe_gpu_addr));
6687b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(ring->cond_exe_gpu_addr));
6688b843c749SSergey Zigachev amdgpu_ring_write(ring, 0); /* discard following DWs if *cond_exec_gpu_addr==0 */
6689b843c749SSergey Zigachev ret = ring->wptr & ring->buf_mask;
6690b843c749SSergey Zigachev amdgpu_ring_write(ring, 0x55aa55aa); /* patch dummy value later */
6691b843c749SSergey Zigachev return ret;
6692b843c749SSergey Zigachev }
6693b843c749SSergey Zigachev
gfx_v8_0_ring_emit_patch_cond_exec(struct amdgpu_ring * ring,unsigned offset)6694b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_patch_cond_exec(struct amdgpu_ring *ring, unsigned offset)
6695b843c749SSergey Zigachev {
6696b843c749SSergey Zigachev unsigned cur;
6697b843c749SSergey Zigachev
6698b843c749SSergey Zigachev BUG_ON(offset > ring->buf_mask);
6699b843c749SSergey Zigachev BUG_ON(ring->ring[offset] != 0x55aa55aa);
6700b843c749SSergey Zigachev
6701b843c749SSergey Zigachev cur = (ring->wptr & ring->buf_mask) - 1;
6702b843c749SSergey Zigachev if (likely(cur > offset))
6703b843c749SSergey Zigachev ring->ring[offset] = cur - offset;
6704b843c749SSergey Zigachev else
6705b843c749SSergey Zigachev ring->ring[offset] = (ring->ring_size >> 2) - offset + cur;
6706b843c749SSergey Zigachev }
6707b843c749SSergey Zigachev
gfx_v8_0_ring_emit_rreg(struct amdgpu_ring * ring,uint32_t reg)6708b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg)
6709b843c749SSergey Zigachev {
6710b843c749SSergey Zigachev struct amdgpu_device *adev = ring->adev;
6711b843c749SSergey Zigachev
6712b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));
6713b843c749SSergey Zigachev amdgpu_ring_write(ring, 0 | /* src: register*/
6714b843c749SSergey Zigachev (5 << 8) | /* dst: memory */
6715b843c749SSergey Zigachev (1 << 20)); /* write confirm */
6716b843c749SSergey Zigachev amdgpu_ring_write(ring, reg);
6717b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6718b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr +
6719b843c749SSergey Zigachev adev->virt.reg_val_offs * 4));
6720b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr +
6721b843c749SSergey Zigachev adev->virt.reg_val_offs * 4));
6722b843c749SSergey Zigachev }
6723b843c749SSergey Zigachev
gfx_v8_0_ring_emit_wreg(struct amdgpu_ring * ring,uint32_t reg,uint32_t val)6724b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg,
6725b843c749SSergey Zigachev uint32_t val)
6726b843c749SSergey Zigachev {
6727b843c749SSergey Zigachev uint32_t cmd;
6728b843c749SSergey Zigachev
6729b843c749SSergey Zigachev switch (ring->funcs->type) {
6730b843c749SSergey Zigachev case AMDGPU_RING_TYPE_GFX:
6731b843c749SSergey Zigachev cmd = WRITE_DATA_ENGINE_SEL(1) | WR_CONFIRM;
6732b843c749SSergey Zigachev break;
6733b843c749SSergey Zigachev case AMDGPU_RING_TYPE_KIQ:
6734b843c749SSergey Zigachev cmd = 1 << 16; /* no inc addr */
6735b843c749SSergey Zigachev break;
6736b843c749SSergey Zigachev default:
6737b843c749SSergey Zigachev cmd = WR_CONFIRM;
6738b843c749SSergey Zigachev break;
6739b843c749SSergey Zigachev }
6740b843c749SSergey Zigachev
6741b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6742b843c749SSergey Zigachev amdgpu_ring_write(ring, cmd);
6743b843c749SSergey Zigachev amdgpu_ring_write(ring, reg);
6744b843c749SSergey Zigachev amdgpu_ring_write(ring, 0);
6745b843c749SSergey Zigachev amdgpu_ring_write(ring, val);
6746b843c749SSergey Zigachev }
6747b843c749SSergey Zigachev
gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device * adev,enum amdgpu_interrupt_state state)6748b843c749SSergey Zigachev static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
6749b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6750b843c749SSergey Zigachev {
6751b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING0, TIME_STAMP_INT_ENABLE,
6752b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6753b843c749SSergey Zigachev }
6754b843c749SSergey Zigachev
gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device * adev,int me,int pipe,enum amdgpu_interrupt_state state)6755b843c749SSergey Zigachev static void gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
6756b843c749SSergey Zigachev int me, int pipe,
6757b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6758b843c749SSergey Zigachev {
6759b843c749SSergey Zigachev u32 mec_int_cntl, mec_int_cntl_reg;
6760b843c749SSergey Zigachev
6761b843c749SSergey Zigachev /*
6762b843c749SSergey Zigachev * amdgpu controls only the first MEC. That's why this function only
6763b843c749SSergey Zigachev * handles the setting of interrupts for this specific MEC. All other
6764b843c749SSergey Zigachev * pipes' interrupts are set by amdkfd.
6765b843c749SSergey Zigachev */
6766b843c749SSergey Zigachev
6767b843c749SSergey Zigachev if (me == 1) {
6768b843c749SSergey Zigachev switch (pipe) {
6769b843c749SSergey Zigachev case 0:
6770b843c749SSergey Zigachev mec_int_cntl_reg = mmCP_ME1_PIPE0_INT_CNTL;
6771b843c749SSergey Zigachev break;
6772b843c749SSergey Zigachev case 1:
6773b843c749SSergey Zigachev mec_int_cntl_reg = mmCP_ME1_PIPE1_INT_CNTL;
6774b843c749SSergey Zigachev break;
6775b843c749SSergey Zigachev case 2:
6776b843c749SSergey Zigachev mec_int_cntl_reg = mmCP_ME1_PIPE2_INT_CNTL;
6777b843c749SSergey Zigachev break;
6778b843c749SSergey Zigachev case 3:
6779b843c749SSergey Zigachev mec_int_cntl_reg = mmCP_ME1_PIPE3_INT_CNTL;
6780b843c749SSergey Zigachev break;
6781b843c749SSergey Zigachev default:
6782b843c749SSergey Zigachev DRM_DEBUG("invalid pipe %d\n", pipe);
6783b843c749SSergey Zigachev return;
6784b843c749SSergey Zigachev }
6785b843c749SSergey Zigachev } else {
6786b843c749SSergey Zigachev DRM_DEBUG("invalid me %d\n", me);
6787b843c749SSergey Zigachev return;
6788b843c749SSergey Zigachev }
6789b843c749SSergey Zigachev
6790b843c749SSergey Zigachev switch (state) {
6791b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_DISABLE:
6792b843c749SSergey Zigachev mec_int_cntl = RREG32(mec_int_cntl_reg);
6793b843c749SSergey Zigachev mec_int_cntl &= ~CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK;
6794b843c749SSergey Zigachev WREG32(mec_int_cntl_reg, mec_int_cntl);
6795b843c749SSergey Zigachev break;
6796b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_ENABLE:
6797b843c749SSergey Zigachev mec_int_cntl = RREG32(mec_int_cntl_reg);
6798b843c749SSergey Zigachev mec_int_cntl |= CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK;
6799b843c749SSergey Zigachev WREG32(mec_int_cntl_reg, mec_int_cntl);
6800b843c749SSergey Zigachev break;
6801b843c749SSergey Zigachev default:
6802b843c749SSergey Zigachev break;
6803b843c749SSergey Zigachev }
6804b843c749SSergey Zigachev }
6805b843c749SSergey Zigachev
gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)6806b843c749SSergey Zigachev static int gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device *adev,
6807b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6808b843c749SSergey Zigachev unsigned type,
6809b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6810b843c749SSergey Zigachev {
6811b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING0, PRIV_REG_INT_ENABLE,
6812b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6813b843c749SSergey Zigachev
6814b843c749SSergey Zigachev return 0;
6815b843c749SSergey Zigachev }
6816b843c749SSergey Zigachev
gfx_v8_0_set_priv_inst_fault_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)6817b843c749SSergey Zigachev static int gfx_v8_0_set_priv_inst_fault_state(struct amdgpu_device *adev,
6818b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6819b843c749SSergey Zigachev unsigned type,
6820b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6821b843c749SSergey Zigachev {
6822b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING0, PRIV_INSTR_INT_ENABLE,
6823b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6824b843c749SSergey Zigachev
6825b843c749SSergey Zigachev return 0;
6826b843c749SSergey Zigachev }
6827b843c749SSergey Zigachev
gfx_v8_0_set_eop_interrupt_state(struct amdgpu_device * adev,struct amdgpu_irq_src * src,unsigned type,enum amdgpu_interrupt_state state)6828b843c749SSergey Zigachev static int gfx_v8_0_set_eop_interrupt_state(struct amdgpu_device *adev,
6829b843c749SSergey Zigachev struct amdgpu_irq_src *src,
6830b843c749SSergey Zigachev unsigned type,
6831b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6832b843c749SSergey Zigachev {
6833b843c749SSergey Zigachev switch (type) {
6834b843c749SSergey Zigachev case AMDGPU_CP_IRQ_GFX_EOP:
6835b843c749SSergey Zigachev gfx_v8_0_set_gfx_eop_interrupt_state(adev, state);
6836b843c749SSergey Zigachev break;
6837b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP:
6838b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 1, 0, state);
6839b843c749SSergey Zigachev break;
6840b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP:
6841b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 1, 1, state);
6842b843c749SSergey Zigachev break;
6843b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE2_EOP:
6844b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 1, 2, state);
6845b843c749SSergey Zigachev break;
6846b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE3_EOP:
6847b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 1, 3, state);
6848b843c749SSergey Zigachev break;
6849b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE0_EOP:
6850b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 2, 0, state);
6851b843c749SSergey Zigachev break;
6852b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE1_EOP:
6853b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 2, 1, state);
6854b843c749SSergey Zigachev break;
6855b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE2_EOP:
6856b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 2, 2, state);
6857b843c749SSergey Zigachev break;
6858b843c749SSergey Zigachev case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE3_EOP:
6859b843c749SSergey Zigachev gfx_v8_0_set_compute_eop_interrupt_state(adev, 2, 3, state);
6860b843c749SSergey Zigachev break;
6861b843c749SSergey Zigachev default:
6862b843c749SSergey Zigachev break;
6863b843c749SSergey Zigachev }
6864b843c749SSergey Zigachev return 0;
6865b843c749SSergey Zigachev }
6866b843c749SSergey Zigachev
gfx_v8_0_set_cp_ecc_int_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned int type,enum amdgpu_interrupt_state state)6867b843c749SSergey Zigachev static int gfx_v8_0_set_cp_ecc_int_state(struct amdgpu_device *adev,
6868b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6869b843c749SSergey Zigachev unsigned int type,
6870b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6871b843c749SSergey Zigachev {
6872b843c749SSergey Zigachev int enable_flag;
6873b843c749SSergey Zigachev
6874b843c749SSergey Zigachev switch (state) {
6875b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_DISABLE:
6876b843c749SSergey Zigachev enable_flag = 0;
6877b843c749SSergey Zigachev break;
6878b843c749SSergey Zigachev
6879b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_ENABLE:
6880b843c749SSergey Zigachev enable_flag = 1;
6881b843c749SSergey Zigachev break;
6882b843c749SSergey Zigachev
6883b843c749SSergey Zigachev default:
6884b843c749SSergey Zigachev return -EINVAL;
6885b843c749SSergey Zigachev }
6886b843c749SSergey Zigachev
6887b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL, CP_ECC_ERROR_INT_ENABLE, enable_flag);
6888b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING0, CP_ECC_ERROR_INT_ENABLE, enable_flag);
6889b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING1, CP_ECC_ERROR_INT_ENABLE, enable_flag);
6890b843c749SSergey Zigachev WREG32_FIELD(CP_INT_CNTL_RING2, CP_ECC_ERROR_INT_ENABLE, enable_flag);
6891b843c749SSergey Zigachev WREG32_FIELD(CPC_INT_CNTL, CP_ECC_ERROR_INT_ENABLE, enable_flag);
6892b843c749SSergey Zigachev WREG32_FIELD(CP_ME1_PIPE0_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6893b843c749SSergey Zigachev enable_flag);
6894b843c749SSergey Zigachev WREG32_FIELD(CP_ME1_PIPE1_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6895b843c749SSergey Zigachev enable_flag);
6896b843c749SSergey Zigachev WREG32_FIELD(CP_ME1_PIPE2_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6897b843c749SSergey Zigachev enable_flag);
6898b843c749SSergey Zigachev WREG32_FIELD(CP_ME1_PIPE3_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6899b843c749SSergey Zigachev enable_flag);
6900b843c749SSergey Zigachev WREG32_FIELD(CP_ME2_PIPE0_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6901b843c749SSergey Zigachev enable_flag);
6902b843c749SSergey Zigachev WREG32_FIELD(CP_ME2_PIPE1_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6903b843c749SSergey Zigachev enable_flag);
6904b843c749SSergey Zigachev WREG32_FIELD(CP_ME2_PIPE2_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6905b843c749SSergey Zigachev enable_flag);
6906b843c749SSergey Zigachev WREG32_FIELD(CP_ME2_PIPE3_INT_CNTL, CP_ECC_ERROR_INT_ENABLE,
6907b843c749SSergey Zigachev enable_flag);
6908b843c749SSergey Zigachev
6909b843c749SSergey Zigachev return 0;
6910b843c749SSergey Zigachev }
6911b843c749SSergey Zigachev
gfx_v8_0_set_sq_int_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned int type,enum amdgpu_interrupt_state state)6912b843c749SSergey Zigachev static int gfx_v8_0_set_sq_int_state(struct amdgpu_device *adev,
6913b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6914b843c749SSergey Zigachev unsigned int type,
6915b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
6916b843c749SSergey Zigachev {
6917b843c749SSergey Zigachev int enable_flag;
6918b843c749SSergey Zigachev
6919b843c749SSergey Zigachev switch (state) {
6920b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_DISABLE:
6921b843c749SSergey Zigachev enable_flag = 1;
6922b843c749SSergey Zigachev break;
6923b843c749SSergey Zigachev
6924b843c749SSergey Zigachev case AMDGPU_IRQ_STATE_ENABLE:
6925b843c749SSergey Zigachev enable_flag = 0;
6926b843c749SSergey Zigachev break;
6927b843c749SSergey Zigachev
6928b843c749SSergey Zigachev default:
6929b843c749SSergey Zigachev return -EINVAL;
6930b843c749SSergey Zigachev }
6931b843c749SSergey Zigachev
6932b843c749SSergey Zigachev WREG32_FIELD(SQ_INTERRUPT_MSG_CTRL, STALL,
6933b843c749SSergey Zigachev enable_flag);
6934b843c749SSergey Zigachev
6935b843c749SSergey Zigachev return 0;
6936b843c749SSergey Zigachev }
6937b843c749SSergey Zigachev
gfx_v8_0_eop_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)6938b843c749SSergey Zigachev static int gfx_v8_0_eop_irq(struct amdgpu_device *adev,
6939b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6940b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
6941b843c749SSergey Zigachev {
6942b843c749SSergey Zigachev int i;
6943b843c749SSergey Zigachev u8 me_id, pipe_id, queue_id;
6944b843c749SSergey Zigachev struct amdgpu_ring *ring;
6945b843c749SSergey Zigachev
6946b843c749SSergey Zigachev DRM_DEBUG("IH: CP EOP\n");
6947b843c749SSergey Zigachev me_id = (entry->ring_id & 0x0c) >> 2;
6948b843c749SSergey Zigachev pipe_id = (entry->ring_id & 0x03) >> 0;
6949b843c749SSergey Zigachev queue_id = (entry->ring_id & 0x70) >> 4;
6950b843c749SSergey Zigachev
6951b843c749SSergey Zigachev switch (me_id) {
6952b843c749SSergey Zigachev case 0:
6953b843c749SSergey Zigachev amdgpu_fence_process(&adev->gfx.gfx_ring[0]);
6954b843c749SSergey Zigachev break;
6955b843c749SSergey Zigachev case 1:
6956b843c749SSergey Zigachev case 2:
6957b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++) {
6958b843c749SSergey Zigachev ring = &adev->gfx.compute_ring[i];
6959b843c749SSergey Zigachev /* Per-queue interrupt is supported for MEC starting from VI.
6960b843c749SSergey Zigachev * The interrupt can only be enabled/disabled per pipe instead of per queue.
6961b843c749SSergey Zigachev */
6962b843c749SSergey Zigachev if ((ring->me == me_id) && (ring->pipe == pipe_id) && (ring->queue == queue_id))
6963b843c749SSergey Zigachev amdgpu_fence_process(ring);
6964b843c749SSergey Zigachev }
6965b843c749SSergey Zigachev break;
6966b843c749SSergey Zigachev }
6967b843c749SSergey Zigachev return 0;
6968b843c749SSergey Zigachev }
6969b843c749SSergey Zigachev
gfx_v8_0_priv_reg_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)6970b843c749SSergey Zigachev static int gfx_v8_0_priv_reg_irq(struct amdgpu_device *adev,
6971b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6972b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
6973b843c749SSergey Zigachev {
6974b843c749SSergey Zigachev DRM_ERROR("Illegal register access in command stream\n");
6975b843c749SSergey Zigachev schedule_work(&adev->reset_work);
6976b843c749SSergey Zigachev return 0;
6977b843c749SSergey Zigachev }
6978b843c749SSergey Zigachev
gfx_v8_0_priv_inst_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)6979b843c749SSergey Zigachev static int gfx_v8_0_priv_inst_irq(struct amdgpu_device *adev,
6980b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6981b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
6982b843c749SSergey Zigachev {
6983b843c749SSergey Zigachev DRM_ERROR("Illegal instruction in command stream\n");
6984b843c749SSergey Zigachev schedule_work(&adev->reset_work);
6985b843c749SSergey Zigachev return 0;
6986b843c749SSergey Zigachev }
6987b843c749SSergey Zigachev
gfx_v8_0_cp_ecc_error_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)6988b843c749SSergey Zigachev static int gfx_v8_0_cp_ecc_error_irq(struct amdgpu_device *adev,
6989b843c749SSergey Zigachev struct amdgpu_irq_src *source,
6990b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
6991b843c749SSergey Zigachev {
6992b843c749SSergey Zigachev DRM_ERROR("CP EDC/ECC error detected.");
6993b843c749SSergey Zigachev return 0;
6994b843c749SSergey Zigachev }
6995b843c749SSergey Zigachev
gfx_v8_0_parse_sq_irq(struct amdgpu_device * adev,unsigned ih_data)6996b843c749SSergey Zigachev static void gfx_v8_0_parse_sq_irq(struct amdgpu_device *adev, unsigned ih_data)
6997b843c749SSergey Zigachev {
6998b843c749SSergey Zigachev u32 enc, se_id, sh_id, cu_id;
6999b843c749SSergey Zigachev char type[20];
7000b843c749SSergey Zigachev int sq_edc_source = -1;
7001b843c749SSergey Zigachev
7002b843c749SSergey Zigachev enc = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_CMN, ENCODING);
7003b843c749SSergey Zigachev se_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_CMN, SE_ID);
7004b843c749SSergey Zigachev
7005b843c749SSergey Zigachev switch (enc) {
7006b843c749SSergey Zigachev case 0:
7007b843c749SSergey Zigachev DRM_INFO("SQ general purpose intr detected:"
7008b843c749SSergey Zigachev "se_id %d, immed_overflow %d, host_reg_overflow %d,"
7009b843c749SSergey Zigachev "host_cmd_overflow %d, cmd_timestamp %d,"
7010b843c749SSergey Zigachev "reg_timestamp %d, thread_trace_buff_full %d,"
7011b843c749SSergey Zigachev "wlt %d, thread_trace %d.\n",
7012b843c749SSergey Zigachev se_id,
7013b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, IMMED_OVERFLOW),
7014b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, HOST_REG_OVERFLOW),
7015b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, HOST_CMD_OVERFLOW),
7016b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, CMD_TIMESTAMP),
7017b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, REG_TIMESTAMP),
7018b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, THREAD_TRACE_BUF_FULL),
7019b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, WLT),
7020b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, THREAD_TRACE)
7021b843c749SSergey Zigachev );
7022b843c749SSergey Zigachev break;
7023b843c749SSergey Zigachev case 1:
7024b843c749SSergey Zigachev case 2:
7025b843c749SSergey Zigachev
7026b843c749SSergey Zigachev cu_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, CU_ID);
7027b843c749SSergey Zigachev sh_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, SH_ID);
7028b843c749SSergey Zigachev
7029b843c749SSergey Zigachev /*
7030b843c749SSergey Zigachev * This function can be called either directly from ISR
7031b843c749SSergey Zigachev * or from BH in which case we can access SQ_EDC_INFO
7032b843c749SSergey Zigachev * instance
7033b843c749SSergey Zigachev */
7034b843c749SSergey Zigachev if (in_task()) {
7035b843c749SSergey Zigachev mutex_lock(&adev->grbm_idx_mutex);
7036b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id);
7037b843c749SSergey Zigachev
7038b843c749SSergey Zigachev sq_edc_source = REG_GET_FIELD(RREG32(mmSQ_EDC_INFO), SQ_EDC_INFO, SOURCE);
7039b843c749SSergey Zigachev
7040b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
7041b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
7042b843c749SSergey Zigachev }
7043b843c749SSergey Zigachev
7044b843c749SSergey Zigachev if (enc == 1)
7045b843c749SSergey Zigachev sprintf(type, "instruction intr");
7046b843c749SSergey Zigachev else
7047b843c749SSergey Zigachev sprintf(type, "EDC/ECC error");
7048b843c749SSergey Zigachev
7049b843c749SSergey Zigachev DRM_INFO(
7050b843c749SSergey Zigachev "SQ %s detected: "
7051b843c749SSergey Zigachev "se_id %d, sh_id %d, cu_id %d, simd_id %d, wave_id %d, vm_id %d "
7052b843c749SSergey Zigachev "trap %s, sq_ed_info.source %s.\n",
7053b843c749SSergey Zigachev type, se_id, sh_id, cu_id,
7054b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, SIMD_ID),
7055b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, WAVE_ID),
7056b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, VM_ID),
7057b843c749SSergey Zigachev REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, PRIV) ? "true" : "false",
7058b843c749SSergey Zigachev (sq_edc_source != -1) ? sq_edc_source_names[sq_edc_source] : "unavailable"
7059b843c749SSergey Zigachev );
7060b843c749SSergey Zigachev break;
7061b843c749SSergey Zigachev default:
7062b843c749SSergey Zigachev DRM_ERROR("SQ invalid encoding type\n.");
7063b843c749SSergey Zigachev }
7064b843c749SSergey Zigachev }
7065b843c749SSergey Zigachev
gfx_v8_0_sq_irq_work_func(struct work_struct * work)7066b843c749SSergey Zigachev static void gfx_v8_0_sq_irq_work_func(struct work_struct *work)
7067b843c749SSergey Zigachev {
7068b843c749SSergey Zigachev
7069b843c749SSergey Zigachev struct amdgpu_device *adev = container_of(work, struct amdgpu_device, gfx.sq_work.work);
7070b843c749SSergey Zigachev struct sq_work *sq_work = container_of(work, struct sq_work, work);
7071b843c749SSergey Zigachev
7072b843c749SSergey Zigachev gfx_v8_0_parse_sq_irq(adev, sq_work->ih_data);
7073b843c749SSergey Zigachev }
7074b843c749SSergey Zigachev
gfx_v8_0_sq_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)7075b843c749SSergey Zigachev static int gfx_v8_0_sq_irq(struct amdgpu_device *adev,
7076b843c749SSergey Zigachev struct amdgpu_irq_src *source,
7077b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
7078b843c749SSergey Zigachev {
7079b843c749SSergey Zigachev unsigned ih_data = entry->src_data[0];
7080b843c749SSergey Zigachev
7081b843c749SSergey Zigachev /*
7082b843c749SSergey Zigachev * Try to submit work so SQ_EDC_INFO can be accessed from
7083b843c749SSergey Zigachev * BH. If previous work submission hasn't finished yet
7084b843c749SSergey Zigachev * just print whatever info is possible directly from the ISR.
7085b843c749SSergey Zigachev */
7086b843c749SSergey Zigachev if (work_pending(&adev->gfx.sq_work.work)) {
7087b843c749SSergey Zigachev gfx_v8_0_parse_sq_irq(adev, ih_data);
7088b843c749SSergey Zigachev } else {
7089b843c749SSergey Zigachev adev->gfx.sq_work.ih_data = ih_data;
7090b843c749SSergey Zigachev schedule_work(&adev->gfx.sq_work.work);
7091b843c749SSergey Zigachev }
7092b843c749SSergey Zigachev
7093b843c749SSergey Zigachev return 0;
7094b843c749SSergey Zigachev }
7095b843c749SSergey Zigachev
gfx_v8_0_kiq_set_interrupt_state(struct amdgpu_device * adev,struct amdgpu_irq_src * src,unsigned int type,enum amdgpu_interrupt_state state)7096b843c749SSergey Zigachev static int gfx_v8_0_kiq_set_interrupt_state(struct amdgpu_device *adev,
7097b843c749SSergey Zigachev struct amdgpu_irq_src *src,
7098b843c749SSergey Zigachev unsigned int type,
7099b843c749SSergey Zigachev enum amdgpu_interrupt_state state)
7100b843c749SSergey Zigachev {
7101b843c749SSergey Zigachev struct amdgpu_ring *ring = &(adev->gfx.kiq.ring);
7102b843c749SSergey Zigachev
7103b843c749SSergey Zigachev switch (type) {
7104b843c749SSergey Zigachev case AMDGPU_CP_KIQ_IRQ_DRIVER0:
7105b843c749SSergey Zigachev WREG32_FIELD(CPC_INT_CNTL, GENERIC2_INT_ENABLE,
7106b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
7107b843c749SSergey Zigachev if (ring->me == 1)
7108b843c749SSergey Zigachev WREG32_FIELD_OFFSET(CP_ME1_PIPE0_INT_CNTL,
7109b843c749SSergey Zigachev ring->pipe,
7110b843c749SSergey Zigachev GENERIC2_INT_ENABLE,
7111b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
7112b843c749SSergey Zigachev else
7113b843c749SSergey Zigachev WREG32_FIELD_OFFSET(CP_ME2_PIPE0_INT_CNTL,
7114b843c749SSergey Zigachev ring->pipe,
7115b843c749SSergey Zigachev GENERIC2_INT_ENABLE,
7116b843c749SSergey Zigachev state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
7117b843c749SSergey Zigachev break;
7118b843c749SSergey Zigachev default:
7119b843c749SSergey Zigachev BUG(); /* kiq only support GENERIC2_INT now */
7120b843c749SSergey Zigachev break;
7121b843c749SSergey Zigachev }
7122b843c749SSergey Zigachev return 0;
7123b843c749SSergey Zigachev }
7124b843c749SSergey Zigachev
gfx_v8_0_kiq_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)7125b843c749SSergey Zigachev static int gfx_v8_0_kiq_irq(struct amdgpu_device *adev,
7126b843c749SSergey Zigachev struct amdgpu_irq_src *source,
7127b843c749SSergey Zigachev struct amdgpu_iv_entry *entry)
7128b843c749SSergey Zigachev {
7129b843c749SSergey Zigachev u8 me_id, pipe_id, queue_id;
7130b843c749SSergey Zigachev struct amdgpu_ring *ring = &(adev->gfx.kiq.ring);
7131b843c749SSergey Zigachev
7132b843c749SSergey Zigachev me_id = (entry->ring_id & 0x0c) >> 2;
7133b843c749SSergey Zigachev pipe_id = (entry->ring_id & 0x03) >> 0;
7134b843c749SSergey Zigachev queue_id = (entry->ring_id & 0x70) >> 4;
7135b843c749SSergey Zigachev DRM_DEBUG("IH: CPC GENERIC2_INT, me:%d, pipe:%d, queue:%d\n",
7136b843c749SSergey Zigachev me_id, pipe_id, queue_id);
7137b843c749SSergey Zigachev
7138b843c749SSergey Zigachev amdgpu_fence_process(ring);
7139b843c749SSergey Zigachev return 0;
7140b843c749SSergey Zigachev }
7141b843c749SSergey Zigachev
7142b843c749SSergey Zigachev static const struct amd_ip_funcs gfx_v8_0_ip_funcs = {
7143b843c749SSergey Zigachev .name = "gfx_v8_0",
7144b843c749SSergey Zigachev .early_init = gfx_v8_0_early_init,
7145b843c749SSergey Zigachev .late_init = gfx_v8_0_late_init,
7146b843c749SSergey Zigachev .sw_init = gfx_v8_0_sw_init,
7147b843c749SSergey Zigachev .sw_fini = gfx_v8_0_sw_fini,
7148b843c749SSergey Zigachev .hw_init = gfx_v8_0_hw_init,
7149b843c749SSergey Zigachev .hw_fini = gfx_v8_0_hw_fini,
7150b843c749SSergey Zigachev .suspend = gfx_v8_0_suspend,
7151b843c749SSergey Zigachev .resume = gfx_v8_0_resume,
7152b843c749SSergey Zigachev .is_idle = gfx_v8_0_is_idle,
7153b843c749SSergey Zigachev .wait_for_idle = gfx_v8_0_wait_for_idle,
7154b843c749SSergey Zigachev .check_soft_reset = gfx_v8_0_check_soft_reset,
7155b843c749SSergey Zigachev .pre_soft_reset = gfx_v8_0_pre_soft_reset,
7156b843c749SSergey Zigachev .soft_reset = gfx_v8_0_soft_reset,
7157b843c749SSergey Zigachev .post_soft_reset = gfx_v8_0_post_soft_reset,
7158b843c749SSergey Zigachev .set_clockgating_state = gfx_v8_0_set_clockgating_state,
7159b843c749SSergey Zigachev .set_powergating_state = gfx_v8_0_set_powergating_state,
7160b843c749SSergey Zigachev .get_clockgating_state = gfx_v8_0_get_clockgating_state,
7161b843c749SSergey Zigachev };
7162b843c749SSergey Zigachev
7163b843c749SSergey Zigachev static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
7164b843c749SSergey Zigachev .type = AMDGPU_RING_TYPE_GFX,
7165b843c749SSergey Zigachev .align_mask = 0xff,
7166b843c749SSergey Zigachev .nop = PACKET3(PACKET3_NOP, 0x3FFF),
7167b843c749SSergey Zigachev .support_64bit_ptrs = false,
7168b843c749SSergey Zigachev .get_rptr = gfx_v8_0_ring_get_rptr,
7169b843c749SSergey Zigachev .get_wptr = gfx_v8_0_ring_get_wptr_gfx,
7170b843c749SSergey Zigachev .set_wptr = gfx_v8_0_ring_set_wptr_gfx,
7171b843c749SSergey Zigachev .emit_frame_size = /* maximum 215dw if count 16 IBs in */
7172b843c749SSergey Zigachev 5 + /* COND_EXEC */
7173b843c749SSergey Zigachev 7 + /* PIPELINE_SYNC */
7174b843c749SSergey Zigachev VI_FLUSH_GPU_TLB_NUM_WREG * 5 + 9 + /* VM_FLUSH */
7175b843c749SSergey Zigachev 12 + /* FENCE for VM_FLUSH */
7176b843c749SSergey Zigachev 20 + /* GDS switch */
7177b843c749SSergey Zigachev 4 + /* double SWITCH_BUFFER,
7178b843c749SSergey Zigachev the first COND_EXEC jump to the place just
7179b843c749SSergey Zigachev prior to this double SWITCH_BUFFER */
7180b843c749SSergey Zigachev 5 + /* COND_EXEC */
7181b843c749SSergey Zigachev 7 + /* HDP_flush */
7182b843c749SSergey Zigachev 4 + /* VGT_flush */
7183b843c749SSergey Zigachev 14 + /* CE_META */
7184b843c749SSergey Zigachev 31 + /* DE_META */
7185b843c749SSergey Zigachev 3 + /* CNTX_CTRL */
7186b843c749SSergey Zigachev 5 + /* HDP_INVL */
7187b843c749SSergey Zigachev 12 + 12 + /* FENCE x2 */
7188b843c749SSergey Zigachev 2, /* SWITCH_BUFFER */
7189b843c749SSergey Zigachev .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_gfx */
7190b843c749SSergey Zigachev .emit_ib = gfx_v8_0_ring_emit_ib_gfx,
7191b843c749SSergey Zigachev .emit_fence = gfx_v8_0_ring_emit_fence_gfx,
7192b843c749SSergey Zigachev .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
7193b843c749SSergey Zigachev .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
7194b843c749SSergey Zigachev .emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
7195b843c749SSergey Zigachev .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
7196b843c749SSergey Zigachev .test_ring = gfx_v8_0_ring_test_ring,
7197b843c749SSergey Zigachev .test_ib = gfx_v8_0_ring_test_ib,
7198b843c749SSergey Zigachev .insert_nop = amdgpu_ring_insert_nop,
7199b843c749SSergey Zigachev .pad_ib = amdgpu_ring_generic_pad_ib,
7200b843c749SSergey Zigachev .emit_switch_buffer = gfx_v8_ring_emit_sb,
7201b843c749SSergey Zigachev .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl,
7202b843c749SSergey Zigachev .init_cond_exec = gfx_v8_0_ring_emit_init_cond_exec,
7203b843c749SSergey Zigachev .patch_cond_exec = gfx_v8_0_ring_emit_patch_cond_exec,
7204b843c749SSergey Zigachev .emit_wreg = gfx_v8_0_ring_emit_wreg,
7205b843c749SSergey Zigachev };
7206b843c749SSergey Zigachev
7207b843c749SSergey Zigachev static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
7208b843c749SSergey Zigachev .type = AMDGPU_RING_TYPE_COMPUTE,
7209b843c749SSergey Zigachev .align_mask = 0xff,
7210b843c749SSergey Zigachev .nop = PACKET3(PACKET3_NOP, 0x3FFF),
7211b843c749SSergey Zigachev .support_64bit_ptrs = false,
7212b843c749SSergey Zigachev .get_rptr = gfx_v8_0_ring_get_rptr,
7213b843c749SSergey Zigachev .get_wptr = gfx_v8_0_ring_get_wptr_compute,
7214b843c749SSergey Zigachev .set_wptr = gfx_v8_0_ring_set_wptr_compute,
7215b843c749SSergey Zigachev .emit_frame_size =
7216b843c749SSergey Zigachev 20 + /* gfx_v8_0_ring_emit_gds_switch */
7217b843c749SSergey Zigachev 7 + /* gfx_v8_0_ring_emit_hdp_flush */
7218b843c749SSergey Zigachev 5 + /* hdp_invalidate */
7219b843c749SSergey Zigachev 7 + /* gfx_v8_0_ring_emit_pipeline_sync */
7220b843c749SSergey Zigachev VI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v8_0_ring_emit_vm_flush */
7221b843c749SSergey Zigachev 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */
7222b843c749SSergey Zigachev .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */
7223b843c749SSergey Zigachev .emit_ib = gfx_v8_0_ring_emit_ib_compute,
7224b843c749SSergey Zigachev .emit_fence = gfx_v8_0_ring_emit_fence_compute,
7225b843c749SSergey Zigachev .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
7226b843c749SSergey Zigachev .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
7227b843c749SSergey Zigachev .emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
7228b843c749SSergey Zigachev .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
7229b843c749SSergey Zigachev .test_ring = gfx_v8_0_ring_test_ring,
7230b843c749SSergey Zigachev .test_ib = gfx_v8_0_ring_test_ib,
7231b843c749SSergey Zigachev .insert_nop = amdgpu_ring_insert_nop,
7232b843c749SSergey Zigachev .pad_ib = amdgpu_ring_generic_pad_ib,
7233b843c749SSergey Zigachev .set_priority = gfx_v8_0_ring_set_priority_compute,
7234b843c749SSergey Zigachev .emit_wreg = gfx_v8_0_ring_emit_wreg,
7235b843c749SSergey Zigachev };
7236b843c749SSergey Zigachev
7237b843c749SSergey Zigachev static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = {
7238b843c749SSergey Zigachev .type = AMDGPU_RING_TYPE_KIQ,
7239b843c749SSergey Zigachev .align_mask = 0xff,
7240b843c749SSergey Zigachev .nop = PACKET3(PACKET3_NOP, 0x3FFF),
7241b843c749SSergey Zigachev .support_64bit_ptrs = false,
7242b843c749SSergey Zigachev .get_rptr = gfx_v8_0_ring_get_rptr,
7243b843c749SSergey Zigachev .get_wptr = gfx_v8_0_ring_get_wptr_compute,
7244b843c749SSergey Zigachev .set_wptr = gfx_v8_0_ring_set_wptr_compute,
7245b843c749SSergey Zigachev .emit_frame_size =
7246b843c749SSergey Zigachev 20 + /* gfx_v8_0_ring_emit_gds_switch */
7247b843c749SSergey Zigachev 7 + /* gfx_v8_0_ring_emit_hdp_flush */
7248b843c749SSergey Zigachev 5 + /* hdp_invalidate */
7249b843c749SSergey Zigachev 7 + /* gfx_v8_0_ring_emit_pipeline_sync */
7250b843c749SSergey Zigachev 17 + /* gfx_v8_0_ring_emit_vm_flush */
7251b843c749SSergey Zigachev 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_kiq x3 for user fence, vm fence */
7252b843c749SSergey Zigachev .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */
7253b843c749SSergey Zigachev .emit_ib = gfx_v8_0_ring_emit_ib_compute,
7254b843c749SSergey Zigachev .emit_fence = gfx_v8_0_ring_emit_fence_kiq,
7255b843c749SSergey Zigachev .test_ring = gfx_v8_0_ring_test_ring,
7256b843c749SSergey Zigachev .test_ib = gfx_v8_0_ring_test_ib,
7257b843c749SSergey Zigachev .insert_nop = amdgpu_ring_insert_nop,
7258b843c749SSergey Zigachev .pad_ib = amdgpu_ring_generic_pad_ib,
7259b843c749SSergey Zigachev .emit_rreg = gfx_v8_0_ring_emit_rreg,
7260b843c749SSergey Zigachev .emit_wreg = gfx_v8_0_ring_emit_wreg,
7261b843c749SSergey Zigachev };
7262b843c749SSergey Zigachev
gfx_v8_0_set_ring_funcs(struct amdgpu_device * adev)7263b843c749SSergey Zigachev static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)
7264b843c749SSergey Zigachev {
7265b843c749SSergey Zigachev int i;
7266b843c749SSergey Zigachev
7267b843c749SSergey Zigachev adev->gfx.kiq.ring.funcs = &gfx_v8_0_ring_funcs_kiq;
7268b843c749SSergey Zigachev
7269b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_gfx_rings; i++)
7270b843c749SSergey Zigachev adev->gfx.gfx_ring[i].funcs = &gfx_v8_0_ring_funcs_gfx;
7271b843c749SSergey Zigachev
7272b843c749SSergey Zigachev for (i = 0; i < adev->gfx.num_compute_rings; i++)
7273b843c749SSergey Zigachev adev->gfx.compute_ring[i].funcs = &gfx_v8_0_ring_funcs_compute;
7274b843c749SSergey Zigachev }
7275b843c749SSergey Zigachev
7276b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_eop_irq_funcs = {
7277b843c749SSergey Zigachev .set = gfx_v8_0_set_eop_interrupt_state,
7278b843c749SSergey Zigachev .process = gfx_v8_0_eop_irq,
7279b843c749SSergey Zigachev };
7280b843c749SSergey Zigachev
7281b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_priv_reg_irq_funcs = {
7282b843c749SSergey Zigachev .set = gfx_v8_0_set_priv_reg_fault_state,
7283b843c749SSergey Zigachev .process = gfx_v8_0_priv_reg_irq,
7284b843c749SSergey Zigachev };
7285b843c749SSergey Zigachev
7286b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_priv_inst_irq_funcs = {
7287b843c749SSergey Zigachev .set = gfx_v8_0_set_priv_inst_fault_state,
7288b843c749SSergey Zigachev .process = gfx_v8_0_priv_inst_irq,
7289b843c749SSergey Zigachev };
7290b843c749SSergey Zigachev
7291b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_kiq_irq_funcs = {
7292b843c749SSergey Zigachev .set = gfx_v8_0_kiq_set_interrupt_state,
7293b843c749SSergey Zigachev .process = gfx_v8_0_kiq_irq,
7294b843c749SSergey Zigachev };
7295b843c749SSergey Zigachev
7296b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_cp_ecc_error_irq_funcs = {
7297b843c749SSergey Zigachev .set = gfx_v8_0_set_cp_ecc_int_state,
7298b843c749SSergey Zigachev .process = gfx_v8_0_cp_ecc_error_irq,
7299b843c749SSergey Zigachev };
7300b843c749SSergey Zigachev
7301b843c749SSergey Zigachev static const struct amdgpu_irq_src_funcs gfx_v8_0_sq_irq_funcs = {
7302b843c749SSergey Zigachev .set = gfx_v8_0_set_sq_int_state,
7303b843c749SSergey Zigachev .process = gfx_v8_0_sq_irq,
7304b843c749SSergey Zigachev };
7305b843c749SSergey Zigachev
gfx_v8_0_set_irq_funcs(struct amdgpu_device * adev)7306b843c749SSergey Zigachev static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev)
7307b843c749SSergey Zigachev {
7308b843c749SSergey Zigachev adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;
7309b843c749SSergey Zigachev adev->gfx.eop_irq.funcs = &gfx_v8_0_eop_irq_funcs;
7310b843c749SSergey Zigachev
7311b843c749SSergey Zigachev adev->gfx.priv_reg_irq.num_types = 1;
7312b843c749SSergey Zigachev adev->gfx.priv_reg_irq.funcs = &gfx_v8_0_priv_reg_irq_funcs;
7313b843c749SSergey Zigachev
7314b843c749SSergey Zigachev adev->gfx.priv_inst_irq.num_types = 1;
7315b843c749SSergey Zigachev adev->gfx.priv_inst_irq.funcs = &gfx_v8_0_priv_inst_irq_funcs;
7316b843c749SSergey Zigachev
7317b843c749SSergey Zigachev adev->gfx.kiq.irq.num_types = AMDGPU_CP_KIQ_IRQ_LAST;
7318b843c749SSergey Zigachev adev->gfx.kiq.irq.funcs = &gfx_v8_0_kiq_irq_funcs;
7319b843c749SSergey Zigachev
7320b843c749SSergey Zigachev adev->gfx.cp_ecc_error_irq.num_types = 1;
7321b843c749SSergey Zigachev adev->gfx.cp_ecc_error_irq.funcs = &gfx_v8_0_cp_ecc_error_irq_funcs;
7322b843c749SSergey Zigachev
7323b843c749SSergey Zigachev adev->gfx.sq_irq.num_types = 1;
7324b843c749SSergey Zigachev adev->gfx.sq_irq.funcs = &gfx_v8_0_sq_irq_funcs;
7325b843c749SSergey Zigachev }
7326b843c749SSergey Zigachev
gfx_v8_0_set_rlc_funcs(struct amdgpu_device * adev)7327b843c749SSergey Zigachev static void gfx_v8_0_set_rlc_funcs(struct amdgpu_device *adev)
7328b843c749SSergey Zigachev {
7329b843c749SSergey Zigachev adev->gfx.rlc.funcs = &iceland_rlc_funcs;
7330b843c749SSergey Zigachev }
7331b843c749SSergey Zigachev
gfx_v8_0_set_gds_init(struct amdgpu_device * adev)7332b843c749SSergey Zigachev static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev)
7333b843c749SSergey Zigachev {
7334b843c749SSergey Zigachev /* init asci gds info */
7335b843c749SSergey Zigachev adev->gds.mem.total_size = RREG32(mmGDS_VMID0_SIZE);
7336b843c749SSergey Zigachev adev->gds.gws.total_size = 64;
7337b843c749SSergey Zigachev adev->gds.oa.total_size = 16;
7338b843c749SSergey Zigachev
7339b843c749SSergey Zigachev if (adev->gds.mem.total_size == 64 * 1024) {
7340b843c749SSergey Zigachev adev->gds.mem.gfx_partition_size = 4096;
7341b843c749SSergey Zigachev adev->gds.mem.cs_partition_size = 4096;
7342b843c749SSergey Zigachev
7343b843c749SSergey Zigachev adev->gds.gws.gfx_partition_size = 4;
7344b843c749SSergey Zigachev adev->gds.gws.cs_partition_size = 4;
7345b843c749SSergey Zigachev
7346b843c749SSergey Zigachev adev->gds.oa.gfx_partition_size = 4;
7347b843c749SSergey Zigachev adev->gds.oa.cs_partition_size = 1;
7348b843c749SSergey Zigachev } else {
7349b843c749SSergey Zigachev adev->gds.mem.gfx_partition_size = 1024;
7350b843c749SSergey Zigachev adev->gds.mem.cs_partition_size = 1024;
7351b843c749SSergey Zigachev
7352b843c749SSergey Zigachev adev->gds.gws.gfx_partition_size = 16;
7353b843c749SSergey Zigachev adev->gds.gws.cs_partition_size = 16;
7354b843c749SSergey Zigachev
7355b843c749SSergey Zigachev adev->gds.oa.gfx_partition_size = 4;
7356b843c749SSergey Zigachev adev->gds.oa.cs_partition_size = 4;
7357b843c749SSergey Zigachev }
7358b843c749SSergey Zigachev }
7359b843c749SSergey Zigachev
gfx_v8_0_set_user_cu_inactive_bitmap(struct amdgpu_device * adev,u32 bitmap)7360b843c749SSergey Zigachev static void gfx_v8_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,
7361b843c749SSergey Zigachev u32 bitmap)
7362b843c749SSergey Zigachev {
7363b843c749SSergey Zigachev u32 data;
7364b843c749SSergey Zigachev
7365b843c749SSergey Zigachev if (!bitmap)
7366b843c749SSergey Zigachev return;
7367b843c749SSergey Zigachev
7368b843c749SSergey Zigachev data = bitmap << GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
7369b843c749SSergey Zigachev data &= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
7370b843c749SSergey Zigachev
7371b843c749SSergey Zigachev WREG32(mmGC_USER_SHADER_ARRAY_CONFIG, data);
7372b843c749SSergey Zigachev }
7373b843c749SSergey Zigachev
gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device * adev)7374b843c749SSergey Zigachev static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev)
7375b843c749SSergey Zigachev {
7376b843c749SSergey Zigachev u32 data, mask;
7377b843c749SSergey Zigachev
7378b843c749SSergey Zigachev data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG) |
7379b843c749SSergey Zigachev RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
7380b843c749SSergey Zigachev
7381b843c749SSergey Zigachev mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_cu_per_sh);
7382b843c749SSergey Zigachev
7383b843c749SSergey Zigachev return ~REG_GET_FIELD(data, CC_GC_SHADER_ARRAY_CONFIG, INACTIVE_CUS) & mask;
7384b843c749SSergey Zigachev }
7385b843c749SSergey Zigachev
gfx_v8_0_get_cu_info(struct amdgpu_device * adev)7386b843c749SSergey Zigachev static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)
7387b843c749SSergey Zigachev {
7388b843c749SSergey Zigachev int i, j, k, counter, active_cu_number = 0;
7389b843c749SSergey Zigachev u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
7390b843c749SSergey Zigachev struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
7391b843c749SSergey Zigachev unsigned disable_masks[4 * 2];
7392b843c749SSergey Zigachev u32 ao_cu_num;
7393b843c749SSergey Zigachev
7394b843c749SSergey Zigachev memset(cu_info, 0, sizeof(*cu_info));
7395b843c749SSergey Zigachev
7396b843c749SSergey Zigachev if (adev->flags & AMD_IS_APU)
7397b843c749SSergey Zigachev ao_cu_num = 2;
7398b843c749SSergey Zigachev else
7399b843c749SSergey Zigachev ao_cu_num = adev->gfx.config.max_cu_per_sh;
7400b843c749SSergey Zigachev
7401b843c749SSergey Zigachev amdgpu_gfx_parse_disable_cu(disable_masks, 4, 2);
7402b843c749SSergey Zigachev
7403b843c749SSergey Zigachev mutex_lock(&adev->grbm_idx_mutex);
7404b843c749SSergey Zigachev for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
7405b843c749SSergey Zigachev for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
7406b843c749SSergey Zigachev mask = 1;
7407b843c749SSergey Zigachev ao_bitmap = 0;
7408b843c749SSergey Zigachev counter = 0;
7409b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff);
7410b843c749SSergey Zigachev if (i < 4 && j < 2)
7411b843c749SSergey Zigachev gfx_v8_0_set_user_cu_inactive_bitmap(
7412b843c749SSergey Zigachev adev, disable_masks[i * 2 + j]);
7413b843c749SSergey Zigachev bitmap = gfx_v8_0_get_cu_active_bitmap(adev);
7414b843c749SSergey Zigachev cu_info->bitmap[i][j] = bitmap;
7415b843c749SSergey Zigachev
7416b843c749SSergey Zigachev for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {
7417b843c749SSergey Zigachev if (bitmap & mask) {
7418b843c749SSergey Zigachev if (counter < ao_cu_num)
7419b843c749SSergey Zigachev ao_bitmap |= mask;
7420b843c749SSergey Zigachev counter ++;
7421b843c749SSergey Zigachev }
7422b843c749SSergey Zigachev mask <<= 1;
7423b843c749SSergey Zigachev }
7424b843c749SSergey Zigachev active_cu_number += counter;
7425b843c749SSergey Zigachev if (i < 2 && j < 2)
7426b843c749SSergey Zigachev ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
7427b843c749SSergey Zigachev cu_info->ao_cu_bitmap[i][j] = ao_bitmap;
7428b843c749SSergey Zigachev }
7429b843c749SSergey Zigachev }
7430b843c749SSergey Zigachev gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
7431b843c749SSergey Zigachev mutex_unlock(&adev->grbm_idx_mutex);
7432b843c749SSergey Zigachev
7433b843c749SSergey Zigachev cu_info->number = active_cu_number;
7434b843c749SSergey Zigachev cu_info->ao_cu_mask = ao_cu_mask;
7435b843c749SSergey Zigachev cu_info->simd_per_cu = NUM_SIMD_PER_CU;
7436b843c749SSergey Zigachev cu_info->max_waves_per_simd = 10;
7437b843c749SSergey Zigachev cu_info->max_scratch_slots_per_cu = 32;
7438b843c749SSergey Zigachev cu_info->wave_front_size = 64;
7439b843c749SSergey Zigachev cu_info->lds_size = 64;
7440b843c749SSergey Zigachev }
7441b843c749SSergey Zigachev
7442b843c749SSergey Zigachev const struct amdgpu_ip_block_version gfx_v8_0_ip_block =
7443b843c749SSergey Zigachev {
7444b843c749SSergey Zigachev .type = AMD_IP_BLOCK_TYPE_GFX,
7445b843c749SSergey Zigachev .major = 8,
7446b843c749SSergey Zigachev .minor = 0,
7447b843c749SSergey Zigachev .rev = 0,
7448b843c749SSergey Zigachev .funcs = &gfx_v8_0_ip_funcs,
7449b843c749SSergey Zigachev };
7450b843c749SSergey Zigachev
7451b843c749SSergey Zigachev const struct amdgpu_ip_block_version gfx_v8_1_ip_block =
7452b843c749SSergey Zigachev {
7453b843c749SSergey Zigachev .type = AMD_IP_BLOCK_TYPE_GFX,
7454b843c749SSergey Zigachev .major = 8,
7455b843c749SSergey Zigachev .minor = 1,
7456b843c749SSergey Zigachev .rev = 0,
7457b843c749SSergey Zigachev .funcs = &gfx_v8_0_ip_funcs,
7458b843c749SSergey Zigachev };
7459b843c749SSergey Zigachev
gfx_v8_0_ring_emit_ce_meta(struct amdgpu_ring * ring)7460b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_ce_meta(struct amdgpu_ring *ring)
7461b843c749SSergey Zigachev {
7462b843c749SSergey Zigachev uint64_t ce_payload_addr;
7463b843c749SSergey Zigachev int cnt_ce;
7464b843c749SSergey Zigachev union {
7465b843c749SSergey Zigachev struct vi_ce_ib_state regular;
7466b843c749SSergey Zigachev struct vi_ce_ib_state_chained_ib chained;
7467b843c749SSergey Zigachev } ce_payload = {};
7468b843c749SSergey Zigachev
7469b843c749SSergey Zigachev if (ring->adev->virt.chained_ib_support) {
7470b843c749SSergey Zigachev ce_payload_addr = amdgpu_csa_vaddr(ring->adev) +
7471b843c749SSergey Zigachev offsetof(struct vi_gfx_meta_data_chained_ib, ce_payload);
7472b843c749SSergey Zigachev cnt_ce = (sizeof(ce_payload.chained) >> 2) + 4 - 2;
7473b843c749SSergey Zigachev } else {
7474b843c749SSergey Zigachev ce_payload_addr = amdgpu_csa_vaddr(ring->adev) +
7475b843c749SSergey Zigachev offsetof(struct vi_gfx_meta_data, ce_payload);
7476b843c749SSergey Zigachev cnt_ce = (sizeof(ce_payload.regular) >> 2) + 4 - 2;
7477b843c749SSergey Zigachev }
7478b843c749SSergey Zigachev
7479b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, cnt_ce));
7480b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) |
7481b843c749SSergey Zigachev WRITE_DATA_DST_SEL(8) |
7482b843c749SSergey Zigachev WR_CONFIRM) |
7483b843c749SSergey Zigachev WRITE_DATA_CACHE_POLICY(0));
7484b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(ce_payload_addr));
7485b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(ce_payload_addr));
7486b843c749SSergey Zigachev amdgpu_ring_write_multiple(ring, (void *)&ce_payload, cnt_ce - 2);
7487b843c749SSergey Zigachev }
7488b843c749SSergey Zigachev
gfx_v8_0_ring_emit_de_meta(struct amdgpu_ring * ring)7489b843c749SSergey Zigachev static void gfx_v8_0_ring_emit_de_meta(struct amdgpu_ring *ring)
7490b843c749SSergey Zigachev {
7491b843c749SSergey Zigachev uint64_t de_payload_addr, gds_addr, csa_addr;
7492b843c749SSergey Zigachev int cnt_de;
7493b843c749SSergey Zigachev union {
7494b843c749SSergey Zigachev struct vi_de_ib_state regular;
7495b843c749SSergey Zigachev struct vi_de_ib_state_chained_ib chained;
7496b843c749SSergey Zigachev } de_payload = {};
7497b843c749SSergey Zigachev
7498b843c749SSergey Zigachev csa_addr = amdgpu_csa_vaddr(ring->adev);
7499b843c749SSergey Zigachev gds_addr = csa_addr + 4096;
7500b843c749SSergey Zigachev if (ring->adev->virt.chained_ib_support) {
7501b843c749SSergey Zigachev de_payload.chained.gds_backup_addrlo = lower_32_bits(gds_addr);
7502b843c749SSergey Zigachev de_payload.chained.gds_backup_addrhi = upper_32_bits(gds_addr);
7503b843c749SSergey Zigachev de_payload_addr = csa_addr + offsetof(struct vi_gfx_meta_data_chained_ib, de_payload);
7504b843c749SSergey Zigachev cnt_de = (sizeof(de_payload.chained) >> 2) + 4 - 2;
7505b843c749SSergey Zigachev } else {
7506b843c749SSergey Zigachev de_payload.regular.gds_backup_addrlo = lower_32_bits(gds_addr);
7507b843c749SSergey Zigachev de_payload.regular.gds_backup_addrhi = upper_32_bits(gds_addr);
7508b843c749SSergey Zigachev de_payload_addr = csa_addr + offsetof(struct vi_gfx_meta_data, de_payload);
7509b843c749SSergey Zigachev cnt_de = (sizeof(de_payload.regular) >> 2) + 4 - 2;
7510b843c749SSergey Zigachev }
7511b843c749SSergey Zigachev
7512b843c749SSergey Zigachev amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, cnt_de));
7513b843c749SSergey Zigachev amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
7514b843c749SSergey Zigachev WRITE_DATA_DST_SEL(8) |
7515b843c749SSergey Zigachev WR_CONFIRM) |
7516b843c749SSergey Zigachev WRITE_DATA_CACHE_POLICY(0));
7517b843c749SSergey Zigachev amdgpu_ring_write(ring, lower_32_bits(de_payload_addr));
7518b843c749SSergey Zigachev amdgpu_ring_write(ring, upper_32_bits(de_payload_addr));
7519b843c749SSergey Zigachev amdgpu_ring_write_multiple(ring, (void *)&de_payload, cnt_de - 2);
7520b843c749SSergey Zigachev }
7521