blob: dd8f50f9962f600c6ad147d54d1e0183498b5c8e [file] [log] [blame]
Alex Deucher8cc1a532013-04-09 12:41:24 -04001/*
2 * Copyright 2012 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24#include <linux/firmware.h>
Alex Deucher8cc1a532013-04-09 12:41:24 -040025#include <linux/slab.h>
26#include <linux/module.h>
27#include "drmP.h"
28#include "radeon.h"
Alex Deucher6f2043c2013-04-09 12:43:41 -040029#include "radeon_asic.h"
Alex Deucher8cc1a532013-04-09 12:41:24 -040030#include "cikd.h"
31#include "atom.h"
Alex Deucher841cf442012-12-18 21:47:44 -050032#include "cik_blit_shaders.h"
Alex Deucher8c68e392013-06-21 15:38:37 -040033#include "radeon_ucode.h"
Alex Deucher22c775c2013-07-23 09:41:05 -040034#include "clearstate_ci.h"
Alex Deucher02c81322012-12-18 21:43:07 -050035
36MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin");
37MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
38MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
39MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
40MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
Alex Deucher277babc2014-04-11 11:21:50 -040041MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
Alex Deucher02c81322012-12-18 21:43:07 -050042MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040043MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -040044MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
Alex Deucherf2c6b0f2014-06-25 19:32:36 -040045
46MODULE_FIRMWARE("radeon/bonaire_pfp.bin");
47MODULE_FIRMWARE("radeon/bonaire_me.bin");
48MODULE_FIRMWARE("radeon/bonaire_ce.bin");
49MODULE_FIRMWARE("radeon/bonaire_mec.bin");
50MODULE_FIRMWARE("radeon/bonaire_mc.bin");
51MODULE_FIRMWARE("radeon/bonaire_rlc.bin");
52MODULE_FIRMWARE("radeon/bonaire_sdma.bin");
53MODULE_FIRMWARE("radeon/bonaire_smc.bin");
54
Alex Deucherd4775652013-08-08 16:06:35 -040055MODULE_FIRMWARE("radeon/HAWAII_pfp.bin");
56MODULE_FIRMWARE("radeon/HAWAII_me.bin");
57MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
58MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
59MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
Alex Deucher277babc2014-04-11 11:21:50 -040060MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
Alex Deucherd4775652013-08-08 16:06:35 -040061MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
62MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
63MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
Alex Deucherf2c6b0f2014-06-25 19:32:36 -040064
65MODULE_FIRMWARE("radeon/hawaii_pfp.bin");
66MODULE_FIRMWARE("radeon/hawaii_me.bin");
67MODULE_FIRMWARE("radeon/hawaii_ce.bin");
68MODULE_FIRMWARE("radeon/hawaii_mec.bin");
69MODULE_FIRMWARE("radeon/hawaii_mc.bin");
70MODULE_FIRMWARE("radeon/hawaii_rlc.bin");
71MODULE_FIRMWARE("radeon/hawaii_sdma.bin");
72MODULE_FIRMWARE("radeon/hawaii_smc.bin");
73
Alex Deucher02c81322012-12-18 21:43:07 -050074MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
75MODULE_FIRMWARE("radeon/KAVERI_me.bin");
76MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
77MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
78MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040079MODULE_FIRMWARE("radeon/KAVERI_sdma.bin");
Alex Deucherf2c6b0f2014-06-25 19:32:36 -040080
81MODULE_FIRMWARE("radeon/kaveri_pfp.bin");
82MODULE_FIRMWARE("radeon/kaveri_me.bin");
83MODULE_FIRMWARE("radeon/kaveri_ce.bin");
84MODULE_FIRMWARE("radeon/kaveri_mec.bin");
85MODULE_FIRMWARE("radeon/kaveri_mec2.bin");
86MODULE_FIRMWARE("radeon/kaveri_rlc.bin");
87MODULE_FIRMWARE("radeon/kaveri_sdma.bin");
88
Alex Deucher02c81322012-12-18 21:43:07 -050089MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
90MODULE_FIRMWARE("radeon/KABINI_me.bin");
91MODULE_FIRMWARE("radeon/KABINI_ce.bin");
92MODULE_FIRMWARE("radeon/KABINI_mec.bin");
93MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040094MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
Alex Deucherf2c6b0f2014-06-25 19:32:36 -040095
96MODULE_FIRMWARE("radeon/kabini_pfp.bin");
97MODULE_FIRMWARE("radeon/kabini_me.bin");
98MODULE_FIRMWARE("radeon/kabini_ce.bin");
99MODULE_FIRMWARE("radeon/kabini_mec.bin");
100MODULE_FIRMWARE("radeon/kabini_rlc.bin");
101MODULE_FIRMWARE("radeon/kabini_sdma.bin");
102
Samuel Lif73a9e82014-04-30 18:40:49 -0400103MODULE_FIRMWARE("radeon/MULLINS_pfp.bin");
104MODULE_FIRMWARE("radeon/MULLINS_me.bin");
105MODULE_FIRMWARE("radeon/MULLINS_ce.bin");
106MODULE_FIRMWARE("radeon/MULLINS_mec.bin");
107MODULE_FIRMWARE("radeon/MULLINS_rlc.bin");
108MODULE_FIRMWARE("radeon/MULLINS_sdma.bin");
Alex Deucher02c81322012-12-18 21:43:07 -0500109
Alex Deucherf2c6b0f2014-06-25 19:32:36 -0400110MODULE_FIRMWARE("radeon/mullins_pfp.bin");
111MODULE_FIRMWARE("radeon/mullins_me.bin");
112MODULE_FIRMWARE("radeon/mullins_ce.bin");
113MODULE_FIRMWARE("radeon/mullins_mec.bin");
114MODULE_FIRMWARE("radeon/mullins_rlc.bin");
115MODULE_FIRMWARE("radeon/mullins_sdma.bin");
116
Alex Deuchera59781b2012-11-09 10:45:57 -0500117extern int r600_ih_ring_alloc(struct radeon_device *rdev);
118extern void r600_ih_ring_fini(struct radeon_device *rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -0400119extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
120extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
Alex Deuchercc066712013-04-09 12:59:51 -0400121extern bool evergreen_is_display_hung(struct radeon_device *rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -0400122extern void sumo_rlc_fini(struct radeon_device *rdev);
123extern int sumo_rlc_init(struct radeon_device *rdev);
Alex Deucher1c491652013-04-09 12:45:26 -0400124extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
Alex Deucher866d83d2013-04-15 17:13:29 -0400125extern void si_rlc_reset(struct radeon_device *rdev);
Alex Deucher22c775c2013-07-23 09:41:05 -0400126extern void si_init_uvd_internal_cg(struct radeon_device *rdev);
Alex Deucher65fcf662014-06-02 16:13:21 -0400127static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
Christian König2483b4e2013-08-13 11:56:54 +0200128extern int cik_sdma_resume(struct radeon_device *rdev);
129extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
130extern void cik_sdma_fini(struct radeon_device *rdev);
Alex Deuchera1d6f972013-09-06 12:33:04 -0400131extern void vce_v2_0_enable_mgcg(struct radeon_device *rdev, bool enable);
Alex Deuchercc066712013-04-09 12:59:51 -0400132static void cik_rlc_stop(struct radeon_device *rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -0400133static void cik_pcie_gen3_enable(struct radeon_device *rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -0400134static void cik_program_aspm(struct radeon_device *rdev);
Alex Deucher22c775c2013-07-23 09:41:05 -0400135static void cik_init_pg(struct radeon_device *rdev);
136static void cik_init_cg(struct radeon_device *rdev);
Alex Deucherfb2c7f42013-10-02 14:54:44 -0400137static void cik_fini_pg(struct radeon_device *rdev);
138static void cik_fini_cg(struct radeon_device *rdev);
Alex Deucher4214faf2013-09-03 10:17:13 -0400139static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
140 bool enable);
Alex Deucher6f2043c2013-04-09 12:43:41 -0400141
Alex Deucher286d9cc2013-06-21 15:50:47 -0400142/* get temperature in millidegrees */
143int ci_get_temp(struct radeon_device *rdev)
144{
145 u32 temp;
146 int actual_temp = 0;
147
148 temp = (RREG32_SMC(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
149 CTF_TEMP_SHIFT;
150
151 if (temp & 0x200)
152 actual_temp = 255;
153 else
154 actual_temp = temp & 0x1ff;
155
156 actual_temp = actual_temp * 1000;
157
158 return actual_temp;
159}
160
161/* get temperature in millidegrees */
162int kv_get_temp(struct radeon_device *rdev)
163{
164 u32 temp;
165 int actual_temp = 0;
166
167 temp = RREG32_SMC(0xC0300E0C);
168
169 if (temp)
170 actual_temp = (temp / 8) - 49;
171 else
172 actual_temp = 0;
173
174 actual_temp = actual_temp * 1000;
175
176 return actual_temp;
177}
Alex Deucher8cc1a532013-04-09 12:41:24 -0400178
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400179/*
180 * Indirect registers accessor
181 */
182u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
183{
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400184 unsigned long flags;
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400185 u32 r;
186
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400187 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400188 WREG32(PCIE_INDEX, reg);
189 (void)RREG32(PCIE_INDEX);
190 r = RREG32(PCIE_DATA);
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400191 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400192 return r;
193}
194
195void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
196{
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400197 unsigned long flags;
198
199 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400200 WREG32(PCIE_INDEX, reg);
201 (void)RREG32(PCIE_INDEX);
202 WREG32(PCIE_DATA, v);
203 (void)RREG32(PCIE_DATA);
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400204 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400205}
206
Alex Deucher22c775c2013-07-23 09:41:05 -0400207static const u32 spectre_rlc_save_restore_register_list[] =
208{
209 (0x0e00 << 16) | (0xc12c >> 2),
210 0x00000000,
211 (0x0e00 << 16) | (0xc140 >> 2),
212 0x00000000,
213 (0x0e00 << 16) | (0xc150 >> 2),
214 0x00000000,
215 (0x0e00 << 16) | (0xc15c >> 2),
216 0x00000000,
217 (0x0e00 << 16) | (0xc168 >> 2),
218 0x00000000,
219 (0x0e00 << 16) | (0xc170 >> 2),
220 0x00000000,
221 (0x0e00 << 16) | (0xc178 >> 2),
222 0x00000000,
223 (0x0e00 << 16) | (0xc204 >> 2),
224 0x00000000,
225 (0x0e00 << 16) | (0xc2b4 >> 2),
226 0x00000000,
227 (0x0e00 << 16) | (0xc2b8 >> 2),
228 0x00000000,
229 (0x0e00 << 16) | (0xc2bc >> 2),
230 0x00000000,
231 (0x0e00 << 16) | (0xc2c0 >> 2),
232 0x00000000,
233 (0x0e00 << 16) | (0x8228 >> 2),
234 0x00000000,
235 (0x0e00 << 16) | (0x829c >> 2),
236 0x00000000,
237 (0x0e00 << 16) | (0x869c >> 2),
238 0x00000000,
239 (0x0600 << 16) | (0x98f4 >> 2),
240 0x00000000,
241 (0x0e00 << 16) | (0x98f8 >> 2),
242 0x00000000,
243 (0x0e00 << 16) | (0x9900 >> 2),
244 0x00000000,
245 (0x0e00 << 16) | (0xc260 >> 2),
246 0x00000000,
247 (0x0e00 << 16) | (0x90e8 >> 2),
248 0x00000000,
249 (0x0e00 << 16) | (0x3c000 >> 2),
250 0x00000000,
251 (0x0e00 << 16) | (0x3c00c >> 2),
252 0x00000000,
253 (0x0e00 << 16) | (0x8c1c >> 2),
254 0x00000000,
255 (0x0e00 << 16) | (0x9700 >> 2),
256 0x00000000,
257 (0x0e00 << 16) | (0xcd20 >> 2),
258 0x00000000,
259 (0x4e00 << 16) | (0xcd20 >> 2),
260 0x00000000,
261 (0x5e00 << 16) | (0xcd20 >> 2),
262 0x00000000,
263 (0x6e00 << 16) | (0xcd20 >> 2),
264 0x00000000,
265 (0x7e00 << 16) | (0xcd20 >> 2),
266 0x00000000,
267 (0x8e00 << 16) | (0xcd20 >> 2),
268 0x00000000,
269 (0x9e00 << 16) | (0xcd20 >> 2),
270 0x00000000,
271 (0xae00 << 16) | (0xcd20 >> 2),
272 0x00000000,
273 (0xbe00 << 16) | (0xcd20 >> 2),
274 0x00000000,
275 (0x0e00 << 16) | (0x89bc >> 2),
276 0x00000000,
277 (0x0e00 << 16) | (0x8900 >> 2),
278 0x00000000,
279 0x3,
280 (0x0e00 << 16) | (0xc130 >> 2),
281 0x00000000,
282 (0x0e00 << 16) | (0xc134 >> 2),
283 0x00000000,
284 (0x0e00 << 16) | (0xc1fc >> 2),
285 0x00000000,
286 (0x0e00 << 16) | (0xc208 >> 2),
287 0x00000000,
288 (0x0e00 << 16) | (0xc264 >> 2),
289 0x00000000,
290 (0x0e00 << 16) | (0xc268 >> 2),
291 0x00000000,
292 (0x0e00 << 16) | (0xc26c >> 2),
293 0x00000000,
294 (0x0e00 << 16) | (0xc270 >> 2),
295 0x00000000,
296 (0x0e00 << 16) | (0xc274 >> 2),
297 0x00000000,
298 (0x0e00 << 16) | (0xc278 >> 2),
299 0x00000000,
300 (0x0e00 << 16) | (0xc27c >> 2),
301 0x00000000,
302 (0x0e00 << 16) | (0xc280 >> 2),
303 0x00000000,
304 (0x0e00 << 16) | (0xc284 >> 2),
305 0x00000000,
306 (0x0e00 << 16) | (0xc288 >> 2),
307 0x00000000,
308 (0x0e00 << 16) | (0xc28c >> 2),
309 0x00000000,
310 (0x0e00 << 16) | (0xc290 >> 2),
311 0x00000000,
312 (0x0e00 << 16) | (0xc294 >> 2),
313 0x00000000,
314 (0x0e00 << 16) | (0xc298 >> 2),
315 0x00000000,
316 (0x0e00 << 16) | (0xc29c >> 2),
317 0x00000000,
318 (0x0e00 << 16) | (0xc2a0 >> 2),
319 0x00000000,
320 (0x0e00 << 16) | (0xc2a4 >> 2),
321 0x00000000,
322 (0x0e00 << 16) | (0xc2a8 >> 2),
323 0x00000000,
324 (0x0e00 << 16) | (0xc2ac >> 2),
325 0x00000000,
326 (0x0e00 << 16) | (0xc2b0 >> 2),
327 0x00000000,
328 (0x0e00 << 16) | (0x301d0 >> 2),
329 0x00000000,
330 (0x0e00 << 16) | (0x30238 >> 2),
331 0x00000000,
332 (0x0e00 << 16) | (0x30250 >> 2),
333 0x00000000,
334 (0x0e00 << 16) | (0x30254 >> 2),
335 0x00000000,
336 (0x0e00 << 16) | (0x30258 >> 2),
337 0x00000000,
338 (0x0e00 << 16) | (0x3025c >> 2),
339 0x00000000,
340 (0x4e00 << 16) | (0xc900 >> 2),
341 0x00000000,
342 (0x5e00 << 16) | (0xc900 >> 2),
343 0x00000000,
344 (0x6e00 << 16) | (0xc900 >> 2),
345 0x00000000,
346 (0x7e00 << 16) | (0xc900 >> 2),
347 0x00000000,
348 (0x8e00 << 16) | (0xc900 >> 2),
349 0x00000000,
350 (0x9e00 << 16) | (0xc900 >> 2),
351 0x00000000,
352 (0xae00 << 16) | (0xc900 >> 2),
353 0x00000000,
354 (0xbe00 << 16) | (0xc900 >> 2),
355 0x00000000,
356 (0x4e00 << 16) | (0xc904 >> 2),
357 0x00000000,
358 (0x5e00 << 16) | (0xc904 >> 2),
359 0x00000000,
360 (0x6e00 << 16) | (0xc904 >> 2),
361 0x00000000,
362 (0x7e00 << 16) | (0xc904 >> 2),
363 0x00000000,
364 (0x8e00 << 16) | (0xc904 >> 2),
365 0x00000000,
366 (0x9e00 << 16) | (0xc904 >> 2),
367 0x00000000,
368 (0xae00 << 16) | (0xc904 >> 2),
369 0x00000000,
370 (0xbe00 << 16) | (0xc904 >> 2),
371 0x00000000,
372 (0x4e00 << 16) | (0xc908 >> 2),
373 0x00000000,
374 (0x5e00 << 16) | (0xc908 >> 2),
375 0x00000000,
376 (0x6e00 << 16) | (0xc908 >> 2),
377 0x00000000,
378 (0x7e00 << 16) | (0xc908 >> 2),
379 0x00000000,
380 (0x8e00 << 16) | (0xc908 >> 2),
381 0x00000000,
382 (0x9e00 << 16) | (0xc908 >> 2),
383 0x00000000,
384 (0xae00 << 16) | (0xc908 >> 2),
385 0x00000000,
386 (0xbe00 << 16) | (0xc908 >> 2),
387 0x00000000,
388 (0x4e00 << 16) | (0xc90c >> 2),
389 0x00000000,
390 (0x5e00 << 16) | (0xc90c >> 2),
391 0x00000000,
392 (0x6e00 << 16) | (0xc90c >> 2),
393 0x00000000,
394 (0x7e00 << 16) | (0xc90c >> 2),
395 0x00000000,
396 (0x8e00 << 16) | (0xc90c >> 2),
397 0x00000000,
398 (0x9e00 << 16) | (0xc90c >> 2),
399 0x00000000,
400 (0xae00 << 16) | (0xc90c >> 2),
401 0x00000000,
402 (0xbe00 << 16) | (0xc90c >> 2),
403 0x00000000,
404 (0x4e00 << 16) | (0xc910 >> 2),
405 0x00000000,
406 (0x5e00 << 16) | (0xc910 >> 2),
407 0x00000000,
408 (0x6e00 << 16) | (0xc910 >> 2),
409 0x00000000,
410 (0x7e00 << 16) | (0xc910 >> 2),
411 0x00000000,
412 (0x8e00 << 16) | (0xc910 >> 2),
413 0x00000000,
414 (0x9e00 << 16) | (0xc910 >> 2),
415 0x00000000,
416 (0xae00 << 16) | (0xc910 >> 2),
417 0x00000000,
418 (0xbe00 << 16) | (0xc910 >> 2),
419 0x00000000,
420 (0x0e00 << 16) | (0xc99c >> 2),
421 0x00000000,
422 (0x0e00 << 16) | (0x9834 >> 2),
423 0x00000000,
424 (0x0000 << 16) | (0x30f00 >> 2),
425 0x00000000,
426 (0x0001 << 16) | (0x30f00 >> 2),
427 0x00000000,
428 (0x0000 << 16) | (0x30f04 >> 2),
429 0x00000000,
430 (0x0001 << 16) | (0x30f04 >> 2),
431 0x00000000,
432 (0x0000 << 16) | (0x30f08 >> 2),
433 0x00000000,
434 (0x0001 << 16) | (0x30f08 >> 2),
435 0x00000000,
436 (0x0000 << 16) | (0x30f0c >> 2),
437 0x00000000,
438 (0x0001 << 16) | (0x30f0c >> 2),
439 0x00000000,
440 (0x0600 << 16) | (0x9b7c >> 2),
441 0x00000000,
442 (0x0e00 << 16) | (0x8a14 >> 2),
443 0x00000000,
444 (0x0e00 << 16) | (0x8a18 >> 2),
445 0x00000000,
446 (0x0600 << 16) | (0x30a00 >> 2),
447 0x00000000,
448 (0x0e00 << 16) | (0x8bf0 >> 2),
449 0x00000000,
450 (0x0e00 << 16) | (0x8bcc >> 2),
451 0x00000000,
452 (0x0e00 << 16) | (0x8b24 >> 2),
453 0x00000000,
454 (0x0e00 << 16) | (0x30a04 >> 2),
455 0x00000000,
456 (0x0600 << 16) | (0x30a10 >> 2),
457 0x00000000,
458 (0x0600 << 16) | (0x30a14 >> 2),
459 0x00000000,
460 (0x0600 << 16) | (0x30a18 >> 2),
461 0x00000000,
462 (0x0600 << 16) | (0x30a2c >> 2),
463 0x00000000,
464 (0x0e00 << 16) | (0xc700 >> 2),
465 0x00000000,
466 (0x0e00 << 16) | (0xc704 >> 2),
467 0x00000000,
468 (0x0e00 << 16) | (0xc708 >> 2),
469 0x00000000,
470 (0x0e00 << 16) | (0xc768 >> 2),
471 0x00000000,
472 (0x0400 << 16) | (0xc770 >> 2),
473 0x00000000,
474 (0x0400 << 16) | (0xc774 >> 2),
475 0x00000000,
476 (0x0400 << 16) | (0xc778 >> 2),
477 0x00000000,
478 (0x0400 << 16) | (0xc77c >> 2),
479 0x00000000,
480 (0x0400 << 16) | (0xc780 >> 2),
481 0x00000000,
482 (0x0400 << 16) | (0xc784 >> 2),
483 0x00000000,
484 (0x0400 << 16) | (0xc788 >> 2),
485 0x00000000,
486 (0x0400 << 16) | (0xc78c >> 2),
487 0x00000000,
488 (0x0400 << 16) | (0xc798 >> 2),
489 0x00000000,
490 (0x0400 << 16) | (0xc79c >> 2),
491 0x00000000,
492 (0x0400 << 16) | (0xc7a0 >> 2),
493 0x00000000,
494 (0x0400 << 16) | (0xc7a4 >> 2),
495 0x00000000,
496 (0x0400 << 16) | (0xc7a8 >> 2),
497 0x00000000,
498 (0x0400 << 16) | (0xc7ac >> 2),
499 0x00000000,
500 (0x0400 << 16) | (0xc7b0 >> 2),
501 0x00000000,
502 (0x0400 << 16) | (0xc7b4 >> 2),
503 0x00000000,
504 (0x0e00 << 16) | (0x9100 >> 2),
505 0x00000000,
506 (0x0e00 << 16) | (0x3c010 >> 2),
507 0x00000000,
508 (0x0e00 << 16) | (0x92a8 >> 2),
509 0x00000000,
510 (0x0e00 << 16) | (0x92ac >> 2),
511 0x00000000,
512 (0x0e00 << 16) | (0x92b4 >> 2),
513 0x00000000,
514 (0x0e00 << 16) | (0x92b8 >> 2),
515 0x00000000,
516 (0x0e00 << 16) | (0x92bc >> 2),
517 0x00000000,
518 (0x0e00 << 16) | (0x92c0 >> 2),
519 0x00000000,
520 (0x0e00 << 16) | (0x92c4 >> 2),
521 0x00000000,
522 (0x0e00 << 16) | (0x92c8 >> 2),
523 0x00000000,
524 (0x0e00 << 16) | (0x92cc >> 2),
525 0x00000000,
526 (0x0e00 << 16) | (0x92d0 >> 2),
527 0x00000000,
528 (0x0e00 << 16) | (0x8c00 >> 2),
529 0x00000000,
530 (0x0e00 << 16) | (0x8c04 >> 2),
531 0x00000000,
532 (0x0e00 << 16) | (0x8c20 >> 2),
533 0x00000000,
534 (0x0e00 << 16) | (0x8c38 >> 2),
535 0x00000000,
536 (0x0e00 << 16) | (0x8c3c >> 2),
537 0x00000000,
538 (0x0e00 << 16) | (0xae00 >> 2),
539 0x00000000,
540 (0x0e00 << 16) | (0x9604 >> 2),
541 0x00000000,
542 (0x0e00 << 16) | (0xac08 >> 2),
543 0x00000000,
544 (0x0e00 << 16) | (0xac0c >> 2),
545 0x00000000,
546 (0x0e00 << 16) | (0xac10 >> 2),
547 0x00000000,
548 (0x0e00 << 16) | (0xac14 >> 2),
549 0x00000000,
550 (0x0e00 << 16) | (0xac58 >> 2),
551 0x00000000,
552 (0x0e00 << 16) | (0xac68 >> 2),
553 0x00000000,
554 (0x0e00 << 16) | (0xac6c >> 2),
555 0x00000000,
556 (0x0e00 << 16) | (0xac70 >> 2),
557 0x00000000,
558 (0x0e00 << 16) | (0xac74 >> 2),
559 0x00000000,
560 (0x0e00 << 16) | (0xac78 >> 2),
561 0x00000000,
562 (0x0e00 << 16) | (0xac7c >> 2),
563 0x00000000,
564 (0x0e00 << 16) | (0xac80 >> 2),
565 0x00000000,
566 (0x0e00 << 16) | (0xac84 >> 2),
567 0x00000000,
568 (0x0e00 << 16) | (0xac88 >> 2),
569 0x00000000,
570 (0x0e00 << 16) | (0xac8c >> 2),
571 0x00000000,
572 (0x0e00 << 16) | (0x970c >> 2),
573 0x00000000,
574 (0x0e00 << 16) | (0x9714 >> 2),
575 0x00000000,
576 (0x0e00 << 16) | (0x9718 >> 2),
577 0x00000000,
578 (0x0e00 << 16) | (0x971c >> 2),
579 0x00000000,
580 (0x0e00 << 16) | (0x31068 >> 2),
581 0x00000000,
582 (0x4e00 << 16) | (0x31068 >> 2),
583 0x00000000,
584 (0x5e00 << 16) | (0x31068 >> 2),
585 0x00000000,
586 (0x6e00 << 16) | (0x31068 >> 2),
587 0x00000000,
588 (0x7e00 << 16) | (0x31068 >> 2),
589 0x00000000,
590 (0x8e00 << 16) | (0x31068 >> 2),
591 0x00000000,
592 (0x9e00 << 16) | (0x31068 >> 2),
593 0x00000000,
594 (0xae00 << 16) | (0x31068 >> 2),
595 0x00000000,
596 (0xbe00 << 16) | (0x31068 >> 2),
597 0x00000000,
598 (0x0e00 << 16) | (0xcd10 >> 2),
599 0x00000000,
600 (0x0e00 << 16) | (0xcd14 >> 2),
601 0x00000000,
602 (0x0e00 << 16) | (0x88b0 >> 2),
603 0x00000000,
604 (0x0e00 << 16) | (0x88b4 >> 2),
605 0x00000000,
606 (0x0e00 << 16) | (0x88b8 >> 2),
607 0x00000000,
608 (0x0e00 << 16) | (0x88bc >> 2),
609 0x00000000,
610 (0x0400 << 16) | (0x89c0 >> 2),
611 0x00000000,
612 (0x0e00 << 16) | (0x88c4 >> 2),
613 0x00000000,
614 (0x0e00 << 16) | (0x88c8 >> 2),
615 0x00000000,
616 (0x0e00 << 16) | (0x88d0 >> 2),
617 0x00000000,
618 (0x0e00 << 16) | (0x88d4 >> 2),
619 0x00000000,
620 (0x0e00 << 16) | (0x88d8 >> 2),
621 0x00000000,
622 (0x0e00 << 16) | (0x8980 >> 2),
623 0x00000000,
624 (0x0e00 << 16) | (0x30938 >> 2),
625 0x00000000,
626 (0x0e00 << 16) | (0x3093c >> 2),
627 0x00000000,
628 (0x0e00 << 16) | (0x30940 >> 2),
629 0x00000000,
630 (0x0e00 << 16) | (0x89a0 >> 2),
631 0x00000000,
632 (0x0e00 << 16) | (0x30900 >> 2),
633 0x00000000,
634 (0x0e00 << 16) | (0x30904 >> 2),
635 0x00000000,
636 (0x0e00 << 16) | (0x89b4 >> 2),
637 0x00000000,
638 (0x0e00 << 16) | (0x3c210 >> 2),
639 0x00000000,
640 (0x0e00 << 16) | (0x3c214 >> 2),
641 0x00000000,
642 (0x0e00 << 16) | (0x3c218 >> 2),
643 0x00000000,
644 (0x0e00 << 16) | (0x8904 >> 2),
645 0x00000000,
646 0x5,
647 (0x0e00 << 16) | (0x8c28 >> 2),
648 (0x0e00 << 16) | (0x8c2c >> 2),
649 (0x0e00 << 16) | (0x8c30 >> 2),
650 (0x0e00 << 16) | (0x8c34 >> 2),
651 (0x0e00 << 16) | (0x9600 >> 2),
652};
653
654static const u32 kalindi_rlc_save_restore_register_list[] =
655{
656 (0x0e00 << 16) | (0xc12c >> 2),
657 0x00000000,
658 (0x0e00 << 16) | (0xc140 >> 2),
659 0x00000000,
660 (0x0e00 << 16) | (0xc150 >> 2),
661 0x00000000,
662 (0x0e00 << 16) | (0xc15c >> 2),
663 0x00000000,
664 (0x0e00 << 16) | (0xc168 >> 2),
665 0x00000000,
666 (0x0e00 << 16) | (0xc170 >> 2),
667 0x00000000,
668 (0x0e00 << 16) | (0xc204 >> 2),
669 0x00000000,
670 (0x0e00 << 16) | (0xc2b4 >> 2),
671 0x00000000,
672 (0x0e00 << 16) | (0xc2b8 >> 2),
673 0x00000000,
674 (0x0e00 << 16) | (0xc2bc >> 2),
675 0x00000000,
676 (0x0e00 << 16) | (0xc2c0 >> 2),
677 0x00000000,
678 (0x0e00 << 16) | (0x8228 >> 2),
679 0x00000000,
680 (0x0e00 << 16) | (0x829c >> 2),
681 0x00000000,
682 (0x0e00 << 16) | (0x869c >> 2),
683 0x00000000,
684 (0x0600 << 16) | (0x98f4 >> 2),
685 0x00000000,
686 (0x0e00 << 16) | (0x98f8 >> 2),
687 0x00000000,
688 (0x0e00 << 16) | (0x9900 >> 2),
689 0x00000000,
690 (0x0e00 << 16) | (0xc260 >> 2),
691 0x00000000,
692 (0x0e00 << 16) | (0x90e8 >> 2),
693 0x00000000,
694 (0x0e00 << 16) | (0x3c000 >> 2),
695 0x00000000,
696 (0x0e00 << 16) | (0x3c00c >> 2),
697 0x00000000,
698 (0x0e00 << 16) | (0x8c1c >> 2),
699 0x00000000,
700 (0x0e00 << 16) | (0x9700 >> 2),
701 0x00000000,
702 (0x0e00 << 16) | (0xcd20 >> 2),
703 0x00000000,
704 (0x4e00 << 16) | (0xcd20 >> 2),
705 0x00000000,
706 (0x5e00 << 16) | (0xcd20 >> 2),
707 0x00000000,
708 (0x6e00 << 16) | (0xcd20 >> 2),
709 0x00000000,
710 (0x7e00 << 16) | (0xcd20 >> 2),
711 0x00000000,
712 (0x0e00 << 16) | (0x89bc >> 2),
713 0x00000000,
714 (0x0e00 << 16) | (0x8900 >> 2),
715 0x00000000,
716 0x3,
717 (0x0e00 << 16) | (0xc130 >> 2),
718 0x00000000,
719 (0x0e00 << 16) | (0xc134 >> 2),
720 0x00000000,
721 (0x0e00 << 16) | (0xc1fc >> 2),
722 0x00000000,
723 (0x0e00 << 16) | (0xc208 >> 2),
724 0x00000000,
725 (0x0e00 << 16) | (0xc264 >> 2),
726 0x00000000,
727 (0x0e00 << 16) | (0xc268 >> 2),
728 0x00000000,
729 (0x0e00 << 16) | (0xc26c >> 2),
730 0x00000000,
731 (0x0e00 << 16) | (0xc270 >> 2),
732 0x00000000,
733 (0x0e00 << 16) | (0xc274 >> 2),
734 0x00000000,
735 (0x0e00 << 16) | (0xc28c >> 2),
736 0x00000000,
737 (0x0e00 << 16) | (0xc290 >> 2),
738 0x00000000,
739 (0x0e00 << 16) | (0xc294 >> 2),
740 0x00000000,
741 (0x0e00 << 16) | (0xc298 >> 2),
742 0x00000000,
743 (0x0e00 << 16) | (0xc2a0 >> 2),
744 0x00000000,
745 (0x0e00 << 16) | (0xc2a4 >> 2),
746 0x00000000,
747 (0x0e00 << 16) | (0xc2a8 >> 2),
748 0x00000000,
749 (0x0e00 << 16) | (0xc2ac >> 2),
750 0x00000000,
751 (0x0e00 << 16) | (0x301d0 >> 2),
752 0x00000000,
753 (0x0e00 << 16) | (0x30238 >> 2),
754 0x00000000,
755 (0x0e00 << 16) | (0x30250 >> 2),
756 0x00000000,
757 (0x0e00 << 16) | (0x30254 >> 2),
758 0x00000000,
759 (0x0e00 << 16) | (0x30258 >> 2),
760 0x00000000,
761 (0x0e00 << 16) | (0x3025c >> 2),
762 0x00000000,
763 (0x4e00 << 16) | (0xc900 >> 2),
764 0x00000000,
765 (0x5e00 << 16) | (0xc900 >> 2),
766 0x00000000,
767 (0x6e00 << 16) | (0xc900 >> 2),
768 0x00000000,
769 (0x7e00 << 16) | (0xc900 >> 2),
770 0x00000000,
771 (0x4e00 << 16) | (0xc904 >> 2),
772 0x00000000,
773 (0x5e00 << 16) | (0xc904 >> 2),
774 0x00000000,
775 (0x6e00 << 16) | (0xc904 >> 2),
776 0x00000000,
777 (0x7e00 << 16) | (0xc904 >> 2),
778 0x00000000,
779 (0x4e00 << 16) | (0xc908 >> 2),
780 0x00000000,
781 (0x5e00 << 16) | (0xc908 >> 2),
782 0x00000000,
783 (0x6e00 << 16) | (0xc908 >> 2),
784 0x00000000,
785 (0x7e00 << 16) | (0xc908 >> 2),
786 0x00000000,
787 (0x4e00 << 16) | (0xc90c >> 2),
788 0x00000000,
789 (0x5e00 << 16) | (0xc90c >> 2),
790 0x00000000,
791 (0x6e00 << 16) | (0xc90c >> 2),
792 0x00000000,
793 (0x7e00 << 16) | (0xc90c >> 2),
794 0x00000000,
795 (0x4e00 << 16) | (0xc910 >> 2),
796 0x00000000,
797 (0x5e00 << 16) | (0xc910 >> 2),
798 0x00000000,
799 (0x6e00 << 16) | (0xc910 >> 2),
800 0x00000000,
801 (0x7e00 << 16) | (0xc910 >> 2),
802 0x00000000,
803 (0x0e00 << 16) | (0xc99c >> 2),
804 0x00000000,
805 (0x0e00 << 16) | (0x9834 >> 2),
806 0x00000000,
807 (0x0000 << 16) | (0x30f00 >> 2),
808 0x00000000,
809 (0x0000 << 16) | (0x30f04 >> 2),
810 0x00000000,
811 (0x0000 << 16) | (0x30f08 >> 2),
812 0x00000000,
813 (0x0000 << 16) | (0x30f0c >> 2),
814 0x00000000,
815 (0x0600 << 16) | (0x9b7c >> 2),
816 0x00000000,
817 (0x0e00 << 16) | (0x8a14 >> 2),
818 0x00000000,
819 (0x0e00 << 16) | (0x8a18 >> 2),
820 0x00000000,
821 (0x0600 << 16) | (0x30a00 >> 2),
822 0x00000000,
823 (0x0e00 << 16) | (0x8bf0 >> 2),
824 0x00000000,
825 (0x0e00 << 16) | (0x8bcc >> 2),
826 0x00000000,
827 (0x0e00 << 16) | (0x8b24 >> 2),
828 0x00000000,
829 (0x0e00 << 16) | (0x30a04 >> 2),
830 0x00000000,
831 (0x0600 << 16) | (0x30a10 >> 2),
832 0x00000000,
833 (0x0600 << 16) | (0x30a14 >> 2),
834 0x00000000,
835 (0x0600 << 16) | (0x30a18 >> 2),
836 0x00000000,
837 (0x0600 << 16) | (0x30a2c >> 2),
838 0x00000000,
839 (0x0e00 << 16) | (0xc700 >> 2),
840 0x00000000,
841 (0x0e00 << 16) | (0xc704 >> 2),
842 0x00000000,
843 (0x0e00 << 16) | (0xc708 >> 2),
844 0x00000000,
845 (0x0e00 << 16) | (0xc768 >> 2),
846 0x00000000,
847 (0x0400 << 16) | (0xc770 >> 2),
848 0x00000000,
849 (0x0400 << 16) | (0xc774 >> 2),
850 0x00000000,
851 (0x0400 << 16) | (0xc798 >> 2),
852 0x00000000,
853 (0x0400 << 16) | (0xc79c >> 2),
854 0x00000000,
855 (0x0e00 << 16) | (0x9100 >> 2),
856 0x00000000,
857 (0x0e00 << 16) | (0x3c010 >> 2),
858 0x00000000,
859 (0x0e00 << 16) | (0x8c00 >> 2),
860 0x00000000,
861 (0x0e00 << 16) | (0x8c04 >> 2),
862 0x00000000,
863 (0x0e00 << 16) | (0x8c20 >> 2),
864 0x00000000,
865 (0x0e00 << 16) | (0x8c38 >> 2),
866 0x00000000,
867 (0x0e00 << 16) | (0x8c3c >> 2),
868 0x00000000,
869 (0x0e00 << 16) | (0xae00 >> 2),
870 0x00000000,
871 (0x0e00 << 16) | (0x9604 >> 2),
872 0x00000000,
873 (0x0e00 << 16) | (0xac08 >> 2),
874 0x00000000,
875 (0x0e00 << 16) | (0xac0c >> 2),
876 0x00000000,
877 (0x0e00 << 16) | (0xac10 >> 2),
878 0x00000000,
879 (0x0e00 << 16) | (0xac14 >> 2),
880 0x00000000,
881 (0x0e00 << 16) | (0xac58 >> 2),
882 0x00000000,
883 (0x0e00 << 16) | (0xac68 >> 2),
884 0x00000000,
885 (0x0e00 << 16) | (0xac6c >> 2),
886 0x00000000,
887 (0x0e00 << 16) | (0xac70 >> 2),
888 0x00000000,
889 (0x0e00 << 16) | (0xac74 >> 2),
890 0x00000000,
891 (0x0e00 << 16) | (0xac78 >> 2),
892 0x00000000,
893 (0x0e00 << 16) | (0xac7c >> 2),
894 0x00000000,
895 (0x0e00 << 16) | (0xac80 >> 2),
896 0x00000000,
897 (0x0e00 << 16) | (0xac84 >> 2),
898 0x00000000,
899 (0x0e00 << 16) | (0xac88 >> 2),
900 0x00000000,
901 (0x0e00 << 16) | (0xac8c >> 2),
902 0x00000000,
903 (0x0e00 << 16) | (0x970c >> 2),
904 0x00000000,
905 (0x0e00 << 16) | (0x9714 >> 2),
906 0x00000000,
907 (0x0e00 << 16) | (0x9718 >> 2),
908 0x00000000,
909 (0x0e00 << 16) | (0x971c >> 2),
910 0x00000000,
911 (0x0e00 << 16) | (0x31068 >> 2),
912 0x00000000,
913 (0x4e00 << 16) | (0x31068 >> 2),
914 0x00000000,
915 (0x5e00 << 16) | (0x31068 >> 2),
916 0x00000000,
917 (0x6e00 << 16) | (0x31068 >> 2),
918 0x00000000,
919 (0x7e00 << 16) | (0x31068 >> 2),
920 0x00000000,
921 (0x0e00 << 16) | (0xcd10 >> 2),
922 0x00000000,
923 (0x0e00 << 16) | (0xcd14 >> 2),
924 0x00000000,
925 (0x0e00 << 16) | (0x88b0 >> 2),
926 0x00000000,
927 (0x0e00 << 16) | (0x88b4 >> 2),
928 0x00000000,
929 (0x0e00 << 16) | (0x88b8 >> 2),
930 0x00000000,
931 (0x0e00 << 16) | (0x88bc >> 2),
932 0x00000000,
933 (0x0400 << 16) | (0x89c0 >> 2),
934 0x00000000,
935 (0x0e00 << 16) | (0x88c4 >> 2),
936 0x00000000,
937 (0x0e00 << 16) | (0x88c8 >> 2),
938 0x00000000,
939 (0x0e00 << 16) | (0x88d0 >> 2),
940 0x00000000,
941 (0x0e00 << 16) | (0x88d4 >> 2),
942 0x00000000,
943 (0x0e00 << 16) | (0x88d8 >> 2),
944 0x00000000,
945 (0x0e00 << 16) | (0x8980 >> 2),
946 0x00000000,
947 (0x0e00 << 16) | (0x30938 >> 2),
948 0x00000000,
949 (0x0e00 << 16) | (0x3093c >> 2),
950 0x00000000,
951 (0x0e00 << 16) | (0x30940 >> 2),
952 0x00000000,
953 (0x0e00 << 16) | (0x89a0 >> 2),
954 0x00000000,
955 (0x0e00 << 16) | (0x30900 >> 2),
956 0x00000000,
957 (0x0e00 << 16) | (0x30904 >> 2),
958 0x00000000,
959 (0x0e00 << 16) | (0x89b4 >> 2),
960 0x00000000,
961 (0x0e00 << 16) | (0x3e1fc >> 2),
962 0x00000000,
963 (0x0e00 << 16) | (0x3c210 >> 2),
964 0x00000000,
965 (0x0e00 << 16) | (0x3c214 >> 2),
966 0x00000000,
967 (0x0e00 << 16) | (0x3c218 >> 2),
968 0x00000000,
969 (0x0e00 << 16) | (0x8904 >> 2),
970 0x00000000,
971 0x5,
972 (0x0e00 << 16) | (0x8c28 >> 2),
973 (0x0e00 << 16) | (0x8c2c >> 2),
974 (0x0e00 << 16) | (0x8c30 >> 2),
975 (0x0e00 << 16) | (0x8c34 >> 2),
976 (0x0e00 << 16) | (0x9600 >> 2),
977};
978
Alex Deucher0aafd312013-04-09 14:43:30 -0400979static const u32 bonaire_golden_spm_registers[] =
980{
981 0x30800, 0xe0ffffff, 0xe0000000
982};
983
984static const u32 bonaire_golden_common_registers[] =
985{
986 0xc770, 0xffffffff, 0x00000800,
987 0xc774, 0xffffffff, 0x00000800,
988 0xc798, 0xffffffff, 0x00007fbf,
989 0xc79c, 0xffffffff, 0x00007faf
990};
991
992static const u32 bonaire_golden_registers[] =
993{
994 0x3354, 0x00000333, 0x00000333,
995 0x3350, 0x000c0fc0, 0x00040200,
996 0x9a10, 0x00010000, 0x00058208,
997 0x3c000, 0xffff1fff, 0x00140000,
998 0x3c200, 0xfdfc0fff, 0x00000100,
999 0x3c234, 0x40000000, 0x40000200,
1000 0x9830, 0xffffffff, 0x00000000,
1001 0x9834, 0xf00fffff, 0x00000400,
1002 0x9838, 0x0002021c, 0x00020200,
1003 0xc78, 0x00000080, 0x00000000,
1004 0x5bb0, 0x000000f0, 0x00000070,
1005 0x5bc0, 0xf0311fff, 0x80300000,
1006 0x98f8, 0x73773777, 0x12010001,
1007 0x350c, 0x00810000, 0x408af000,
1008 0x7030, 0x31000111, 0x00000011,
1009 0x2f48, 0x73773777, 0x12010001,
1010 0x220c, 0x00007fb6, 0x0021a1b1,
1011 0x2210, 0x00007fb6, 0x002021b1,
1012 0x2180, 0x00007fb6, 0x00002191,
1013 0x2218, 0x00007fb6, 0x002121b1,
1014 0x221c, 0x00007fb6, 0x002021b1,
1015 0x21dc, 0x00007fb6, 0x00002191,
1016 0x21e0, 0x00007fb6, 0x00002191,
1017 0x3628, 0x0000003f, 0x0000000a,
1018 0x362c, 0x0000003f, 0x0000000a,
1019 0x2ae4, 0x00073ffe, 0x000022a2,
1020 0x240c, 0x000007ff, 0x00000000,
1021 0x8a14, 0xf000003f, 0x00000007,
1022 0x8bf0, 0x00002001, 0x00000001,
1023 0x8b24, 0xffffffff, 0x00ffffff,
1024 0x30a04, 0x0000ff0f, 0x00000000,
1025 0x28a4c, 0x07ffffff, 0x06000000,
1026 0x4d8, 0x00000fff, 0x00000100,
1027 0x3e78, 0x00000001, 0x00000002,
1028 0x9100, 0x03000000, 0x0362c688,
1029 0x8c00, 0x000000ff, 0x00000001,
1030 0xe40, 0x00001fff, 0x00001fff,
1031 0x9060, 0x0000007f, 0x00000020,
1032 0x9508, 0x00010000, 0x00010000,
1033 0xac14, 0x000003ff, 0x000000f3,
1034 0xac0c, 0xffffffff, 0x00001032
1035};
1036
1037static const u32 bonaire_mgcg_cgcg_init[] =
1038{
1039 0xc420, 0xffffffff, 0xfffffffc,
1040 0x30800, 0xffffffff, 0xe0000000,
1041 0x3c2a0, 0xffffffff, 0x00000100,
1042 0x3c208, 0xffffffff, 0x00000100,
1043 0x3c2c0, 0xffffffff, 0xc0000100,
1044 0x3c2c8, 0xffffffff, 0xc0000100,
1045 0x3c2c4, 0xffffffff, 0xc0000100,
1046 0x55e4, 0xffffffff, 0x00600100,
1047 0x3c280, 0xffffffff, 0x00000100,
1048 0x3c214, 0xffffffff, 0x06000100,
1049 0x3c220, 0xffffffff, 0x00000100,
1050 0x3c218, 0xffffffff, 0x06000100,
1051 0x3c204, 0xffffffff, 0x00000100,
1052 0x3c2e0, 0xffffffff, 0x00000100,
1053 0x3c224, 0xffffffff, 0x00000100,
1054 0x3c200, 0xffffffff, 0x00000100,
1055 0x3c230, 0xffffffff, 0x00000100,
1056 0x3c234, 0xffffffff, 0x00000100,
1057 0x3c250, 0xffffffff, 0x00000100,
1058 0x3c254, 0xffffffff, 0x00000100,
1059 0x3c258, 0xffffffff, 0x00000100,
1060 0x3c25c, 0xffffffff, 0x00000100,
1061 0x3c260, 0xffffffff, 0x00000100,
1062 0x3c27c, 0xffffffff, 0x00000100,
1063 0x3c278, 0xffffffff, 0x00000100,
1064 0x3c210, 0xffffffff, 0x06000100,
1065 0x3c290, 0xffffffff, 0x00000100,
1066 0x3c274, 0xffffffff, 0x00000100,
1067 0x3c2b4, 0xffffffff, 0x00000100,
1068 0x3c2b0, 0xffffffff, 0x00000100,
1069 0x3c270, 0xffffffff, 0x00000100,
1070 0x30800, 0xffffffff, 0xe0000000,
1071 0x3c020, 0xffffffff, 0x00010000,
1072 0x3c024, 0xffffffff, 0x00030002,
1073 0x3c028, 0xffffffff, 0x00040007,
1074 0x3c02c, 0xffffffff, 0x00060005,
1075 0x3c030, 0xffffffff, 0x00090008,
1076 0x3c034, 0xffffffff, 0x00010000,
1077 0x3c038, 0xffffffff, 0x00030002,
1078 0x3c03c, 0xffffffff, 0x00040007,
1079 0x3c040, 0xffffffff, 0x00060005,
1080 0x3c044, 0xffffffff, 0x00090008,
1081 0x3c048, 0xffffffff, 0x00010000,
1082 0x3c04c, 0xffffffff, 0x00030002,
1083 0x3c050, 0xffffffff, 0x00040007,
1084 0x3c054, 0xffffffff, 0x00060005,
1085 0x3c058, 0xffffffff, 0x00090008,
1086 0x3c05c, 0xffffffff, 0x00010000,
1087 0x3c060, 0xffffffff, 0x00030002,
1088 0x3c064, 0xffffffff, 0x00040007,
1089 0x3c068, 0xffffffff, 0x00060005,
1090 0x3c06c, 0xffffffff, 0x00090008,
1091 0x3c070, 0xffffffff, 0x00010000,
1092 0x3c074, 0xffffffff, 0x00030002,
1093 0x3c078, 0xffffffff, 0x00040007,
1094 0x3c07c, 0xffffffff, 0x00060005,
1095 0x3c080, 0xffffffff, 0x00090008,
1096 0x3c084, 0xffffffff, 0x00010000,
1097 0x3c088, 0xffffffff, 0x00030002,
1098 0x3c08c, 0xffffffff, 0x00040007,
1099 0x3c090, 0xffffffff, 0x00060005,
1100 0x3c094, 0xffffffff, 0x00090008,
1101 0x3c098, 0xffffffff, 0x00010000,
1102 0x3c09c, 0xffffffff, 0x00030002,
1103 0x3c0a0, 0xffffffff, 0x00040007,
1104 0x3c0a4, 0xffffffff, 0x00060005,
1105 0x3c0a8, 0xffffffff, 0x00090008,
1106 0x3c000, 0xffffffff, 0x96e00200,
1107 0x8708, 0xffffffff, 0x00900100,
1108 0xc424, 0xffffffff, 0x0020003f,
1109 0x38, 0xffffffff, 0x0140001c,
1110 0x3c, 0x000f0000, 0x000f0000,
1111 0x220, 0xffffffff, 0xC060000C,
1112 0x224, 0xc0000fff, 0x00000100,
1113 0xf90, 0xffffffff, 0x00000100,
1114 0xf98, 0x00000101, 0x00000000,
1115 0x20a8, 0xffffffff, 0x00000104,
1116 0x55e4, 0xff000fff, 0x00000100,
1117 0x30cc, 0xc0000fff, 0x00000104,
1118 0xc1e4, 0x00000001, 0x00000001,
1119 0xd00c, 0xff000ff0, 0x00000100,
1120 0xd80c, 0xff000ff0, 0x00000100
1121};
1122
1123static const u32 spectre_golden_spm_registers[] =
1124{
1125 0x30800, 0xe0ffffff, 0xe0000000
1126};
1127
1128static const u32 spectre_golden_common_registers[] =
1129{
1130 0xc770, 0xffffffff, 0x00000800,
1131 0xc774, 0xffffffff, 0x00000800,
1132 0xc798, 0xffffffff, 0x00007fbf,
1133 0xc79c, 0xffffffff, 0x00007faf
1134};
1135
1136static const u32 spectre_golden_registers[] =
1137{
1138 0x3c000, 0xffff1fff, 0x96940200,
1139 0x3c00c, 0xffff0001, 0xff000000,
1140 0x3c200, 0xfffc0fff, 0x00000100,
1141 0x6ed8, 0x00010101, 0x00010000,
1142 0x9834, 0xf00fffff, 0x00000400,
1143 0x9838, 0xfffffffc, 0x00020200,
1144 0x5bb0, 0x000000f0, 0x00000070,
1145 0x5bc0, 0xf0311fff, 0x80300000,
1146 0x98f8, 0x73773777, 0x12010001,
1147 0x9b7c, 0x00ff0000, 0x00fc0000,
1148 0x2f48, 0x73773777, 0x12010001,
1149 0x8a14, 0xf000003f, 0x00000007,
1150 0x8b24, 0xffffffff, 0x00ffffff,
1151 0x28350, 0x3f3f3fff, 0x00000082,
Alex Deucherf1553172014-04-02 08:42:49 -04001152 0x28354, 0x0000003f, 0x00000000,
Alex Deucher0aafd312013-04-09 14:43:30 -04001153 0x3e78, 0x00000001, 0x00000002,
1154 0x913c, 0xffff03df, 0x00000004,
1155 0xc768, 0x00000008, 0x00000008,
1156 0x8c00, 0x000008ff, 0x00000800,
1157 0x9508, 0x00010000, 0x00010000,
1158 0xac0c, 0xffffffff, 0x54763210,
1159 0x214f8, 0x01ff01ff, 0x00000002,
1160 0x21498, 0x007ff800, 0x00200000,
1161 0x2015c, 0xffffffff, 0x00000f40,
1162 0x30934, 0xffffffff, 0x00000001
1163};
1164
1165static const u32 spectre_mgcg_cgcg_init[] =
1166{
1167 0xc420, 0xffffffff, 0xfffffffc,
1168 0x30800, 0xffffffff, 0xe0000000,
1169 0x3c2a0, 0xffffffff, 0x00000100,
1170 0x3c208, 0xffffffff, 0x00000100,
1171 0x3c2c0, 0xffffffff, 0x00000100,
1172 0x3c2c8, 0xffffffff, 0x00000100,
1173 0x3c2c4, 0xffffffff, 0x00000100,
1174 0x55e4, 0xffffffff, 0x00600100,
1175 0x3c280, 0xffffffff, 0x00000100,
1176 0x3c214, 0xffffffff, 0x06000100,
1177 0x3c220, 0xffffffff, 0x00000100,
1178 0x3c218, 0xffffffff, 0x06000100,
1179 0x3c204, 0xffffffff, 0x00000100,
1180 0x3c2e0, 0xffffffff, 0x00000100,
1181 0x3c224, 0xffffffff, 0x00000100,
1182 0x3c200, 0xffffffff, 0x00000100,
1183 0x3c230, 0xffffffff, 0x00000100,
1184 0x3c234, 0xffffffff, 0x00000100,
1185 0x3c250, 0xffffffff, 0x00000100,
1186 0x3c254, 0xffffffff, 0x00000100,
1187 0x3c258, 0xffffffff, 0x00000100,
1188 0x3c25c, 0xffffffff, 0x00000100,
1189 0x3c260, 0xffffffff, 0x00000100,
1190 0x3c27c, 0xffffffff, 0x00000100,
1191 0x3c278, 0xffffffff, 0x00000100,
1192 0x3c210, 0xffffffff, 0x06000100,
1193 0x3c290, 0xffffffff, 0x00000100,
1194 0x3c274, 0xffffffff, 0x00000100,
1195 0x3c2b4, 0xffffffff, 0x00000100,
1196 0x3c2b0, 0xffffffff, 0x00000100,
1197 0x3c270, 0xffffffff, 0x00000100,
1198 0x30800, 0xffffffff, 0xe0000000,
1199 0x3c020, 0xffffffff, 0x00010000,
1200 0x3c024, 0xffffffff, 0x00030002,
1201 0x3c028, 0xffffffff, 0x00040007,
1202 0x3c02c, 0xffffffff, 0x00060005,
1203 0x3c030, 0xffffffff, 0x00090008,
1204 0x3c034, 0xffffffff, 0x00010000,
1205 0x3c038, 0xffffffff, 0x00030002,
1206 0x3c03c, 0xffffffff, 0x00040007,
1207 0x3c040, 0xffffffff, 0x00060005,
1208 0x3c044, 0xffffffff, 0x00090008,
1209 0x3c048, 0xffffffff, 0x00010000,
1210 0x3c04c, 0xffffffff, 0x00030002,
1211 0x3c050, 0xffffffff, 0x00040007,
1212 0x3c054, 0xffffffff, 0x00060005,
1213 0x3c058, 0xffffffff, 0x00090008,
1214 0x3c05c, 0xffffffff, 0x00010000,
1215 0x3c060, 0xffffffff, 0x00030002,
1216 0x3c064, 0xffffffff, 0x00040007,
1217 0x3c068, 0xffffffff, 0x00060005,
1218 0x3c06c, 0xffffffff, 0x00090008,
1219 0x3c070, 0xffffffff, 0x00010000,
1220 0x3c074, 0xffffffff, 0x00030002,
1221 0x3c078, 0xffffffff, 0x00040007,
1222 0x3c07c, 0xffffffff, 0x00060005,
1223 0x3c080, 0xffffffff, 0x00090008,
1224 0x3c084, 0xffffffff, 0x00010000,
1225 0x3c088, 0xffffffff, 0x00030002,
1226 0x3c08c, 0xffffffff, 0x00040007,
1227 0x3c090, 0xffffffff, 0x00060005,
1228 0x3c094, 0xffffffff, 0x00090008,
1229 0x3c098, 0xffffffff, 0x00010000,
1230 0x3c09c, 0xffffffff, 0x00030002,
1231 0x3c0a0, 0xffffffff, 0x00040007,
1232 0x3c0a4, 0xffffffff, 0x00060005,
1233 0x3c0a8, 0xffffffff, 0x00090008,
1234 0x3c0ac, 0xffffffff, 0x00010000,
1235 0x3c0b0, 0xffffffff, 0x00030002,
1236 0x3c0b4, 0xffffffff, 0x00040007,
1237 0x3c0b8, 0xffffffff, 0x00060005,
1238 0x3c0bc, 0xffffffff, 0x00090008,
1239 0x3c000, 0xffffffff, 0x96e00200,
1240 0x8708, 0xffffffff, 0x00900100,
1241 0xc424, 0xffffffff, 0x0020003f,
1242 0x38, 0xffffffff, 0x0140001c,
1243 0x3c, 0x000f0000, 0x000f0000,
1244 0x220, 0xffffffff, 0xC060000C,
1245 0x224, 0xc0000fff, 0x00000100,
1246 0xf90, 0xffffffff, 0x00000100,
1247 0xf98, 0x00000101, 0x00000000,
1248 0x20a8, 0xffffffff, 0x00000104,
1249 0x55e4, 0xff000fff, 0x00000100,
1250 0x30cc, 0xc0000fff, 0x00000104,
1251 0xc1e4, 0x00000001, 0x00000001,
1252 0xd00c, 0xff000ff0, 0x00000100,
1253 0xd80c, 0xff000ff0, 0x00000100
1254};
1255
1256static const u32 kalindi_golden_spm_registers[] =
1257{
1258 0x30800, 0xe0ffffff, 0xe0000000
1259};
1260
1261static const u32 kalindi_golden_common_registers[] =
1262{
1263 0xc770, 0xffffffff, 0x00000800,
1264 0xc774, 0xffffffff, 0x00000800,
1265 0xc798, 0xffffffff, 0x00007fbf,
1266 0xc79c, 0xffffffff, 0x00007faf
1267};
1268
1269static const u32 kalindi_golden_registers[] =
1270{
1271 0x3c000, 0xffffdfff, 0x6e944040,
1272 0x55e4, 0xff607fff, 0xfc000100,
1273 0x3c220, 0xff000fff, 0x00000100,
1274 0x3c224, 0xff000fff, 0x00000100,
1275 0x3c200, 0xfffc0fff, 0x00000100,
1276 0x6ed8, 0x00010101, 0x00010000,
1277 0x9830, 0xffffffff, 0x00000000,
1278 0x9834, 0xf00fffff, 0x00000400,
1279 0x5bb0, 0x000000f0, 0x00000070,
1280 0x5bc0, 0xf0311fff, 0x80300000,
1281 0x98f8, 0x73773777, 0x12010001,
1282 0x98fc, 0xffffffff, 0x00000010,
1283 0x9b7c, 0x00ff0000, 0x00fc0000,
1284 0x8030, 0x00001f0f, 0x0000100a,
1285 0x2f48, 0x73773777, 0x12010001,
1286 0x2408, 0x000fffff, 0x000c007f,
1287 0x8a14, 0xf000003f, 0x00000007,
1288 0x8b24, 0x3fff3fff, 0x00ffcfff,
1289 0x30a04, 0x0000ff0f, 0x00000000,
1290 0x28a4c, 0x07ffffff, 0x06000000,
1291 0x4d8, 0x00000fff, 0x00000100,
1292 0x3e78, 0x00000001, 0x00000002,
1293 0xc768, 0x00000008, 0x00000008,
1294 0x8c00, 0x000000ff, 0x00000003,
1295 0x214f8, 0x01ff01ff, 0x00000002,
1296 0x21498, 0x007ff800, 0x00200000,
1297 0x2015c, 0xffffffff, 0x00000f40,
1298 0x88c4, 0x001f3ae3, 0x00000082,
1299 0x88d4, 0x0000001f, 0x00000010,
1300 0x30934, 0xffffffff, 0x00000000
1301};
1302
1303static const u32 kalindi_mgcg_cgcg_init[] =
1304{
1305 0xc420, 0xffffffff, 0xfffffffc,
1306 0x30800, 0xffffffff, 0xe0000000,
1307 0x3c2a0, 0xffffffff, 0x00000100,
1308 0x3c208, 0xffffffff, 0x00000100,
1309 0x3c2c0, 0xffffffff, 0x00000100,
1310 0x3c2c8, 0xffffffff, 0x00000100,
1311 0x3c2c4, 0xffffffff, 0x00000100,
1312 0x55e4, 0xffffffff, 0x00600100,
1313 0x3c280, 0xffffffff, 0x00000100,
1314 0x3c214, 0xffffffff, 0x06000100,
1315 0x3c220, 0xffffffff, 0x00000100,
1316 0x3c218, 0xffffffff, 0x06000100,
1317 0x3c204, 0xffffffff, 0x00000100,
1318 0x3c2e0, 0xffffffff, 0x00000100,
1319 0x3c224, 0xffffffff, 0x00000100,
1320 0x3c200, 0xffffffff, 0x00000100,
1321 0x3c230, 0xffffffff, 0x00000100,
1322 0x3c234, 0xffffffff, 0x00000100,
1323 0x3c250, 0xffffffff, 0x00000100,
1324 0x3c254, 0xffffffff, 0x00000100,
1325 0x3c258, 0xffffffff, 0x00000100,
1326 0x3c25c, 0xffffffff, 0x00000100,
1327 0x3c260, 0xffffffff, 0x00000100,
1328 0x3c27c, 0xffffffff, 0x00000100,
1329 0x3c278, 0xffffffff, 0x00000100,
1330 0x3c210, 0xffffffff, 0x06000100,
1331 0x3c290, 0xffffffff, 0x00000100,
1332 0x3c274, 0xffffffff, 0x00000100,
1333 0x3c2b4, 0xffffffff, 0x00000100,
1334 0x3c2b0, 0xffffffff, 0x00000100,
1335 0x3c270, 0xffffffff, 0x00000100,
1336 0x30800, 0xffffffff, 0xe0000000,
1337 0x3c020, 0xffffffff, 0x00010000,
1338 0x3c024, 0xffffffff, 0x00030002,
1339 0x3c028, 0xffffffff, 0x00040007,
1340 0x3c02c, 0xffffffff, 0x00060005,
1341 0x3c030, 0xffffffff, 0x00090008,
1342 0x3c034, 0xffffffff, 0x00010000,
1343 0x3c038, 0xffffffff, 0x00030002,
1344 0x3c03c, 0xffffffff, 0x00040007,
1345 0x3c040, 0xffffffff, 0x00060005,
1346 0x3c044, 0xffffffff, 0x00090008,
1347 0x3c000, 0xffffffff, 0x96e00200,
1348 0x8708, 0xffffffff, 0x00900100,
1349 0xc424, 0xffffffff, 0x0020003f,
1350 0x38, 0xffffffff, 0x0140001c,
1351 0x3c, 0x000f0000, 0x000f0000,
1352 0x220, 0xffffffff, 0xC060000C,
1353 0x224, 0xc0000fff, 0x00000100,
1354 0x20a8, 0xffffffff, 0x00000104,
1355 0x55e4, 0xff000fff, 0x00000100,
1356 0x30cc, 0xc0000fff, 0x00000104,
1357 0xc1e4, 0x00000001, 0x00000001,
1358 0xd00c, 0xff000ff0, 0x00000100,
1359 0xd80c, 0xff000ff0, 0x00000100
1360};
1361
Alex Deucher8efff332013-08-07 19:20:14 -04001362static const u32 hawaii_golden_spm_registers[] =
1363{
1364 0x30800, 0xe0ffffff, 0xe0000000
1365};
1366
1367static const u32 hawaii_golden_common_registers[] =
1368{
1369 0x30800, 0xffffffff, 0xe0000000,
1370 0x28350, 0xffffffff, 0x3a00161a,
1371 0x28354, 0xffffffff, 0x0000002e,
1372 0x9a10, 0xffffffff, 0x00018208,
1373 0x98f8, 0xffffffff, 0x12011003
1374};
1375
1376static const u32 hawaii_golden_registers[] =
1377{
1378 0x3354, 0x00000333, 0x00000333,
1379 0x9a10, 0x00010000, 0x00058208,
1380 0x9830, 0xffffffff, 0x00000000,
1381 0x9834, 0xf00fffff, 0x00000400,
1382 0x9838, 0x0002021c, 0x00020200,
1383 0xc78, 0x00000080, 0x00000000,
1384 0x5bb0, 0x000000f0, 0x00000070,
1385 0x5bc0, 0xf0311fff, 0x80300000,
1386 0x350c, 0x00810000, 0x408af000,
1387 0x7030, 0x31000111, 0x00000011,
1388 0x2f48, 0x73773777, 0x12010001,
1389 0x2120, 0x0000007f, 0x0000001b,
1390 0x21dc, 0x00007fb6, 0x00002191,
1391 0x3628, 0x0000003f, 0x0000000a,
1392 0x362c, 0x0000003f, 0x0000000a,
1393 0x2ae4, 0x00073ffe, 0x000022a2,
1394 0x240c, 0x000007ff, 0x00000000,
1395 0x8bf0, 0x00002001, 0x00000001,
1396 0x8b24, 0xffffffff, 0x00ffffff,
1397 0x30a04, 0x0000ff0f, 0x00000000,
1398 0x28a4c, 0x07ffffff, 0x06000000,
1399 0x3e78, 0x00000001, 0x00000002,
1400 0xc768, 0x00000008, 0x00000008,
1401 0xc770, 0x00000f00, 0x00000800,
1402 0xc774, 0x00000f00, 0x00000800,
1403 0xc798, 0x00ffffff, 0x00ff7fbf,
1404 0xc79c, 0x00ffffff, 0x00ff7faf,
1405 0x8c00, 0x000000ff, 0x00000800,
1406 0xe40, 0x00001fff, 0x00001fff,
1407 0x9060, 0x0000007f, 0x00000020,
1408 0x9508, 0x00010000, 0x00010000,
1409 0xae00, 0x00100000, 0x000ff07c,
1410 0xac14, 0x000003ff, 0x0000000f,
1411 0xac10, 0xffffffff, 0x7564fdec,
1412 0xac0c, 0xffffffff, 0x3120b9a8,
1413 0xac08, 0x20000000, 0x0f9c0000
1414};
1415
1416static const u32 hawaii_mgcg_cgcg_init[] =
1417{
1418 0xc420, 0xffffffff, 0xfffffffd,
1419 0x30800, 0xffffffff, 0xe0000000,
1420 0x3c2a0, 0xffffffff, 0x00000100,
1421 0x3c208, 0xffffffff, 0x00000100,
1422 0x3c2c0, 0xffffffff, 0x00000100,
1423 0x3c2c8, 0xffffffff, 0x00000100,
1424 0x3c2c4, 0xffffffff, 0x00000100,
1425 0x55e4, 0xffffffff, 0x00200100,
1426 0x3c280, 0xffffffff, 0x00000100,
1427 0x3c214, 0xffffffff, 0x06000100,
1428 0x3c220, 0xffffffff, 0x00000100,
1429 0x3c218, 0xffffffff, 0x06000100,
1430 0x3c204, 0xffffffff, 0x00000100,
1431 0x3c2e0, 0xffffffff, 0x00000100,
1432 0x3c224, 0xffffffff, 0x00000100,
1433 0x3c200, 0xffffffff, 0x00000100,
1434 0x3c230, 0xffffffff, 0x00000100,
1435 0x3c234, 0xffffffff, 0x00000100,
1436 0x3c250, 0xffffffff, 0x00000100,
1437 0x3c254, 0xffffffff, 0x00000100,
1438 0x3c258, 0xffffffff, 0x00000100,
1439 0x3c25c, 0xffffffff, 0x00000100,
1440 0x3c260, 0xffffffff, 0x00000100,
1441 0x3c27c, 0xffffffff, 0x00000100,
1442 0x3c278, 0xffffffff, 0x00000100,
1443 0x3c210, 0xffffffff, 0x06000100,
1444 0x3c290, 0xffffffff, 0x00000100,
1445 0x3c274, 0xffffffff, 0x00000100,
1446 0x3c2b4, 0xffffffff, 0x00000100,
1447 0x3c2b0, 0xffffffff, 0x00000100,
1448 0x3c270, 0xffffffff, 0x00000100,
1449 0x30800, 0xffffffff, 0xe0000000,
1450 0x3c020, 0xffffffff, 0x00010000,
1451 0x3c024, 0xffffffff, 0x00030002,
1452 0x3c028, 0xffffffff, 0x00040007,
1453 0x3c02c, 0xffffffff, 0x00060005,
1454 0x3c030, 0xffffffff, 0x00090008,
1455 0x3c034, 0xffffffff, 0x00010000,
1456 0x3c038, 0xffffffff, 0x00030002,
1457 0x3c03c, 0xffffffff, 0x00040007,
1458 0x3c040, 0xffffffff, 0x00060005,
1459 0x3c044, 0xffffffff, 0x00090008,
1460 0x3c048, 0xffffffff, 0x00010000,
1461 0x3c04c, 0xffffffff, 0x00030002,
1462 0x3c050, 0xffffffff, 0x00040007,
1463 0x3c054, 0xffffffff, 0x00060005,
1464 0x3c058, 0xffffffff, 0x00090008,
1465 0x3c05c, 0xffffffff, 0x00010000,
1466 0x3c060, 0xffffffff, 0x00030002,
1467 0x3c064, 0xffffffff, 0x00040007,
1468 0x3c068, 0xffffffff, 0x00060005,
1469 0x3c06c, 0xffffffff, 0x00090008,
1470 0x3c070, 0xffffffff, 0x00010000,
1471 0x3c074, 0xffffffff, 0x00030002,
1472 0x3c078, 0xffffffff, 0x00040007,
1473 0x3c07c, 0xffffffff, 0x00060005,
1474 0x3c080, 0xffffffff, 0x00090008,
1475 0x3c084, 0xffffffff, 0x00010000,
1476 0x3c088, 0xffffffff, 0x00030002,
1477 0x3c08c, 0xffffffff, 0x00040007,
1478 0x3c090, 0xffffffff, 0x00060005,
1479 0x3c094, 0xffffffff, 0x00090008,
1480 0x3c098, 0xffffffff, 0x00010000,
1481 0x3c09c, 0xffffffff, 0x00030002,
1482 0x3c0a0, 0xffffffff, 0x00040007,
1483 0x3c0a4, 0xffffffff, 0x00060005,
1484 0x3c0a8, 0xffffffff, 0x00090008,
1485 0x3c0ac, 0xffffffff, 0x00010000,
1486 0x3c0b0, 0xffffffff, 0x00030002,
1487 0x3c0b4, 0xffffffff, 0x00040007,
1488 0x3c0b8, 0xffffffff, 0x00060005,
1489 0x3c0bc, 0xffffffff, 0x00090008,
1490 0x3c0c0, 0xffffffff, 0x00010000,
1491 0x3c0c4, 0xffffffff, 0x00030002,
1492 0x3c0c8, 0xffffffff, 0x00040007,
1493 0x3c0cc, 0xffffffff, 0x00060005,
1494 0x3c0d0, 0xffffffff, 0x00090008,
1495 0x3c0d4, 0xffffffff, 0x00010000,
1496 0x3c0d8, 0xffffffff, 0x00030002,
1497 0x3c0dc, 0xffffffff, 0x00040007,
1498 0x3c0e0, 0xffffffff, 0x00060005,
1499 0x3c0e4, 0xffffffff, 0x00090008,
1500 0x3c0e8, 0xffffffff, 0x00010000,
1501 0x3c0ec, 0xffffffff, 0x00030002,
1502 0x3c0f0, 0xffffffff, 0x00040007,
1503 0x3c0f4, 0xffffffff, 0x00060005,
1504 0x3c0f8, 0xffffffff, 0x00090008,
1505 0xc318, 0xffffffff, 0x00020200,
1506 0x3350, 0xffffffff, 0x00000200,
1507 0x15c0, 0xffffffff, 0x00000400,
1508 0x55e8, 0xffffffff, 0x00000000,
1509 0x2f50, 0xffffffff, 0x00000902,
1510 0x3c000, 0xffffffff, 0x96940200,
1511 0x8708, 0xffffffff, 0x00900100,
1512 0xc424, 0xffffffff, 0x0020003f,
1513 0x38, 0xffffffff, 0x0140001c,
1514 0x3c, 0x000f0000, 0x000f0000,
1515 0x220, 0xffffffff, 0xc060000c,
1516 0x224, 0xc0000fff, 0x00000100,
1517 0xf90, 0xffffffff, 0x00000100,
1518 0xf98, 0x00000101, 0x00000000,
1519 0x20a8, 0xffffffff, 0x00000104,
1520 0x55e4, 0xff000fff, 0x00000100,
1521 0x30cc, 0xc0000fff, 0x00000104,
1522 0xc1e4, 0x00000001, 0x00000001,
1523 0xd00c, 0xff000ff0, 0x00000100,
1524 0xd80c, 0xff000ff0, 0x00000100
1525};
1526
Samuel Lif73a9e82014-04-30 18:40:49 -04001527static const u32 godavari_golden_registers[] =
1528{
1529 0x55e4, 0xff607fff, 0xfc000100,
1530 0x6ed8, 0x00010101, 0x00010000,
1531 0x9830, 0xffffffff, 0x00000000,
1532 0x98302, 0xf00fffff, 0x00000400,
1533 0x6130, 0xffffffff, 0x00010000,
1534 0x5bb0, 0x000000f0, 0x00000070,
1535 0x5bc0, 0xf0311fff, 0x80300000,
1536 0x98f8, 0x73773777, 0x12010001,
1537 0x98fc, 0xffffffff, 0x00000010,
1538 0x8030, 0x00001f0f, 0x0000100a,
1539 0x2f48, 0x73773777, 0x12010001,
1540 0x2408, 0x000fffff, 0x000c007f,
1541 0x8a14, 0xf000003f, 0x00000007,
1542 0x8b24, 0xffffffff, 0x00ff0fff,
1543 0x30a04, 0x0000ff0f, 0x00000000,
1544 0x28a4c, 0x07ffffff, 0x06000000,
1545 0x4d8, 0x00000fff, 0x00000100,
1546 0xd014, 0x00010000, 0x00810001,
1547 0xd814, 0x00010000, 0x00810001,
1548 0x3e78, 0x00000001, 0x00000002,
1549 0xc768, 0x00000008, 0x00000008,
1550 0xc770, 0x00000f00, 0x00000800,
1551 0xc774, 0x00000f00, 0x00000800,
1552 0xc798, 0x00ffffff, 0x00ff7fbf,
1553 0xc79c, 0x00ffffff, 0x00ff7faf,
1554 0x8c00, 0x000000ff, 0x00000001,
1555 0x214f8, 0x01ff01ff, 0x00000002,
1556 0x21498, 0x007ff800, 0x00200000,
1557 0x2015c, 0xffffffff, 0x00000f40,
1558 0x88c4, 0x001f3ae3, 0x00000082,
1559 0x88d4, 0x0000001f, 0x00000010,
1560 0x30934, 0xffffffff, 0x00000000
1561};
1562
1563
Alex Deucher0aafd312013-04-09 14:43:30 -04001564static void cik_init_golden_registers(struct radeon_device *rdev)
1565{
1566 switch (rdev->family) {
1567 case CHIP_BONAIRE:
1568 radeon_program_register_sequence(rdev,
1569 bonaire_mgcg_cgcg_init,
1570 (const u32)ARRAY_SIZE(bonaire_mgcg_cgcg_init));
1571 radeon_program_register_sequence(rdev,
1572 bonaire_golden_registers,
1573 (const u32)ARRAY_SIZE(bonaire_golden_registers));
1574 radeon_program_register_sequence(rdev,
1575 bonaire_golden_common_registers,
1576 (const u32)ARRAY_SIZE(bonaire_golden_common_registers));
1577 radeon_program_register_sequence(rdev,
1578 bonaire_golden_spm_registers,
1579 (const u32)ARRAY_SIZE(bonaire_golden_spm_registers));
1580 break;
1581 case CHIP_KABINI:
1582 radeon_program_register_sequence(rdev,
1583 kalindi_mgcg_cgcg_init,
1584 (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
1585 radeon_program_register_sequence(rdev,
1586 kalindi_golden_registers,
1587 (const u32)ARRAY_SIZE(kalindi_golden_registers));
1588 radeon_program_register_sequence(rdev,
1589 kalindi_golden_common_registers,
1590 (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
1591 radeon_program_register_sequence(rdev,
1592 kalindi_golden_spm_registers,
1593 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
1594 break;
Samuel Lif73a9e82014-04-30 18:40:49 -04001595 case CHIP_MULLINS:
1596 radeon_program_register_sequence(rdev,
1597 kalindi_mgcg_cgcg_init,
1598 (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
1599 radeon_program_register_sequence(rdev,
1600 godavari_golden_registers,
1601 (const u32)ARRAY_SIZE(godavari_golden_registers));
1602 radeon_program_register_sequence(rdev,
1603 kalindi_golden_common_registers,
1604 (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
1605 radeon_program_register_sequence(rdev,
1606 kalindi_golden_spm_registers,
1607 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
1608 break;
Alex Deucher0aafd312013-04-09 14:43:30 -04001609 case CHIP_KAVERI:
1610 radeon_program_register_sequence(rdev,
1611 spectre_mgcg_cgcg_init,
1612 (const u32)ARRAY_SIZE(spectre_mgcg_cgcg_init));
1613 radeon_program_register_sequence(rdev,
1614 spectre_golden_registers,
1615 (const u32)ARRAY_SIZE(spectre_golden_registers));
1616 radeon_program_register_sequence(rdev,
1617 spectre_golden_common_registers,
1618 (const u32)ARRAY_SIZE(spectre_golden_common_registers));
1619 radeon_program_register_sequence(rdev,
1620 spectre_golden_spm_registers,
1621 (const u32)ARRAY_SIZE(spectre_golden_spm_registers));
1622 break;
Alex Deucher8efff332013-08-07 19:20:14 -04001623 case CHIP_HAWAII:
1624 radeon_program_register_sequence(rdev,
1625 hawaii_mgcg_cgcg_init,
1626 (const u32)ARRAY_SIZE(hawaii_mgcg_cgcg_init));
1627 radeon_program_register_sequence(rdev,
1628 hawaii_golden_registers,
1629 (const u32)ARRAY_SIZE(hawaii_golden_registers));
1630 radeon_program_register_sequence(rdev,
1631 hawaii_golden_common_registers,
1632 (const u32)ARRAY_SIZE(hawaii_golden_common_registers));
1633 radeon_program_register_sequence(rdev,
1634 hawaii_golden_spm_registers,
1635 (const u32)ARRAY_SIZE(hawaii_golden_spm_registers));
1636 break;
Alex Deucher0aafd312013-04-09 14:43:30 -04001637 default:
1638 break;
1639 }
1640}
1641
Alex Deucher2c679122013-04-09 13:32:18 -04001642/**
1643 * cik_get_xclk - get the xclk
1644 *
1645 * @rdev: radeon_device pointer
1646 *
1647 * Returns the reference clock used by the gfx engine
1648 * (CIK).
1649 */
1650u32 cik_get_xclk(struct radeon_device *rdev)
1651{
1652 u32 reference_clock = rdev->clock.spll.reference_freq;
1653
1654 if (rdev->flags & RADEON_IS_IGP) {
1655 if (RREG32_SMC(GENERAL_PWRMGT) & GPU_COUNTER_CLK)
1656 return reference_clock / 2;
1657 } else {
1658 if (RREG32_SMC(CG_CLKPIN_CNTL) & XTALIN_DIVIDE)
1659 return reference_clock / 4;
1660 }
1661 return reference_clock;
1662}
1663
Alex Deucher75efdee2013-03-04 12:47:46 -05001664/**
1665 * cik_mm_rdoorbell - read a doorbell dword
1666 *
1667 * @rdev: radeon_device pointer
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001668 * @index: doorbell index
Alex Deucher75efdee2013-03-04 12:47:46 -05001669 *
1670 * Returns the value in the doorbell aperture at the
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001671 * requested doorbell index (CIK).
Alex Deucher75efdee2013-03-04 12:47:46 -05001672 */
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001673u32 cik_mm_rdoorbell(struct radeon_device *rdev, u32 index)
Alex Deucher75efdee2013-03-04 12:47:46 -05001674{
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001675 if (index < rdev->doorbell.num_doorbells) {
1676 return readl(rdev->doorbell.ptr + index);
Alex Deucher75efdee2013-03-04 12:47:46 -05001677 } else {
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001678 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
Alex Deucher75efdee2013-03-04 12:47:46 -05001679 return 0;
1680 }
1681}
1682
1683/**
1684 * cik_mm_wdoorbell - write a doorbell dword
1685 *
1686 * @rdev: radeon_device pointer
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001687 * @index: doorbell index
Alex Deucher75efdee2013-03-04 12:47:46 -05001688 * @v: value to write
1689 *
1690 * Writes @v to the doorbell aperture at the
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001691 * requested doorbell index (CIK).
Alex Deucher75efdee2013-03-04 12:47:46 -05001692 */
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001693void cik_mm_wdoorbell(struct radeon_device *rdev, u32 index, u32 v)
Alex Deucher75efdee2013-03-04 12:47:46 -05001694{
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001695 if (index < rdev->doorbell.num_doorbells) {
1696 writel(v, rdev->doorbell.ptr + index);
Alex Deucher75efdee2013-03-04 12:47:46 -05001697 } else {
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05001698 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
Alex Deucher75efdee2013-03-04 12:47:46 -05001699 }
1700}
1701
Alex Deucherbc8273f2012-06-29 19:44:04 -04001702#define BONAIRE_IO_MC_REGS_SIZE 36
1703
1704static const u32 bonaire_io_mc_regs[BONAIRE_IO_MC_REGS_SIZE][2] =
1705{
1706 {0x00000070, 0x04400000},
1707 {0x00000071, 0x80c01803},
1708 {0x00000072, 0x00004004},
1709 {0x00000073, 0x00000100},
1710 {0x00000074, 0x00ff0000},
1711 {0x00000075, 0x34000000},
1712 {0x00000076, 0x08000014},
1713 {0x00000077, 0x00cc08ec},
1714 {0x00000078, 0x00000400},
1715 {0x00000079, 0x00000000},
1716 {0x0000007a, 0x04090000},
1717 {0x0000007c, 0x00000000},
1718 {0x0000007e, 0x4408a8e8},
1719 {0x0000007f, 0x00000304},
1720 {0x00000080, 0x00000000},
1721 {0x00000082, 0x00000001},
1722 {0x00000083, 0x00000002},
1723 {0x00000084, 0xf3e4f400},
1724 {0x00000085, 0x052024e3},
1725 {0x00000087, 0x00000000},
1726 {0x00000088, 0x01000000},
1727 {0x0000008a, 0x1c0a0000},
1728 {0x0000008b, 0xff010000},
1729 {0x0000008d, 0xffffefff},
1730 {0x0000008e, 0xfff3efff},
1731 {0x0000008f, 0xfff3efbf},
1732 {0x00000092, 0xf7ffffff},
1733 {0x00000093, 0xffffff7f},
1734 {0x00000095, 0x00101101},
1735 {0x00000096, 0x00000fff},
1736 {0x00000097, 0x00116fff},
1737 {0x00000098, 0x60010000},
1738 {0x00000099, 0x10010000},
1739 {0x0000009a, 0x00006000},
1740 {0x0000009b, 0x00001000},
1741 {0x0000009f, 0x00b48000}
1742};
1743
Alex Deucherd4775652013-08-08 16:06:35 -04001744#define HAWAII_IO_MC_REGS_SIZE 22
1745
1746static const u32 hawaii_io_mc_regs[HAWAII_IO_MC_REGS_SIZE][2] =
1747{
1748 {0x0000007d, 0x40000000},
1749 {0x0000007e, 0x40180304},
1750 {0x0000007f, 0x0000ff00},
1751 {0x00000081, 0x00000000},
1752 {0x00000083, 0x00000800},
1753 {0x00000086, 0x00000000},
1754 {0x00000087, 0x00000100},
1755 {0x00000088, 0x00020100},
1756 {0x00000089, 0x00000000},
1757 {0x0000008b, 0x00040000},
1758 {0x0000008c, 0x00000100},
1759 {0x0000008e, 0xff010000},
1760 {0x00000090, 0xffffefff},
1761 {0x00000091, 0xfff3efff},
1762 {0x00000092, 0xfff3efbf},
1763 {0x00000093, 0xf7ffffff},
1764 {0x00000094, 0xffffff7f},
1765 {0x00000095, 0x00000fff},
1766 {0x00000096, 0x00116fff},
1767 {0x00000097, 0x60010000},
1768 {0x00000098, 0x10010000},
1769 {0x0000009f, 0x00c79000}
1770};
1771
1772
Alex Deucherb556b122013-01-29 10:44:22 -05001773/**
1774 * cik_srbm_select - select specific register instances
1775 *
1776 * @rdev: radeon_device pointer
1777 * @me: selected ME (micro engine)
1778 * @pipe: pipe
1779 * @queue: queue
1780 * @vmid: VMID
1781 *
1782 * Switches the currently active registers instances. Some
1783 * registers are instanced per VMID, others are instanced per
1784 * me/pipe/queue combination.
1785 */
1786static void cik_srbm_select(struct radeon_device *rdev,
1787 u32 me, u32 pipe, u32 queue, u32 vmid)
1788{
1789 u32 srbm_gfx_cntl = (PIPEID(pipe & 0x3) |
1790 MEID(me & 0x3) |
1791 VMID(vmid & 0xf) |
1792 QUEUEID(queue & 0x7));
1793 WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl);
1794}
1795
Alex Deucherbc8273f2012-06-29 19:44:04 -04001796/* ucode loading */
1797/**
1798 * ci_mc_load_microcode - load MC ucode into the hw
1799 *
1800 * @rdev: radeon_device pointer
1801 *
1802 * Load the GDDR MC ucode into the hw (CIK).
1803 * Returns 0 on success, error on failure.
1804 */
Alex Deucher6c7bcce2013-12-18 14:07:14 -05001805int ci_mc_load_microcode(struct radeon_device *rdev)
Alex Deucherbc8273f2012-06-29 19:44:04 -04001806{
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001807 const __be32 *fw_data = NULL;
1808 const __le32 *new_fw_data = NULL;
Alex Deucher9feb3dd2014-11-07 12:00:25 -05001809 u32 running, blackout = 0, tmp;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001810 u32 *io_mc_regs = NULL;
1811 const __le32 *new_io_mc_regs = NULL;
Alex Deucherbcddee22014-04-16 09:42:23 -04001812 int i, regs_size, ucode_size;
Alex Deucherbc8273f2012-06-29 19:44:04 -04001813
1814 if (!rdev->mc_fw)
1815 return -EINVAL;
1816
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001817 if (rdev->new_fw) {
1818 const struct mc_firmware_header_v1_0 *hdr =
1819 (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
Alex Deucherbcddee22014-04-16 09:42:23 -04001820
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001821 radeon_ucode_print_mc_hdr(&hdr->header);
1822
1823 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
1824 new_io_mc_regs = (const __le32 *)
1825 (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
1826 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
1827 new_fw_data = (const __le32 *)
1828 (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1829 } else {
1830 ucode_size = rdev->mc_fw->size / 4;
1831
1832 switch (rdev->family) {
1833 case CHIP_BONAIRE:
1834 io_mc_regs = (u32 *)&bonaire_io_mc_regs;
1835 regs_size = BONAIRE_IO_MC_REGS_SIZE;
1836 break;
1837 case CHIP_HAWAII:
1838 io_mc_regs = (u32 *)&hawaii_io_mc_regs;
1839 regs_size = HAWAII_IO_MC_REGS_SIZE;
1840 break;
1841 default:
1842 return -EINVAL;
1843 }
1844 fw_data = (const __be32 *)rdev->mc_fw->data;
Alex Deucherbc8273f2012-06-29 19:44:04 -04001845 }
1846
1847 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1848
1849 if (running == 0) {
1850 if (running) {
1851 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
1852 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
1853 }
1854
1855 /* reset the engine and set to writable */
1856 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1857 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1858
1859 /* load mc io regs */
1860 for (i = 0; i < regs_size; i++) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001861 if (rdev->new_fw) {
1862 WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
1863 WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
1864 } else {
1865 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1866 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1867 }
Alex Deucherbc8273f2012-06-29 19:44:04 -04001868 }
Alex Deucher9feb3dd2014-11-07 12:00:25 -05001869
1870 tmp = RREG32(MC_SEQ_MISC0);
1871 if ((rdev->pdev->device == 0x6649) && ((tmp & 0xff00) == 0x5600)) {
1872 WREG32(MC_SEQ_IO_DEBUG_INDEX, 5);
1873 WREG32(MC_SEQ_IO_DEBUG_DATA, 0x00000023);
1874 WREG32(MC_SEQ_IO_DEBUG_INDEX, 9);
1875 WREG32(MC_SEQ_IO_DEBUG_DATA, 0x000001f0);
1876 }
1877
Alex Deucherbc8273f2012-06-29 19:44:04 -04001878 /* load the MC ucode */
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001879 for (i = 0; i < ucode_size; i++) {
1880 if (rdev->new_fw)
1881 WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
1882 else
1883 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1884 }
Alex Deucherbc8273f2012-06-29 19:44:04 -04001885
1886 /* put the engine back into the active state */
1887 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1888 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1889 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1890
1891 /* wait for training to complete */
1892 for (i = 0; i < rdev->usec_timeout; i++) {
1893 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1894 break;
1895 udelay(1);
1896 }
1897 for (i = 0; i < rdev->usec_timeout; i++) {
1898 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1899 break;
1900 udelay(1);
1901 }
1902
1903 if (running)
1904 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1905 }
1906
1907 return 0;
1908}
1909
Alex Deucher02c81322012-12-18 21:43:07 -05001910/**
1911 * cik_init_microcode - load ucode images from disk
1912 *
1913 * @rdev: radeon_device pointer
1914 *
1915 * Use the firmware interface to load the ucode images into
1916 * the driver (not loaded into hw).
1917 * Returns 0 on success, error on failure.
1918 */
1919static int cik_init_microcode(struct radeon_device *rdev)
1920{
Alex Deucher02c81322012-12-18 21:43:07 -05001921 const char *chip_name;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001922 const char *new_chip_name;
Alex Deucher02c81322012-12-18 21:43:07 -05001923 size_t pfp_req_size, me_req_size, ce_req_size,
Alex Deucherd4775652013-08-08 16:06:35 -04001924 mec_req_size, rlc_req_size, mc_req_size = 0,
Alex Deucher277babc2014-04-11 11:21:50 -04001925 sdma_req_size, smc_req_size = 0, mc2_req_size = 0;
Alex Deucher02c81322012-12-18 21:43:07 -05001926 char fw_name[30];
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001927 int new_fw = 0;
Alex Deucher02c81322012-12-18 21:43:07 -05001928 int err;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001929 int num_fw;
Alex Deucher02c81322012-12-18 21:43:07 -05001930
1931 DRM_DEBUG("\n");
1932
Alex Deucher02c81322012-12-18 21:43:07 -05001933 switch (rdev->family) {
1934 case CHIP_BONAIRE:
1935 chip_name = "BONAIRE";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001936 new_chip_name = "bonaire";
Alex Deucher02c81322012-12-18 21:43:07 -05001937 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1938 me_req_size = CIK_ME_UCODE_SIZE * 4;
1939 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1940 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1941 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
Alex Deucher277babc2014-04-11 11:21:50 -04001942 mc_req_size = BONAIRE_MC_UCODE_SIZE * 4;
1943 mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001944 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001945 smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001946 num_fw = 8;
Alex Deucher02c81322012-12-18 21:43:07 -05001947 break;
Alex Deucherd4775652013-08-08 16:06:35 -04001948 case CHIP_HAWAII:
1949 chip_name = "HAWAII";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001950 new_chip_name = "hawaii";
Alex Deucherd4775652013-08-08 16:06:35 -04001951 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1952 me_req_size = CIK_ME_UCODE_SIZE * 4;
1953 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1954 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1955 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
1956 mc_req_size = HAWAII_MC_UCODE_SIZE * 4;
Alex Deucher277babc2014-04-11 11:21:50 -04001957 mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4;
Alex Deucherd4775652013-08-08 16:06:35 -04001958 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1959 smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001960 num_fw = 8;
Alex Deucherd4775652013-08-08 16:06:35 -04001961 break;
Alex Deucher02c81322012-12-18 21:43:07 -05001962 case CHIP_KAVERI:
1963 chip_name = "KAVERI";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001964 new_chip_name = "kaveri";
Alex Deucher02c81322012-12-18 21:43:07 -05001965 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1966 me_req_size = CIK_ME_UCODE_SIZE * 4;
1967 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1968 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1969 rlc_req_size = KV_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001970 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001971 num_fw = 7;
Alex Deucher02c81322012-12-18 21:43:07 -05001972 break;
1973 case CHIP_KABINI:
1974 chip_name = "KABINI";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001975 new_chip_name = "kabini";
Alex Deucher02c81322012-12-18 21:43:07 -05001976 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1977 me_req_size = CIK_ME_UCODE_SIZE * 4;
1978 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1979 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1980 rlc_req_size = KB_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001981 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001982 num_fw = 6;
Alex Deucher02c81322012-12-18 21:43:07 -05001983 break;
Samuel Lif73a9e82014-04-30 18:40:49 -04001984 case CHIP_MULLINS:
1985 chip_name = "MULLINS";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001986 new_chip_name = "mullins";
Samuel Lif73a9e82014-04-30 18:40:49 -04001987 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1988 me_req_size = CIK_ME_UCODE_SIZE * 4;
1989 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1990 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1991 rlc_req_size = ML_RLC_UCODE_SIZE * 4;
1992 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001993 num_fw = 6;
Samuel Lif73a9e82014-04-30 18:40:49 -04001994 break;
Alex Deucher02c81322012-12-18 21:43:07 -05001995 default: BUG();
1996 }
1997
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001998 DRM_INFO("Loading %s Microcode\n", new_chip_name);
Alex Deucher02c81322012-12-18 21:43:07 -05001999
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002000 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002001 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002002 if (err) {
2003 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
2004 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
2005 if (err)
2006 goto out;
2007 if (rdev->pfp_fw->size != pfp_req_size) {
2008 printk(KERN_ERR
2009 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2010 rdev->pfp_fw->size, fw_name);
2011 err = -EINVAL;
2012 goto out;
2013 }
2014 } else {
2015 err = radeon_ucode_validate(rdev->pfp_fw);
2016 if (err) {
2017 printk(KERN_ERR
2018 "cik_fw: validation failed for firmware \"%s\"\n",
2019 fw_name);
2020 goto out;
2021 } else {
2022 new_fw++;
2023 }
Alex Deucher02c81322012-12-18 21:43:07 -05002024 }
2025
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002026 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002027 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002028 if (err) {
2029 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
2030 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
2031 if (err)
2032 goto out;
2033 if (rdev->me_fw->size != me_req_size) {
2034 printk(KERN_ERR
2035 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2036 rdev->me_fw->size, fw_name);
2037 err = -EINVAL;
2038 }
2039 } else {
2040 err = radeon_ucode_validate(rdev->me_fw);
2041 if (err) {
2042 printk(KERN_ERR
2043 "cik_fw: validation failed for firmware \"%s\"\n",
2044 fw_name);
2045 goto out;
2046 } else {
2047 new_fw++;
2048 }
Alex Deucher02c81322012-12-18 21:43:07 -05002049 }
2050
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002051 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002052 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002053 if (err) {
2054 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
2055 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
2056 if (err)
2057 goto out;
2058 if (rdev->ce_fw->size != ce_req_size) {
2059 printk(KERN_ERR
2060 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2061 rdev->ce_fw->size, fw_name);
2062 err = -EINVAL;
2063 }
2064 } else {
2065 err = radeon_ucode_validate(rdev->ce_fw);
2066 if (err) {
2067 printk(KERN_ERR
2068 "cik_fw: validation failed for firmware \"%s\"\n",
2069 fw_name);
2070 goto out;
2071 } else {
2072 new_fw++;
2073 }
Alex Deucher02c81322012-12-18 21:43:07 -05002074 }
2075
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002076 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002077 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002078 if (err) {
2079 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
2080 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
2081 if (err)
2082 goto out;
2083 if (rdev->mec_fw->size != mec_req_size) {
2084 printk(KERN_ERR
2085 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2086 rdev->mec_fw->size, fw_name);
2087 err = -EINVAL;
2088 }
2089 } else {
2090 err = radeon_ucode_validate(rdev->mec_fw);
2091 if (err) {
2092 printk(KERN_ERR
2093 "cik_fw: validation failed for firmware \"%s\"\n",
2094 fw_name);
2095 goto out;
2096 } else {
2097 new_fw++;
2098 }
Alex Deucher02c81322012-12-18 21:43:07 -05002099 }
2100
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002101 if (rdev->family == CHIP_KAVERI) {
2102 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", new_chip_name);
2103 err = request_firmware(&rdev->mec2_fw, fw_name, rdev->dev);
2104 if (err) {
2105 goto out;
2106 } else {
2107 err = radeon_ucode_validate(rdev->mec2_fw);
2108 if (err) {
2109 goto out;
2110 } else {
2111 new_fw++;
2112 }
2113 }
2114 }
2115
2116 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002117 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002118 if (err) {
2119 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
2120 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
2121 if (err)
2122 goto out;
2123 if (rdev->rlc_fw->size != rlc_req_size) {
2124 printk(KERN_ERR
2125 "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
2126 rdev->rlc_fw->size, fw_name);
2127 err = -EINVAL;
2128 }
2129 } else {
2130 err = radeon_ucode_validate(rdev->rlc_fw);
2131 if (err) {
2132 printk(KERN_ERR
2133 "cik_fw: validation failed for firmware \"%s\"\n",
2134 fw_name);
2135 goto out;
2136 } else {
2137 new_fw++;
2138 }
Alex Deucher02c81322012-12-18 21:43:07 -05002139 }
2140
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002141 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002142 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002143 if (err) {
2144 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
2145 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
2146 if (err)
2147 goto out;
2148 if (rdev->sdma_fw->size != sdma_req_size) {
2149 printk(KERN_ERR
2150 "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
2151 rdev->sdma_fw->size, fw_name);
2152 err = -EINVAL;
2153 }
2154 } else {
2155 err = radeon_ucode_validate(rdev->sdma_fw);
2156 if (err) {
2157 printk(KERN_ERR
2158 "cik_fw: validation failed for firmware \"%s\"\n",
2159 fw_name);
2160 goto out;
2161 } else {
2162 new_fw++;
2163 }
Alex Deucher21a93e12013-04-09 12:47:11 -04002164 }
2165
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002166 /* No SMC, MC ucode on APUs */
Alex Deucher02c81322012-12-18 21:43:07 -05002167 if (!(rdev->flags & RADEON_IS_IGP)) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002168 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002169 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
Alex Deucher277babc2014-04-11 11:21:50 -04002170 if (err) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002171 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
Alex Deucher277babc2014-04-11 11:21:50 -04002172 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002173 if (err) {
2174 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
2175 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
2176 if (err)
2177 goto out;
2178 }
2179 if ((rdev->mc_fw->size != mc_req_size) &&
2180 (rdev->mc_fw->size != mc2_req_size)){
2181 printk(KERN_ERR
2182 "cik_mc: Bogus length %zu in firmware \"%s\"\n",
2183 rdev->mc_fw->size, fw_name);
2184 err = -EINVAL;
2185 }
2186 DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
2187 } else {
2188 err = radeon_ucode_validate(rdev->mc_fw);
2189 if (err) {
2190 printk(KERN_ERR
2191 "cik_fw: validation failed for firmware \"%s\"\n",
2192 fw_name);
Alex Deucher277babc2014-04-11 11:21:50 -04002193 goto out;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002194 } else {
2195 new_fw++;
2196 }
Alex Deucher277babc2014-04-11 11:21:50 -04002197 }
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002198
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002199 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002200 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2201 if (err) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002202 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
2203 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2204 if (err) {
2205 printk(KERN_ERR
2206 "smc: error loading firmware \"%s\"\n",
2207 fw_name);
2208 release_firmware(rdev->smc_fw);
2209 rdev->smc_fw = NULL;
2210 err = 0;
2211 } else if (rdev->smc_fw->size != smc_req_size) {
2212 printk(KERN_ERR
2213 "cik_smc: Bogus length %zu in firmware \"%s\"\n",
2214 rdev->smc_fw->size, fw_name);
2215 err = -EINVAL;
2216 }
2217 } else {
2218 err = radeon_ucode_validate(rdev->smc_fw);
2219 if (err) {
2220 printk(KERN_ERR
2221 "cik_fw: validation failed for firmware \"%s\"\n",
2222 fw_name);
2223 goto out;
2224 } else {
2225 new_fw++;
2226 }
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002227 }
Alex Deucher02c81322012-12-18 21:43:07 -05002228 }
2229
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002230 if (new_fw == 0) {
2231 rdev->new_fw = false;
2232 } else if (new_fw < num_fw) {
2233 printk(KERN_ERR "ci_fw: mixing new and old firmware!\n");
2234 err = -EINVAL;
2235 } else {
2236 rdev->new_fw = true;
2237 }
2238
Alex Deucher02c81322012-12-18 21:43:07 -05002239out:
Alex Deucher02c81322012-12-18 21:43:07 -05002240 if (err) {
2241 if (err != -EINVAL)
2242 printk(KERN_ERR
2243 "cik_cp: Failed to load firmware \"%s\"\n",
2244 fw_name);
2245 release_firmware(rdev->pfp_fw);
2246 rdev->pfp_fw = NULL;
2247 release_firmware(rdev->me_fw);
2248 rdev->me_fw = NULL;
2249 release_firmware(rdev->ce_fw);
2250 rdev->ce_fw = NULL;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002251 release_firmware(rdev->mec_fw);
2252 rdev->mec_fw = NULL;
2253 release_firmware(rdev->mec2_fw);
2254 rdev->mec2_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002255 release_firmware(rdev->rlc_fw);
2256 rdev->rlc_fw = NULL;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002257 release_firmware(rdev->sdma_fw);
2258 rdev->sdma_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002259 release_firmware(rdev->mc_fw);
2260 rdev->mc_fw = NULL;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002261 release_firmware(rdev->smc_fw);
2262 rdev->smc_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002263 }
2264 return err;
2265}
2266
Alex Deucher8cc1a532013-04-09 12:41:24 -04002267/*
2268 * Core functions
2269 */
2270/**
2271 * cik_tiling_mode_table_init - init the hw tiling table
2272 *
2273 * @rdev: radeon_device pointer
2274 *
2275 * Starting with SI, the tiling setup is done globally in a
2276 * set of 32 tiling modes. Rather than selecting each set of
2277 * parameters per surface as on older asics, we just select
2278 * which index in the tiling table we want to use, and the
2279 * surface uses those parameters (CIK).
2280 */
2281static void cik_tiling_mode_table_init(struct radeon_device *rdev)
2282{
2283 const u32 num_tile_mode_states = 32;
2284 const u32 num_secondary_tile_mode_states = 16;
2285 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
2286 u32 num_pipe_configs;
2287 u32 num_rbs = rdev->config.cik.max_backends_per_se *
2288 rdev->config.cik.max_shader_engines;
2289
2290 switch (rdev->config.cik.mem_row_size_in_kb) {
2291 case 1:
2292 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
2293 break;
2294 case 2:
2295 default:
2296 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
2297 break;
2298 case 4:
2299 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
2300 break;
2301 }
2302
2303 num_pipe_configs = rdev->config.cik.max_tile_pipes;
2304 if (num_pipe_configs > 8)
Alex Deucher21e438a2013-08-06 16:58:53 -04002305 num_pipe_configs = 16;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002306
Alex Deucher21e438a2013-08-06 16:58:53 -04002307 if (num_pipe_configs == 16) {
2308 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2309 switch (reg_offset) {
2310 case 0:
2311 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2312 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2313 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2314 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2315 break;
2316 case 1:
2317 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2318 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2319 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2320 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2321 break;
2322 case 2:
2323 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2324 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2325 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2326 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2327 break;
2328 case 3:
2329 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2330 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2331 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2332 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2333 break;
2334 case 4:
2335 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2336 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2337 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2338 TILE_SPLIT(split_equal_to_row_size));
2339 break;
2340 case 5:
2341 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002342 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002343 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2344 break;
2345 case 6:
2346 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2347 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2348 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2349 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2350 break;
2351 case 7:
2352 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2353 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2354 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2355 TILE_SPLIT(split_equal_to_row_size));
2356 break;
2357 case 8:
2358 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2359 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
2360 break;
2361 case 9:
2362 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002363 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002364 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2365 break;
2366 case 10:
2367 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2368 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2369 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2370 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2371 break;
2372 case 11:
2373 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2374 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2375 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2376 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2377 break;
2378 case 12:
2379 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2380 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2381 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2382 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2383 break;
2384 case 13:
2385 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002386 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002387 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2388 break;
2389 case 14:
2390 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2391 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2392 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2393 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2394 break;
2395 case 16:
2396 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2397 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2398 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2399 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2400 break;
2401 case 17:
2402 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2403 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2404 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2405 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2406 break;
2407 case 27:
2408 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002409 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002410 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2411 break;
2412 case 28:
2413 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2414 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2415 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2416 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2417 break;
2418 case 29:
2419 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2420 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2421 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2422 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2423 break;
2424 case 30:
2425 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2426 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2427 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2428 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2429 break;
2430 default:
2431 gb_tile_moden = 0;
2432 break;
2433 }
2434 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
2435 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2436 }
2437 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2438 switch (reg_offset) {
2439 case 0:
2440 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2441 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2442 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2443 NUM_BANKS(ADDR_SURF_16_BANK));
2444 break;
2445 case 1:
2446 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2447 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2448 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2449 NUM_BANKS(ADDR_SURF_16_BANK));
2450 break;
2451 case 2:
2452 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2453 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2454 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2455 NUM_BANKS(ADDR_SURF_16_BANK));
2456 break;
2457 case 3:
2458 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2459 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2460 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2461 NUM_BANKS(ADDR_SURF_16_BANK));
2462 break;
2463 case 4:
2464 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2465 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2466 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2467 NUM_BANKS(ADDR_SURF_8_BANK));
2468 break;
2469 case 5:
2470 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2471 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2472 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2473 NUM_BANKS(ADDR_SURF_4_BANK));
2474 break;
2475 case 6:
2476 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2477 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2478 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2479 NUM_BANKS(ADDR_SURF_2_BANK));
2480 break;
2481 case 8:
2482 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2483 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2484 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2485 NUM_BANKS(ADDR_SURF_16_BANK));
2486 break;
2487 case 9:
2488 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2489 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2490 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2491 NUM_BANKS(ADDR_SURF_16_BANK));
2492 break;
2493 case 10:
2494 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2495 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2496 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2497 NUM_BANKS(ADDR_SURF_16_BANK));
2498 break;
2499 case 11:
2500 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2501 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2502 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2503 NUM_BANKS(ADDR_SURF_8_BANK));
2504 break;
2505 case 12:
2506 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2507 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2508 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2509 NUM_BANKS(ADDR_SURF_4_BANK));
2510 break;
2511 case 13:
2512 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2513 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2514 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2515 NUM_BANKS(ADDR_SURF_2_BANK));
2516 break;
2517 case 14:
2518 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2519 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2520 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2521 NUM_BANKS(ADDR_SURF_2_BANK));
2522 break;
2523 default:
2524 gb_tile_moden = 0;
2525 break;
2526 }
Jerome Glisse1b2c4862014-07-24 16:34:17 -04002527 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher21e438a2013-08-06 16:58:53 -04002528 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2529 }
2530 } else if (num_pipe_configs == 8) {
Alex Deucher8cc1a532013-04-09 12:41:24 -04002531 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2532 switch (reg_offset) {
2533 case 0:
2534 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2535 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2536 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2537 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2538 break;
2539 case 1:
2540 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2541 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2542 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2543 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2544 break;
2545 case 2:
2546 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2547 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2548 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2549 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2550 break;
2551 case 3:
2552 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2553 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2554 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2555 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2556 break;
2557 case 4:
2558 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2559 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2560 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2561 TILE_SPLIT(split_equal_to_row_size));
2562 break;
2563 case 5:
2564 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002565 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002566 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2567 break;
2568 case 6:
2569 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2570 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2571 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2572 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2573 break;
2574 case 7:
2575 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2576 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2577 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2578 TILE_SPLIT(split_equal_to_row_size));
2579 break;
2580 case 8:
2581 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2582 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
2583 break;
2584 case 9:
2585 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002586 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002587 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2588 break;
2589 case 10:
2590 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2591 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2592 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2593 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2594 break;
2595 case 11:
2596 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2597 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2598 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2599 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2600 break;
2601 case 12:
2602 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2603 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2604 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2605 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2606 break;
2607 case 13:
2608 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002609 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002610 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2611 break;
2612 case 14:
2613 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2614 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2615 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2616 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2617 break;
2618 case 16:
2619 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2620 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2621 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2622 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2623 break;
2624 case 17:
2625 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2626 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2627 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2628 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2629 break;
2630 case 27:
2631 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002632 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002633 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2634 break;
2635 case 28:
2636 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2637 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2638 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2639 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2640 break;
2641 case 29:
2642 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2643 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2644 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2645 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2646 break;
2647 case 30:
2648 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2649 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2650 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2651 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2652 break;
2653 default:
2654 gb_tile_moden = 0;
2655 break;
2656 }
Alex Deucher39aee492013-04-10 13:41:25 -04002657 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002658 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2659 }
2660 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2661 switch (reg_offset) {
2662 case 0:
2663 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2664 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2665 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2666 NUM_BANKS(ADDR_SURF_16_BANK));
2667 break;
2668 case 1:
2669 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2670 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2671 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2672 NUM_BANKS(ADDR_SURF_16_BANK));
2673 break;
2674 case 2:
2675 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2676 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2677 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2678 NUM_BANKS(ADDR_SURF_16_BANK));
2679 break;
2680 case 3:
2681 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2682 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2683 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2684 NUM_BANKS(ADDR_SURF_16_BANK));
2685 break;
2686 case 4:
2687 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2688 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2689 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2690 NUM_BANKS(ADDR_SURF_8_BANK));
2691 break;
2692 case 5:
2693 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2694 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2695 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2696 NUM_BANKS(ADDR_SURF_4_BANK));
2697 break;
2698 case 6:
2699 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2700 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2701 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2702 NUM_BANKS(ADDR_SURF_2_BANK));
2703 break;
2704 case 8:
2705 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2706 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2707 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2708 NUM_BANKS(ADDR_SURF_16_BANK));
2709 break;
2710 case 9:
2711 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2712 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2713 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2714 NUM_BANKS(ADDR_SURF_16_BANK));
2715 break;
2716 case 10:
2717 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2718 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2719 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2720 NUM_BANKS(ADDR_SURF_16_BANK));
2721 break;
2722 case 11:
2723 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2724 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2725 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2726 NUM_BANKS(ADDR_SURF_16_BANK));
2727 break;
2728 case 12:
2729 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2730 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2731 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2732 NUM_BANKS(ADDR_SURF_8_BANK));
2733 break;
2734 case 13:
2735 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2736 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2737 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2738 NUM_BANKS(ADDR_SURF_4_BANK));
2739 break;
2740 case 14:
2741 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2742 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2743 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2744 NUM_BANKS(ADDR_SURF_2_BANK));
2745 break;
2746 default:
2747 gb_tile_moden = 0;
2748 break;
2749 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09002750 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002751 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2752 }
2753 } else if (num_pipe_configs == 4) {
2754 if (num_rbs == 4) {
2755 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2756 switch (reg_offset) {
2757 case 0:
2758 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2759 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2760 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2761 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2762 break;
2763 case 1:
2764 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2765 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2766 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2767 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2768 break;
2769 case 2:
2770 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2771 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2772 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2773 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2774 break;
2775 case 3:
2776 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2777 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2778 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2779 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2780 break;
2781 case 4:
2782 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2783 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2784 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2785 TILE_SPLIT(split_equal_to_row_size));
2786 break;
2787 case 5:
2788 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002789 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002790 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2791 break;
2792 case 6:
2793 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2794 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2795 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2796 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2797 break;
2798 case 7:
2799 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2800 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2801 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2802 TILE_SPLIT(split_equal_to_row_size));
2803 break;
2804 case 8:
2805 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2806 PIPE_CONFIG(ADDR_SURF_P4_16x16));
2807 break;
2808 case 9:
2809 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002810 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002811 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2812 break;
2813 case 10:
2814 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2815 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2816 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2817 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2818 break;
2819 case 11:
2820 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2821 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2822 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2823 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2824 break;
2825 case 12:
2826 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2827 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2828 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2829 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2830 break;
2831 case 13:
2832 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002833 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002834 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2835 break;
2836 case 14:
2837 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2838 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2839 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2840 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2841 break;
2842 case 16:
2843 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2844 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2845 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2846 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2847 break;
2848 case 17:
2849 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2850 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2851 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2852 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2853 break;
2854 case 27:
2855 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002856 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002857 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2858 break;
2859 case 28:
2860 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2861 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2862 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2863 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2864 break;
2865 case 29:
2866 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2867 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2868 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2869 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2870 break;
2871 case 30:
2872 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2873 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2874 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2875 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2876 break;
2877 default:
2878 gb_tile_moden = 0;
2879 break;
2880 }
Alex Deucher39aee492013-04-10 13:41:25 -04002881 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002882 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2883 }
2884 } else if (num_rbs < 4) {
2885 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2886 switch (reg_offset) {
2887 case 0:
2888 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2889 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2890 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2891 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2892 break;
2893 case 1:
2894 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2895 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2896 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2897 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2898 break;
2899 case 2:
2900 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2901 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2902 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2903 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2904 break;
2905 case 3:
2906 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2907 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2908 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2909 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2910 break;
2911 case 4:
2912 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2913 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2914 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2915 TILE_SPLIT(split_equal_to_row_size));
2916 break;
2917 case 5:
2918 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002919 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002920 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2921 break;
2922 case 6:
2923 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2924 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2925 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2926 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2927 break;
2928 case 7:
2929 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2930 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2931 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2932 TILE_SPLIT(split_equal_to_row_size));
2933 break;
2934 case 8:
2935 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2936 PIPE_CONFIG(ADDR_SURF_P4_8x16));
2937 break;
2938 case 9:
2939 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002940 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002941 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2942 break;
2943 case 10:
2944 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2945 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2946 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2947 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2948 break;
2949 case 11:
2950 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2951 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2952 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2953 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2954 break;
2955 case 12:
2956 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2957 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2958 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2959 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2960 break;
2961 case 13:
2962 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002963 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002964 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2965 break;
2966 case 14:
2967 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2968 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2969 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2970 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2971 break;
2972 case 16:
2973 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2974 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2975 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2976 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2977 break;
2978 case 17:
2979 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2980 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2981 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2982 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2983 break;
2984 case 27:
2985 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002986 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002987 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2988 break;
2989 case 28:
2990 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2991 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2992 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2993 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2994 break;
2995 case 29:
2996 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2997 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2998 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2999 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3000 break;
3001 case 30:
3002 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3003 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3004 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
3005 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3006 break;
3007 default:
3008 gb_tile_moden = 0;
3009 break;
3010 }
Alex Deucher39aee492013-04-10 13:41:25 -04003011 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003012 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3013 }
3014 }
3015 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3016 switch (reg_offset) {
3017 case 0:
3018 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3019 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3020 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3021 NUM_BANKS(ADDR_SURF_16_BANK));
3022 break;
3023 case 1:
3024 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3025 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3026 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3027 NUM_BANKS(ADDR_SURF_16_BANK));
3028 break;
3029 case 2:
3030 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3031 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3032 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3033 NUM_BANKS(ADDR_SURF_16_BANK));
3034 break;
3035 case 3:
3036 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3037 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3038 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3039 NUM_BANKS(ADDR_SURF_16_BANK));
3040 break;
3041 case 4:
3042 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3043 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3044 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3045 NUM_BANKS(ADDR_SURF_16_BANK));
3046 break;
3047 case 5:
3048 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3049 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3050 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3051 NUM_BANKS(ADDR_SURF_8_BANK));
3052 break;
3053 case 6:
3054 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3055 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3056 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3057 NUM_BANKS(ADDR_SURF_4_BANK));
3058 break;
3059 case 8:
3060 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3061 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3062 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3063 NUM_BANKS(ADDR_SURF_16_BANK));
3064 break;
3065 case 9:
3066 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3067 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3068 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3069 NUM_BANKS(ADDR_SURF_16_BANK));
3070 break;
3071 case 10:
3072 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3073 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3074 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3075 NUM_BANKS(ADDR_SURF_16_BANK));
3076 break;
3077 case 11:
3078 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3079 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3080 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3081 NUM_BANKS(ADDR_SURF_16_BANK));
3082 break;
3083 case 12:
3084 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3085 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3086 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3087 NUM_BANKS(ADDR_SURF_16_BANK));
3088 break;
3089 case 13:
3090 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3091 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3092 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3093 NUM_BANKS(ADDR_SURF_8_BANK));
3094 break;
3095 case 14:
3096 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3097 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3098 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3099 NUM_BANKS(ADDR_SURF_4_BANK));
3100 break;
3101 default:
3102 gb_tile_moden = 0;
3103 break;
3104 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09003105 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003106 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3107 }
3108 } else if (num_pipe_configs == 2) {
3109 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
3110 switch (reg_offset) {
3111 case 0:
3112 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3113 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3114 PIPE_CONFIG(ADDR_SURF_P2) |
3115 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
3116 break;
3117 case 1:
3118 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3119 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3120 PIPE_CONFIG(ADDR_SURF_P2) |
3121 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
3122 break;
3123 case 2:
3124 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3125 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3126 PIPE_CONFIG(ADDR_SURF_P2) |
3127 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3128 break;
3129 case 3:
3130 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3131 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3132 PIPE_CONFIG(ADDR_SURF_P2) |
3133 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
3134 break;
3135 case 4:
3136 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3137 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3138 PIPE_CONFIG(ADDR_SURF_P2) |
3139 TILE_SPLIT(split_equal_to_row_size));
3140 break;
3141 case 5:
3142 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003143 PIPE_CONFIG(ADDR_SURF_P2) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04003144 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3145 break;
3146 case 6:
3147 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3148 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3149 PIPE_CONFIG(ADDR_SURF_P2) |
3150 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3151 break;
3152 case 7:
3153 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3154 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3155 PIPE_CONFIG(ADDR_SURF_P2) |
3156 TILE_SPLIT(split_equal_to_row_size));
3157 break;
3158 case 8:
Marek Olšák020ff542014-03-22 16:20:43 +01003159 gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3160 PIPE_CONFIG(ADDR_SURF_P2);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003161 break;
3162 case 9:
3163 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003164 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3165 PIPE_CONFIG(ADDR_SURF_P2));
Alex Deucher8cc1a532013-04-09 12:41:24 -04003166 break;
3167 case 10:
3168 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3169 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3170 PIPE_CONFIG(ADDR_SURF_P2) |
3171 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3172 break;
3173 case 11:
3174 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3175 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3176 PIPE_CONFIG(ADDR_SURF_P2) |
3177 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3178 break;
3179 case 12:
3180 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3181 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3182 PIPE_CONFIG(ADDR_SURF_P2) |
3183 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3184 break;
3185 case 13:
3186 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003187 PIPE_CONFIG(ADDR_SURF_P2) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04003188 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
3189 break;
3190 case 14:
3191 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3192 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3193 PIPE_CONFIG(ADDR_SURF_P2) |
3194 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3195 break;
3196 case 16:
3197 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3198 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3199 PIPE_CONFIG(ADDR_SURF_P2) |
3200 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3201 break;
3202 case 17:
3203 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3204 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3205 PIPE_CONFIG(ADDR_SURF_P2) |
3206 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3207 break;
3208 case 27:
3209 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003210 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3211 PIPE_CONFIG(ADDR_SURF_P2));
Alex Deucher8cc1a532013-04-09 12:41:24 -04003212 break;
3213 case 28:
3214 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3215 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3216 PIPE_CONFIG(ADDR_SURF_P2) |
3217 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3218 break;
3219 case 29:
3220 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3221 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3222 PIPE_CONFIG(ADDR_SURF_P2) |
3223 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3224 break;
3225 case 30:
3226 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3227 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3228 PIPE_CONFIG(ADDR_SURF_P2) |
3229 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3230 break;
3231 default:
3232 gb_tile_moden = 0;
3233 break;
3234 }
Alex Deucher39aee492013-04-10 13:41:25 -04003235 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003236 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3237 }
3238 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3239 switch (reg_offset) {
3240 case 0:
3241 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3242 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3243 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3244 NUM_BANKS(ADDR_SURF_16_BANK));
3245 break;
3246 case 1:
3247 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3248 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3249 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3250 NUM_BANKS(ADDR_SURF_16_BANK));
3251 break;
3252 case 2:
3253 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3254 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3255 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3256 NUM_BANKS(ADDR_SURF_16_BANK));
3257 break;
3258 case 3:
3259 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3260 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3261 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3262 NUM_BANKS(ADDR_SURF_16_BANK));
3263 break;
3264 case 4:
3265 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3266 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3267 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3268 NUM_BANKS(ADDR_SURF_16_BANK));
3269 break;
3270 case 5:
3271 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3272 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3273 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3274 NUM_BANKS(ADDR_SURF_16_BANK));
3275 break;
3276 case 6:
3277 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3278 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3279 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3280 NUM_BANKS(ADDR_SURF_8_BANK));
3281 break;
3282 case 8:
3283 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3284 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3285 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3286 NUM_BANKS(ADDR_SURF_16_BANK));
3287 break;
3288 case 9:
3289 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3290 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3291 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3292 NUM_BANKS(ADDR_SURF_16_BANK));
3293 break;
3294 case 10:
3295 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3296 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3297 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3298 NUM_BANKS(ADDR_SURF_16_BANK));
3299 break;
3300 case 11:
3301 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3302 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3303 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3304 NUM_BANKS(ADDR_SURF_16_BANK));
3305 break;
3306 case 12:
3307 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3308 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3309 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3310 NUM_BANKS(ADDR_SURF_16_BANK));
3311 break;
3312 case 13:
3313 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3314 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3315 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3316 NUM_BANKS(ADDR_SURF_16_BANK));
3317 break;
3318 case 14:
3319 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3320 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3321 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3322 NUM_BANKS(ADDR_SURF_8_BANK));
3323 break;
3324 default:
3325 gb_tile_moden = 0;
3326 break;
3327 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09003328 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003329 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3330 }
3331 } else
3332 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
3333}
3334
3335/**
3336 * cik_select_se_sh - select which SE, SH to address
3337 *
3338 * @rdev: radeon_device pointer
3339 * @se_num: shader engine to address
3340 * @sh_num: sh block to address
3341 *
3342 * Select which SE, SH combinations to address. Certain
3343 * registers are instanced per SE or SH. 0xffffffff means
3344 * broadcast to all SEs or SHs (CIK).
3345 */
3346static void cik_select_se_sh(struct radeon_device *rdev,
3347 u32 se_num, u32 sh_num)
3348{
3349 u32 data = INSTANCE_BROADCAST_WRITES;
3350
3351 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
Alex Deucherb0fe3d32013-04-18 16:25:47 -04003352 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003353 else if (se_num == 0xffffffff)
3354 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
3355 else if (sh_num == 0xffffffff)
3356 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
3357 else
3358 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
3359 WREG32(GRBM_GFX_INDEX, data);
3360}
3361
3362/**
3363 * cik_create_bitmask - create a bitmask
3364 *
3365 * @bit_width: length of the mask
3366 *
3367 * create a variable length bit mask (CIK).
3368 * Returns the bitmask.
3369 */
3370static u32 cik_create_bitmask(u32 bit_width)
3371{
3372 u32 i, mask = 0;
3373
3374 for (i = 0; i < bit_width; i++) {
3375 mask <<= 1;
3376 mask |= 1;
3377 }
3378 return mask;
3379}
3380
3381/**
Alex Deucher972c5dd2014-03-04 15:50:29 -05003382 * cik_get_rb_disabled - computes the mask of disabled RBs
Alex Deucher8cc1a532013-04-09 12:41:24 -04003383 *
3384 * @rdev: radeon_device pointer
3385 * @max_rb_num: max RBs (render backends) for the asic
3386 * @se_num: number of SEs (shader engines) for the asic
3387 * @sh_per_se: number of SH blocks per SE for the asic
3388 *
3389 * Calculates the bitmask of disabled RBs (CIK).
3390 * Returns the disabled RB bitmask.
3391 */
3392static u32 cik_get_rb_disabled(struct radeon_device *rdev,
Marek Olšák9fadb352013-12-22 02:18:00 +01003393 u32 max_rb_num_per_se,
Alex Deucher8cc1a532013-04-09 12:41:24 -04003394 u32 sh_per_se)
3395{
3396 u32 data, mask;
3397
3398 data = RREG32(CC_RB_BACKEND_DISABLE);
3399 if (data & 1)
3400 data &= BACKEND_DISABLE_MASK;
3401 else
3402 data = 0;
3403 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
3404
3405 data >>= BACKEND_DISABLE_SHIFT;
3406
Marek Olšák9fadb352013-12-22 02:18:00 +01003407 mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003408
3409 return data & mask;
3410}
3411
3412/**
3413 * cik_setup_rb - setup the RBs on the asic
3414 *
3415 * @rdev: radeon_device pointer
3416 * @se_num: number of SEs (shader engines) for the asic
3417 * @sh_per_se: number of SH blocks per SE for the asic
3418 * @max_rb_num: max RBs (render backends) for the asic
3419 *
3420 * Configures per-SE/SH RB registers (CIK).
3421 */
3422static void cik_setup_rb(struct radeon_device *rdev,
3423 u32 se_num, u32 sh_per_se,
Marek Olšák9fadb352013-12-22 02:18:00 +01003424 u32 max_rb_num_per_se)
Alex Deucher8cc1a532013-04-09 12:41:24 -04003425{
3426 int i, j;
3427 u32 data, mask;
3428 u32 disabled_rbs = 0;
3429 u32 enabled_rbs = 0;
3430
3431 for (i = 0; i < se_num; i++) {
3432 for (j = 0; j < sh_per_se; j++) {
3433 cik_select_se_sh(rdev, i, j);
Marek Olšák9fadb352013-12-22 02:18:00 +01003434 data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
Alex Deucherfc821b72013-08-07 20:14:08 -04003435 if (rdev->family == CHIP_HAWAII)
3436 disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
3437 else
3438 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003439 }
3440 }
3441 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3442
3443 mask = 1;
Marek Olšák9fadb352013-12-22 02:18:00 +01003444 for (i = 0; i < max_rb_num_per_se * se_num; i++) {
Alex Deucher8cc1a532013-04-09 12:41:24 -04003445 if (!(disabled_rbs & mask))
3446 enabled_rbs |= mask;
3447 mask <<= 1;
3448 }
3449
Marek Olšák439a1cf2013-12-22 02:18:01 +01003450 rdev->config.cik.backend_enable_mask = enabled_rbs;
3451
Alex Deucher8cc1a532013-04-09 12:41:24 -04003452 for (i = 0; i < se_num; i++) {
3453 cik_select_se_sh(rdev, i, 0xffffffff);
3454 data = 0;
3455 for (j = 0; j < sh_per_se; j++) {
3456 switch (enabled_rbs & 3) {
Alex Deucherfc821b72013-08-07 20:14:08 -04003457 case 0:
3458 if (j == 0)
3459 data |= PKR_MAP(RASTER_CONFIG_RB_MAP_3);
3460 else
3461 data |= PKR_MAP(RASTER_CONFIG_RB_MAP_0);
3462 break;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003463 case 1:
3464 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
3465 break;
3466 case 2:
3467 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
3468 break;
3469 case 3:
3470 default:
3471 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
3472 break;
3473 }
3474 enabled_rbs >>= 2;
3475 }
3476 WREG32(PA_SC_RASTER_CONFIG, data);
3477 }
3478 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3479}
3480
3481/**
3482 * cik_gpu_init - setup the 3D engine
3483 *
3484 * @rdev: radeon_device pointer
3485 *
3486 * Configures the 3D engine and tiling configuration
3487 * registers so that the 3D engine is usable.
3488 */
3489static void cik_gpu_init(struct radeon_device *rdev)
3490{
3491 u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
3492 u32 mc_shared_chmap, mc_arb_ramcfg;
3493 u32 hdp_host_path_cntl;
3494 u32 tmp;
Alex Deucher6101b3a2014-08-19 11:54:15 -04003495 int i, j;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003496
3497 switch (rdev->family) {
3498 case CHIP_BONAIRE:
3499 rdev->config.cik.max_shader_engines = 2;
3500 rdev->config.cik.max_tile_pipes = 4;
3501 rdev->config.cik.max_cu_per_sh = 7;
3502 rdev->config.cik.max_sh_per_se = 1;
3503 rdev->config.cik.max_backends_per_se = 2;
3504 rdev->config.cik.max_texture_channel_caches = 4;
3505 rdev->config.cik.max_gprs = 256;
3506 rdev->config.cik.max_gs_threads = 32;
3507 rdev->config.cik.max_hw_contexts = 8;
3508
3509 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3510 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3511 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3512 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3513 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3514 break;
Alex Deucherb4960382013-08-06 15:42:49 -04003515 case CHIP_HAWAII:
3516 rdev->config.cik.max_shader_engines = 4;
3517 rdev->config.cik.max_tile_pipes = 16;
3518 rdev->config.cik.max_cu_per_sh = 11;
3519 rdev->config.cik.max_sh_per_se = 1;
3520 rdev->config.cik.max_backends_per_se = 4;
3521 rdev->config.cik.max_texture_channel_caches = 16;
3522 rdev->config.cik.max_gprs = 256;
3523 rdev->config.cik.max_gs_threads = 32;
3524 rdev->config.cik.max_hw_contexts = 8;
3525
3526 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3527 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3528 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3529 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3530 gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
3531 break;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003532 case CHIP_KAVERI:
Alex Deucherb2e4c702013-06-10 15:18:26 -04003533 rdev->config.cik.max_shader_engines = 1;
3534 rdev->config.cik.max_tile_pipes = 4;
3535 if ((rdev->pdev->device == 0x1304) ||
3536 (rdev->pdev->device == 0x1305) ||
3537 (rdev->pdev->device == 0x130C) ||
3538 (rdev->pdev->device == 0x130F) ||
3539 (rdev->pdev->device == 0x1310) ||
3540 (rdev->pdev->device == 0x1311) ||
3541 (rdev->pdev->device == 0x131C)) {
3542 rdev->config.cik.max_cu_per_sh = 8;
3543 rdev->config.cik.max_backends_per_se = 2;
3544 } else if ((rdev->pdev->device == 0x1309) ||
3545 (rdev->pdev->device == 0x130A) ||
3546 (rdev->pdev->device == 0x130D) ||
Alex Deucher7c4622d2013-09-04 16:46:07 -04003547 (rdev->pdev->device == 0x1313) ||
3548 (rdev->pdev->device == 0x131D)) {
Alex Deucherb2e4c702013-06-10 15:18:26 -04003549 rdev->config.cik.max_cu_per_sh = 6;
3550 rdev->config.cik.max_backends_per_se = 2;
3551 } else if ((rdev->pdev->device == 0x1306) ||
3552 (rdev->pdev->device == 0x1307) ||
3553 (rdev->pdev->device == 0x130B) ||
3554 (rdev->pdev->device == 0x130E) ||
3555 (rdev->pdev->device == 0x1315) ||
Alex Deucher6dc14ba2014-08-21 10:41:42 -04003556 (rdev->pdev->device == 0x1318) ||
Alex Deucherb2e4c702013-06-10 15:18:26 -04003557 (rdev->pdev->device == 0x131B)) {
3558 rdev->config.cik.max_cu_per_sh = 4;
3559 rdev->config.cik.max_backends_per_se = 1;
3560 } else {
3561 rdev->config.cik.max_cu_per_sh = 3;
3562 rdev->config.cik.max_backends_per_se = 1;
3563 }
3564 rdev->config.cik.max_sh_per_se = 1;
3565 rdev->config.cik.max_texture_channel_caches = 4;
3566 rdev->config.cik.max_gprs = 256;
3567 rdev->config.cik.max_gs_threads = 16;
3568 rdev->config.cik.max_hw_contexts = 8;
3569
3570 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3571 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3572 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3573 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3574 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003575 break;
3576 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04003577 case CHIP_MULLINS:
Alex Deucher8cc1a532013-04-09 12:41:24 -04003578 default:
3579 rdev->config.cik.max_shader_engines = 1;
3580 rdev->config.cik.max_tile_pipes = 2;
3581 rdev->config.cik.max_cu_per_sh = 2;
3582 rdev->config.cik.max_sh_per_se = 1;
3583 rdev->config.cik.max_backends_per_se = 1;
3584 rdev->config.cik.max_texture_channel_caches = 2;
3585 rdev->config.cik.max_gprs = 256;
3586 rdev->config.cik.max_gs_threads = 16;
3587 rdev->config.cik.max_hw_contexts = 8;
3588
3589 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3590 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3591 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3592 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3593 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3594 break;
3595 }
3596
3597 /* Initialize HDP */
3598 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3599 WREG32((0x2c14 + j), 0x00000000);
3600 WREG32((0x2c18 + j), 0x00000000);
3601 WREG32((0x2c1c + j), 0x00000000);
3602 WREG32((0x2c20 + j), 0x00000000);
3603 WREG32((0x2c24 + j), 0x00000000);
3604 }
3605
3606 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3607
3608 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
3609
3610 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3611 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3612
3613 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
3614 rdev->config.cik.mem_max_burst_length_bytes = 256;
3615 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3616 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3617 if (rdev->config.cik.mem_row_size_in_kb > 4)
3618 rdev->config.cik.mem_row_size_in_kb = 4;
3619 /* XXX use MC settings? */
3620 rdev->config.cik.shader_engine_tile_size = 32;
3621 rdev->config.cik.num_gpus = 1;
3622 rdev->config.cik.multi_gpu_tile_size = 64;
3623
3624 /* fix up row size */
3625 gb_addr_config &= ~ROW_SIZE_MASK;
3626 switch (rdev->config.cik.mem_row_size_in_kb) {
3627 case 1:
3628 default:
3629 gb_addr_config |= ROW_SIZE(0);
3630 break;
3631 case 2:
3632 gb_addr_config |= ROW_SIZE(1);
3633 break;
3634 case 4:
3635 gb_addr_config |= ROW_SIZE(2);
3636 break;
3637 }
3638
3639 /* setup tiling info dword. gb_addr_config is not adequate since it does
3640 * not have bank info, so create a custom tiling dword.
3641 * bits 3:0 num_pipes
3642 * bits 7:4 num_banks
3643 * bits 11:8 group_size
3644 * bits 15:12 row_size
3645 */
3646 rdev->config.cik.tile_config = 0;
3647 switch (rdev->config.cik.num_tile_pipes) {
3648 case 1:
3649 rdev->config.cik.tile_config |= (0 << 0);
3650 break;
3651 case 2:
3652 rdev->config.cik.tile_config |= (1 << 0);
3653 break;
3654 case 4:
3655 rdev->config.cik.tile_config |= (2 << 0);
3656 break;
3657 case 8:
3658 default:
3659 /* XXX what about 12? */
3660 rdev->config.cik.tile_config |= (3 << 0);
3661 break;
3662 }
Michel Dänzera5373142013-09-18 15:39:41 +02003663 rdev->config.cik.tile_config |=
3664 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003665 rdev->config.cik.tile_config |=
3666 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3667 rdev->config.cik.tile_config |=
3668 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3669
3670 WREG32(GB_ADDR_CONFIG, gb_addr_config);
3671 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3672 WREG32(DMIF_ADDR_CALC, gb_addr_config);
Alex Deucher21a93e12013-04-09 12:47:11 -04003673 WREG32(SDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
3674 WREG32(SDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
Christian König87167bb2013-04-09 13:39:21 -04003675 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3676 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3677 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003678
3679 cik_tiling_mode_table_init(rdev);
3680
3681 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
3682 rdev->config.cik.max_sh_per_se,
3683 rdev->config.cik.max_backends_per_se);
3684
Alex Deucher52da51f2014-08-19 11:56:38 -04003685 rdev->config.cik.active_cus = 0;
Alex Deucher65fcf662014-06-02 16:13:21 -04003686 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3687 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
Alex Deucher6101b3a2014-08-19 11:54:15 -04003688 rdev->config.cik.active_cus +=
3689 hweight32(cik_get_cu_active_bitmap(rdev, i, j));
Alex Deucher65fcf662014-06-02 16:13:21 -04003690 }
3691 }
3692
Alex Deucher8cc1a532013-04-09 12:41:24 -04003693 /* set HW defaults for 3D engine */
3694 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3695
3696 WREG32(SX_DEBUG_1, 0x20);
3697
3698 WREG32(TA_CNTL_AUX, 0x00010000);
3699
3700 tmp = RREG32(SPI_CONFIG_CNTL);
3701 tmp |= 0x03000000;
3702 WREG32(SPI_CONFIG_CNTL, tmp);
3703
3704 WREG32(SQ_CONFIG, 1);
3705
3706 WREG32(DB_DEBUG, 0);
3707
3708 tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
3709 tmp |= 0x00000400;
3710 WREG32(DB_DEBUG2, tmp);
3711
3712 tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
3713 tmp |= 0x00020200;
3714 WREG32(DB_DEBUG3, tmp);
3715
3716 tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
3717 tmp |= 0x00018208;
3718 WREG32(CB_HW_CONTROL, tmp);
3719
3720 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3721
3722 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
3723 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
3724 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
3725 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
3726
3727 WREG32(VGT_NUM_INSTANCES, 1);
3728
3729 WREG32(CP_PERFMON_CNTL, 0);
3730
3731 WREG32(SQ_CONFIG, 0);
3732
3733 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3734 FORCE_EOV_MAX_REZ_CNT(255)));
3735
3736 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
3737 AUTO_INVLD_EN(ES_AND_GS_AUTO));
3738
3739 WREG32(VGT_GS_VERTEX_REUSE, 16);
3740 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3741
3742 tmp = RREG32(HDP_MISC_CNTL);
3743 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3744 WREG32(HDP_MISC_CNTL, tmp);
3745
3746 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3747 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3748
3749 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3750 WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
3751
3752 udelay(50);
3753}
3754
Alex Deucher841cf442012-12-18 21:47:44 -05003755/*
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003756 * GPU scratch registers helpers function.
3757 */
3758/**
3759 * cik_scratch_init - setup driver info for CP scratch regs
3760 *
3761 * @rdev: radeon_device pointer
3762 *
3763 * Set up the number and offset of the CP scratch registers.
3764 * NOTE: use of CP scratch registers is a legacy inferface and
3765 * is not used by default on newer asics (r6xx+). On newer asics,
3766 * memory buffers are used for fences rather than scratch regs.
3767 */
3768static void cik_scratch_init(struct radeon_device *rdev)
3769{
3770 int i;
3771
3772 rdev->scratch.num_reg = 7;
3773 rdev->scratch.reg_base = SCRATCH_REG0;
3774 for (i = 0; i < rdev->scratch.num_reg; i++) {
3775 rdev->scratch.free[i] = true;
3776 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
3777 }
3778}
3779
3780/**
Alex Deucherfbc832c2012-07-20 14:41:35 -04003781 * cik_ring_test - basic gfx ring test
3782 *
3783 * @rdev: radeon_device pointer
3784 * @ring: radeon_ring structure holding ring information
3785 *
3786 * Allocate a scratch register and write to it using the gfx ring (CIK).
3787 * Provides a basic gfx ring test to verify that the ring is working.
3788 * Used by cik_cp_gfx_resume();
3789 * Returns 0 on success, error on failure.
3790 */
3791int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
3792{
3793 uint32_t scratch;
3794 uint32_t tmp = 0;
3795 unsigned i;
3796 int r;
3797
3798 r = radeon_scratch_get(rdev, &scratch);
3799 if (r) {
3800 DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
3801 return r;
3802 }
3803 WREG32(scratch, 0xCAFEDEAD);
3804 r = radeon_ring_lock(rdev, ring, 3);
3805 if (r) {
3806 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
3807 radeon_scratch_free(rdev, scratch);
3808 return r;
3809 }
3810 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
3811 radeon_ring_write(ring, ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2));
3812 radeon_ring_write(ring, 0xDEADBEEF);
Michel Dänzer1538a9e2014-08-18 17:34:55 +09003813 radeon_ring_unlock_commit(rdev, ring, false);
Alex Deucher963e81f2013-06-26 17:37:11 -04003814
Alex Deucherfbc832c2012-07-20 14:41:35 -04003815 for (i = 0; i < rdev->usec_timeout; i++) {
3816 tmp = RREG32(scratch);
3817 if (tmp == 0xDEADBEEF)
3818 break;
3819 DRM_UDELAY(1);
3820 }
3821 if (i < rdev->usec_timeout) {
3822 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
3823 } else {
3824 DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
3825 ring->idx, scratch, tmp);
3826 r = -EINVAL;
3827 }
3828 radeon_scratch_free(rdev, scratch);
3829 return r;
3830}
3831
3832/**
Alex Deucher780f5dd2014-01-09 16:18:11 -05003833 * cik_hdp_flush_cp_ring_emit - emit an hdp flush on the cp
3834 *
3835 * @rdev: radeon_device pointer
3836 * @ridx: radeon ring index
3837 *
3838 * Emits an hdp flush on the cp.
3839 */
3840static void cik_hdp_flush_cp_ring_emit(struct radeon_device *rdev,
3841 int ridx)
3842{
3843 struct radeon_ring *ring = &rdev->ring[ridx];
Alex Deucher5d259062014-01-09 16:51:56 -05003844 u32 ref_and_mask;
Alex Deucher780f5dd2014-01-09 16:18:11 -05003845
Alex Deucher5d259062014-01-09 16:51:56 -05003846 switch (ring->idx) {
3847 case CAYMAN_RING_TYPE_CP1_INDEX:
3848 case CAYMAN_RING_TYPE_CP2_INDEX:
3849 default:
3850 switch (ring->me) {
3851 case 0:
3852 ref_and_mask = CP2 << ring->pipe;
3853 break;
3854 case 1:
3855 ref_and_mask = CP6 << ring->pipe;
3856 break;
3857 default:
3858 return;
3859 }
3860 break;
3861 case RADEON_RING_TYPE_GFX_INDEX:
3862 ref_and_mask = CP0;
3863 break;
3864 }
3865
3866 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3867 radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
3868 WAIT_REG_MEM_FUNCTION(3) | /* == */
3869 WAIT_REG_MEM_ENGINE(1))); /* pfp */
3870 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ >> 2);
3871 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE >> 2);
3872 radeon_ring_write(ring, ref_and_mask);
3873 radeon_ring_write(ring, ref_and_mask);
3874 radeon_ring_write(ring, 0x20); /* poll interval */
Alex Deucher780f5dd2014-01-09 16:18:11 -05003875}
3876
3877/**
Alex Deucherb07fdd32013-04-11 09:36:17 -04003878 * cik_fence_gfx_ring_emit - emit a fence on the gfx ring
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003879 *
3880 * @rdev: radeon_device pointer
3881 * @fence: radeon fence object
3882 *
3883 * Emits a fence sequnce number on the gfx ring and flushes
3884 * GPU caches.
3885 */
Alex Deucherb07fdd32013-04-11 09:36:17 -04003886void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
3887 struct radeon_fence *fence)
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003888{
3889 struct radeon_ring *ring = &rdev->ring[fence->ring];
3890 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3891
3892 /* EVENT_WRITE_EOP - flush caches, send int */
3893 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3894 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3895 EOP_TC_ACTION_EN |
3896 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3897 EVENT_INDEX(5)));
3898 radeon_ring_write(ring, addr & 0xfffffffc);
3899 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
3900 radeon_ring_write(ring, fence->seq);
3901 radeon_ring_write(ring, 0);
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003902}
3903
Alex Deucherb07fdd32013-04-11 09:36:17 -04003904/**
3905 * cik_fence_compute_ring_emit - emit a fence on the compute ring
3906 *
3907 * @rdev: radeon_device pointer
3908 * @fence: radeon fence object
3909 *
3910 * Emits a fence sequnce number on the compute ring and flushes
3911 * GPU caches.
3912 */
3913void cik_fence_compute_ring_emit(struct radeon_device *rdev,
3914 struct radeon_fence *fence)
3915{
3916 struct radeon_ring *ring = &rdev->ring[fence->ring];
3917 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3918
3919 /* RELEASE_MEM - flush caches, send int */
3920 radeon_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
3921 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3922 EOP_TC_ACTION_EN |
3923 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3924 EVENT_INDEX(5)));
3925 radeon_ring_write(ring, DATA_SEL(1) | INT_SEL(2));
3926 radeon_ring_write(ring, addr & 0xfffffffc);
3927 radeon_ring_write(ring, upper_32_bits(addr));
3928 radeon_ring_write(ring, fence->seq);
3929 radeon_ring_write(ring, 0);
Alex Deucherb07fdd32013-04-11 09:36:17 -04003930}
3931
Christian König86302ee2014-08-18 16:30:12 +02003932/**
3933 * cik_semaphore_ring_emit - emit a semaphore on the CP ring
3934 *
3935 * @rdev: radeon_device pointer
3936 * @ring: radeon ring buffer object
3937 * @semaphore: radeon semaphore object
3938 * @emit_wait: Is this a sempahore wait?
3939 *
3940 * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
3941 * from running ahead of semaphore waits.
3942 */
Christian König1654b812013-11-12 12:58:05 +01003943bool cik_semaphore_ring_emit(struct radeon_device *rdev,
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003944 struct radeon_ring *ring,
3945 struct radeon_semaphore *semaphore,
3946 bool emit_wait)
3947{
3948 uint64_t addr = semaphore->gpu_addr;
3949 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3950
3951 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
Christian König5e167cd2014-06-03 20:51:46 +02003952 radeon_ring_write(ring, lower_32_bits(addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003953 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
Christian König1654b812013-11-12 12:58:05 +01003954
Christian König86302ee2014-08-18 16:30:12 +02003955 if (emit_wait && ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
3956 /* Prevent the PFP from running ahead of the semaphore wait */
3957 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
3958 radeon_ring_write(ring, 0x0);
3959 }
3960
Christian König1654b812013-11-12 12:58:05 +01003961 return true;
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003962}
3963
Alex Deucherc9dbd702013-10-01 16:36:51 -04003964/**
3965 * cik_copy_cpdma - copy pages using the CP DMA engine
3966 *
3967 * @rdev: radeon_device pointer
3968 * @src_offset: src GPU address
3969 * @dst_offset: dst GPU address
3970 * @num_gpu_pages: number of GPU pages to xfer
Christian König57d20a42014-09-04 20:01:53 +02003971 * @resv: reservation object to sync to
Alex Deucherc9dbd702013-10-01 16:36:51 -04003972 *
3973 * Copy GPU paging using the CP DMA engine (CIK+).
3974 * Used by the radeon ttm implementation to move pages if
3975 * registered as the asic copy callback.
3976 */
Christian König57d20a42014-09-04 20:01:53 +02003977struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
3978 uint64_t src_offset, uint64_t dst_offset,
3979 unsigned num_gpu_pages,
3980 struct reservation_object *resv)
Alex Deucherc9dbd702013-10-01 16:36:51 -04003981{
3982 struct radeon_semaphore *sem = NULL;
Christian König57d20a42014-09-04 20:01:53 +02003983 struct radeon_fence *fence;
Alex Deucherc9dbd702013-10-01 16:36:51 -04003984 int ring_index = rdev->asic->copy.blit_ring_index;
3985 struct radeon_ring *ring = &rdev->ring[ring_index];
3986 u32 size_in_bytes, cur_size_in_bytes, control;
3987 int i, num_loops;
3988 int r = 0;
3989
3990 r = radeon_semaphore_create(rdev, &sem);
3991 if (r) {
3992 DRM_ERROR("radeon: moving bo (%d).\n", r);
Christian König57d20a42014-09-04 20:01:53 +02003993 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04003994 }
3995
3996 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3997 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
3998 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 18);
3999 if (r) {
4000 DRM_ERROR("radeon: moving bo (%d).\n", r);
4001 radeon_semaphore_free(rdev, &sem, NULL);
Christian König57d20a42014-09-04 20:01:53 +02004002 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004003 }
4004
Maarten Lankhorst392a2502014-09-25 12:39:38 +02004005 radeon_semaphore_sync_resv(rdev, sem, resv, false);
Christian König1654b812013-11-12 12:58:05 +01004006 radeon_semaphore_sync_rings(rdev, sem, ring->idx);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004007
4008 for (i = 0; i < num_loops; i++) {
4009 cur_size_in_bytes = size_in_bytes;
4010 if (cur_size_in_bytes > 0x1fffff)
4011 cur_size_in_bytes = 0x1fffff;
4012 size_in_bytes -= cur_size_in_bytes;
4013 control = 0;
4014 if (size_in_bytes == 0)
4015 control |= PACKET3_DMA_DATA_CP_SYNC;
4016 radeon_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
4017 radeon_ring_write(ring, control);
4018 radeon_ring_write(ring, lower_32_bits(src_offset));
4019 radeon_ring_write(ring, upper_32_bits(src_offset));
4020 radeon_ring_write(ring, lower_32_bits(dst_offset));
4021 radeon_ring_write(ring, upper_32_bits(dst_offset));
4022 radeon_ring_write(ring, cur_size_in_bytes);
4023 src_offset += cur_size_in_bytes;
4024 dst_offset += cur_size_in_bytes;
4025 }
4026
Christian König57d20a42014-09-04 20:01:53 +02004027 r = radeon_fence_emit(rdev, &fence, ring->idx);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004028 if (r) {
4029 radeon_ring_unlock_undo(rdev, ring);
Maarten Lankhorstaa4c8b32014-04-24 13:29:14 +02004030 radeon_semaphore_free(rdev, &sem, NULL);
Christian König57d20a42014-09-04 20:01:53 +02004031 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004032 }
4033
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004034 radeon_ring_unlock_commit(rdev, ring, false);
Christian König57d20a42014-09-04 20:01:53 +02004035 radeon_semaphore_free(rdev, &sem, fence);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004036
Christian König57d20a42014-09-04 20:01:53 +02004037 return fence;
Alex Deucherc9dbd702013-10-01 16:36:51 -04004038}
4039
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004040/*
4041 * IB stuff
4042 */
4043/**
4044 * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
4045 *
4046 * @rdev: radeon_device pointer
4047 * @ib: radeon indirect buffer object
4048 *
4049 * Emits an DE (drawing engine) or CE (constant engine) IB
4050 * on the gfx ring. IBs are usually generated by userspace
4051 * acceleration drivers and submitted to the kernel for
4052 * sheduling on the ring. This function schedules the IB
4053 * on the gfx ring for execution by the GPU.
4054 */
4055void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
4056{
4057 struct radeon_ring *ring = &rdev->ring[ib->ring];
4058 u32 header, control = INDIRECT_BUFFER_VALID;
4059
4060 if (ib->is_const_ib) {
4061 /* set switch buffer packet before const IB */
4062 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
4063 radeon_ring_write(ring, 0);
4064
4065 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
4066 } else {
4067 u32 next_rptr;
4068 if (ring->rptr_save_reg) {
4069 next_rptr = ring->wptr + 3 + 4;
4070 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
4071 radeon_ring_write(ring, ((ring->rptr_save_reg -
4072 PACKET3_SET_UCONFIG_REG_START) >> 2));
4073 radeon_ring_write(ring, next_rptr);
4074 } else if (rdev->wb.enabled) {
4075 next_rptr = ring->wptr + 5 + 4;
4076 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4077 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
4078 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
Christian König5e167cd2014-06-03 20:51:46 +02004079 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004080 radeon_ring_write(ring, next_rptr);
4081 }
4082
4083 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
4084 }
4085
4086 control |= ib->length_dw |
4087 (ib->vm ? (ib->vm->id << 24) : 0);
4088
4089 radeon_ring_write(ring, header);
4090 radeon_ring_write(ring,
4091#ifdef __BIG_ENDIAN
4092 (2 << 0) |
4093#endif
4094 (ib->gpu_addr & 0xFFFFFFFC));
4095 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
4096 radeon_ring_write(ring, control);
4097}
4098
Alex Deucherfbc832c2012-07-20 14:41:35 -04004099/**
4100 * cik_ib_test - basic gfx ring IB test
4101 *
4102 * @rdev: radeon_device pointer
4103 * @ring: radeon_ring structure holding ring information
4104 *
4105 * Allocate an IB and execute it on the gfx ring (CIK).
4106 * Provides a basic gfx ring test to verify that IBs are working.
4107 * Returns 0 on success, error on failure.
4108 */
4109int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
4110{
4111 struct radeon_ib ib;
4112 uint32_t scratch;
4113 uint32_t tmp = 0;
4114 unsigned i;
4115 int r;
4116
4117 r = radeon_scratch_get(rdev, &scratch);
4118 if (r) {
4119 DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
4120 return r;
4121 }
4122 WREG32(scratch, 0xCAFEDEAD);
4123 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
4124 if (r) {
4125 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004126 radeon_scratch_free(rdev, scratch);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004127 return r;
4128 }
4129 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
4130 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
4131 ib.ptr[2] = 0xDEADBEEF;
4132 ib.length_dw = 3;
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004133 r = radeon_ib_schedule(rdev, &ib, NULL, false);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004134 if (r) {
4135 radeon_scratch_free(rdev, scratch);
4136 radeon_ib_free(rdev, &ib);
4137 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
4138 return r;
4139 }
4140 r = radeon_fence_wait(ib.fence, false);
4141 if (r) {
4142 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004143 radeon_scratch_free(rdev, scratch);
4144 radeon_ib_free(rdev, &ib);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004145 return r;
4146 }
4147 for (i = 0; i < rdev->usec_timeout; i++) {
4148 tmp = RREG32(scratch);
4149 if (tmp == 0xDEADBEEF)
4150 break;
4151 DRM_UDELAY(1);
4152 }
4153 if (i < rdev->usec_timeout) {
4154 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
4155 } else {
4156 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
4157 scratch, tmp);
4158 r = -EINVAL;
4159 }
4160 radeon_scratch_free(rdev, scratch);
4161 radeon_ib_free(rdev, &ib);
4162 return r;
4163}
4164
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004165/*
Alex Deucher841cf442012-12-18 21:47:44 -05004166 * CP.
4167 * On CIK, gfx and compute now have independant command processors.
4168 *
4169 * GFX
4170 * Gfx consists of a single ring and can process both gfx jobs and
4171 * compute jobs. The gfx CP consists of three microengines (ME):
4172 * PFP - Pre-Fetch Parser
4173 * ME - Micro Engine
4174 * CE - Constant Engine
4175 * The PFP and ME make up what is considered the Drawing Engine (DE).
4176 * The CE is an asynchronous engine used for updating buffer desciptors
4177 * used by the DE so that they can be loaded into cache in parallel
4178 * while the DE is processing state update packets.
4179 *
4180 * Compute
4181 * The compute CP consists of two microengines (ME):
4182 * MEC1 - Compute MicroEngine 1
4183 * MEC2 - Compute MicroEngine 2
4184 * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
4185 * The queues are exposed to userspace and are programmed directly
4186 * by the compute runtime.
4187 */
4188/**
4189 * cik_cp_gfx_enable - enable/disable the gfx CP MEs
4190 *
4191 * @rdev: radeon_device pointer
4192 * @enable: enable or disable the MEs
4193 *
4194 * Halts or unhalts the gfx MEs.
4195 */
4196static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
4197{
4198 if (enable)
4199 WREG32(CP_ME_CNTL, 0);
4200 else {
Alex Deucher50efa512014-01-27 11:26:33 -05004201 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4202 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
Alex Deucher841cf442012-12-18 21:47:44 -05004203 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
4204 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4205 }
4206 udelay(50);
4207}
4208
4209/**
4210 * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
4211 *
4212 * @rdev: radeon_device pointer
4213 *
4214 * Loads the gfx PFP, ME, and CE ucode.
4215 * Returns 0 for success, -EINVAL if the ucode is not available.
4216 */
4217static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
4218{
Alex Deucher841cf442012-12-18 21:47:44 -05004219 int i;
4220
4221 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
4222 return -EINVAL;
4223
4224 cik_cp_gfx_enable(rdev, false);
4225
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004226 if (rdev->new_fw) {
4227 const struct gfx_firmware_header_v1_0 *pfp_hdr =
4228 (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
4229 const struct gfx_firmware_header_v1_0 *ce_hdr =
4230 (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
4231 const struct gfx_firmware_header_v1_0 *me_hdr =
4232 (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
4233 const __le32 *fw_data;
4234 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004235
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004236 radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
4237 radeon_ucode_print_gfx_hdr(&ce_hdr->header);
4238 radeon_ucode_print_gfx_hdr(&me_hdr->header);
Alex Deucher841cf442012-12-18 21:47:44 -05004239
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004240 /* PFP */
4241 fw_data = (const __le32 *)
4242 (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
4243 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
4244 WREG32(CP_PFP_UCODE_ADDR, 0);
4245 for (i = 0; i < fw_size; i++)
4246 WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04004247 WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004248
4249 /* CE */
4250 fw_data = (const __le32 *)
4251 (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
4252 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
4253 WREG32(CP_CE_UCODE_ADDR, 0);
4254 for (i = 0; i < fw_size; i++)
4255 WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04004256 WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004257
4258 /* ME */
4259 fw_data = (const __be32 *)
4260 (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
4261 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
4262 WREG32(CP_ME_RAM_WADDR, 0);
4263 for (i = 0; i < fw_size; i++)
4264 WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04004265 WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version));
4266 WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004267 } else {
4268 const __be32 *fw_data;
4269
4270 /* PFP */
4271 fw_data = (const __be32 *)rdev->pfp_fw->data;
4272 WREG32(CP_PFP_UCODE_ADDR, 0);
4273 for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
4274 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
4275 WREG32(CP_PFP_UCODE_ADDR, 0);
4276
4277 /* CE */
4278 fw_data = (const __be32 *)rdev->ce_fw->data;
4279 WREG32(CP_CE_UCODE_ADDR, 0);
4280 for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
4281 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
4282 WREG32(CP_CE_UCODE_ADDR, 0);
4283
4284 /* ME */
4285 fw_data = (const __be32 *)rdev->me_fw->data;
4286 WREG32(CP_ME_RAM_WADDR, 0);
4287 for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
4288 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
4289 WREG32(CP_ME_RAM_WADDR, 0);
4290 }
Alex Deucher841cf442012-12-18 21:47:44 -05004291
Alex Deucher841cf442012-12-18 21:47:44 -05004292 return 0;
4293}
4294
4295/**
4296 * cik_cp_gfx_start - start the gfx ring
4297 *
4298 * @rdev: radeon_device pointer
4299 *
4300 * Enables the ring and loads the clear state context and other
4301 * packets required to init the ring.
4302 * Returns 0 for success, error for failure.
4303 */
4304static int cik_cp_gfx_start(struct radeon_device *rdev)
4305{
4306 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4307 int r, i;
4308
4309 /* init the CP */
4310 WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
4311 WREG32(CP_ENDIAN_SWAP, 0);
4312 WREG32(CP_DEVICE_ID, 1);
4313
4314 cik_cp_gfx_enable(rdev, true);
4315
4316 r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
4317 if (r) {
4318 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
4319 return r;
4320 }
4321
4322 /* init the CE partitions. CE only used for gfx on CIK */
4323 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
4324 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
4325 radeon_ring_write(ring, 0xc000);
4326 radeon_ring_write(ring, 0xc000);
4327
4328 /* setup clear context state */
4329 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4330 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
4331
4332 radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
4333 radeon_ring_write(ring, 0x80000000);
4334 radeon_ring_write(ring, 0x80000000);
4335
4336 for (i = 0; i < cik_default_size; i++)
4337 radeon_ring_write(ring, cik_default_state[i]);
4338
4339 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4340 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
4341
4342 /* set clear context state */
4343 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
4344 radeon_ring_write(ring, 0);
4345
4346 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
4347 radeon_ring_write(ring, 0x00000316);
4348 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
4349 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
4350
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004351 radeon_ring_unlock_commit(rdev, ring, false);
Alex Deucher841cf442012-12-18 21:47:44 -05004352
4353 return 0;
4354}
4355
4356/**
4357 * cik_cp_gfx_fini - stop the gfx ring
4358 *
4359 * @rdev: radeon_device pointer
4360 *
4361 * Stop the gfx ring and tear down the driver ring
4362 * info.
4363 */
4364static void cik_cp_gfx_fini(struct radeon_device *rdev)
4365{
4366 cik_cp_gfx_enable(rdev, false);
4367 radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4368}
4369
4370/**
4371 * cik_cp_gfx_resume - setup the gfx ring buffer registers
4372 *
4373 * @rdev: radeon_device pointer
4374 *
4375 * Program the location and size of the gfx ring buffer
4376 * and test it to make sure it's working.
4377 * Returns 0 for success, error for failure.
4378 */
4379static int cik_cp_gfx_resume(struct radeon_device *rdev)
4380{
4381 struct radeon_ring *ring;
4382 u32 tmp;
4383 u32 rb_bufsz;
4384 u64 rb_addr;
4385 int r;
4386
4387 WREG32(CP_SEM_WAIT_TIMER, 0x0);
Alex Deucher939c0d32013-09-30 18:03:06 -04004388 if (rdev->family != CHIP_HAWAII)
4389 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
Alex Deucher841cf442012-12-18 21:47:44 -05004390
4391 /* Set the write pointer delay */
4392 WREG32(CP_RB_WPTR_DELAY, 0);
4393
4394 /* set the RB to use vmid 0 */
4395 WREG32(CP_RB_VMID, 0);
4396
4397 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
4398
4399 /* ring 0 - compute and gfx */
4400 /* Set ring buffer size */
4401 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
Daniel Vetterb72a8922013-07-10 14:11:59 +02004402 rb_bufsz = order_base_2(ring->ring_size / 8);
4403 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
Alex Deucher841cf442012-12-18 21:47:44 -05004404#ifdef __BIG_ENDIAN
4405 tmp |= BUF_SWAP_32BIT;
4406#endif
4407 WREG32(CP_RB0_CNTL, tmp);
4408
4409 /* Initialize the ring buffer's read and write pointers */
4410 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
4411 ring->wptr = 0;
4412 WREG32(CP_RB0_WPTR, ring->wptr);
4413
4414 /* set the wb address wether it's enabled or not */
4415 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
4416 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
4417
4418 /* scratch register shadowing is no longer supported */
4419 WREG32(SCRATCH_UMSK, 0);
4420
4421 if (!rdev->wb.enabled)
4422 tmp |= RB_NO_UPDATE;
4423
4424 mdelay(1);
4425 WREG32(CP_RB0_CNTL, tmp);
4426
4427 rb_addr = ring->gpu_addr >> 8;
4428 WREG32(CP_RB0_BASE, rb_addr);
4429 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
4430
Alex Deucher841cf442012-12-18 21:47:44 -05004431 /* start the ring */
4432 cik_cp_gfx_start(rdev);
4433 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
4434 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4435 if (r) {
4436 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4437 return r;
4438 }
Alex Deucher50efa512014-01-27 11:26:33 -05004439
4440 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4441 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
4442
Alex Deucher841cf442012-12-18 21:47:44 -05004443 return 0;
4444}
4445
Alex Deucherea31bf62013-12-09 19:44:30 -05004446u32 cik_gfx_get_rptr(struct radeon_device *rdev,
4447 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004448{
4449 u32 rptr;
4450
Alex Deucherea31bf62013-12-09 19:44:30 -05004451 if (rdev->wb.enabled)
4452 rptr = rdev->wb.wb[ring->rptr_offs/4];
4453 else
4454 rptr = RREG32(CP_RB0_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04004455
Alex Deucherea31bf62013-12-09 19:44:30 -05004456 return rptr;
4457}
4458
4459u32 cik_gfx_get_wptr(struct radeon_device *rdev,
4460 struct radeon_ring *ring)
4461{
4462 u32 wptr;
4463
4464 wptr = RREG32(CP_RB0_WPTR);
4465
4466 return wptr;
4467}
4468
4469void cik_gfx_set_wptr(struct radeon_device *rdev,
4470 struct radeon_ring *ring)
4471{
4472 WREG32(CP_RB0_WPTR, ring->wptr);
4473 (void)RREG32(CP_RB0_WPTR);
4474}
4475
4476u32 cik_compute_get_rptr(struct radeon_device *rdev,
4477 struct radeon_ring *ring)
4478{
4479 u32 rptr;
Alex Deucher963e81f2013-06-26 17:37:11 -04004480
4481 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004482 rptr = rdev->wb.wb[ring->rptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004483 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004484 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004485 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4486 rptr = RREG32(CP_HQD_PQ_RPTR);
4487 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004488 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004489 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004490
4491 return rptr;
4492}
4493
Alex Deucherea31bf62013-12-09 19:44:30 -05004494u32 cik_compute_get_wptr(struct radeon_device *rdev,
4495 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004496{
4497 u32 wptr;
4498
4499 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004500 /* XXX check if swapping is necessary on BE */
4501 wptr = rdev->wb.wb[ring->wptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004502 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004503 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004504 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4505 wptr = RREG32(CP_HQD_PQ_WPTR);
4506 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004507 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004508 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004509
4510 return wptr;
4511}
4512
Alex Deucherea31bf62013-12-09 19:44:30 -05004513void cik_compute_set_wptr(struct radeon_device *rdev,
4514 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004515{
Alex Deucherea31bf62013-12-09 19:44:30 -05004516 /* XXX check if swapping is necessary on BE */
4517 rdev->wb.wb[ring->wptr_offs/4] = ring->wptr;
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05004518 WDOORBELL32(ring->doorbell_index, ring->wptr);
Alex Deucher963e81f2013-06-26 17:37:11 -04004519}
4520
Alex Deucher841cf442012-12-18 21:47:44 -05004521/**
4522 * cik_cp_compute_enable - enable/disable the compute CP MEs
4523 *
4524 * @rdev: radeon_device pointer
4525 * @enable: enable or disable the MEs
4526 *
4527 * Halts or unhalts the compute MEs.
4528 */
4529static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
4530{
4531 if (enable)
4532 WREG32(CP_MEC_CNTL, 0);
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004533 else {
Alex Deucher841cf442012-12-18 21:47:44 -05004534 WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004535 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
4536 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
4537 }
Alex Deucher841cf442012-12-18 21:47:44 -05004538 udelay(50);
4539}
4540
4541/**
4542 * cik_cp_compute_load_microcode - load the compute CP ME ucode
4543 *
4544 * @rdev: radeon_device pointer
4545 *
4546 * Loads the compute MEC1&2 ucode.
4547 * Returns 0 for success, -EINVAL if the ucode is not available.
4548 */
4549static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
4550{
Alex Deucher841cf442012-12-18 21:47:44 -05004551 int i;
4552
4553 if (!rdev->mec_fw)
4554 return -EINVAL;
4555
4556 cik_cp_compute_enable(rdev, false);
4557
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004558 if (rdev->new_fw) {
4559 const struct gfx_firmware_header_v1_0 *mec_hdr =
4560 (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
4561 const __le32 *fw_data;
4562 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004563
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004564 radeon_ucode_print_gfx_hdr(&mec_hdr->header);
4565
4566 /* MEC1 */
4567 fw_data = (const __le32 *)
4568 (rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
4569 fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
4570 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4571 for (i = 0; i < fw_size; i++)
4572 WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04004573 WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004574
Alex Deucher841cf442012-12-18 21:47:44 -05004575 /* MEC2 */
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004576 if (rdev->family == CHIP_KAVERI) {
4577 const struct gfx_firmware_header_v1_0 *mec2_hdr =
4578 (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
4579
4580 fw_data = (const __le32 *)
4581 (rdev->mec2_fw->data +
4582 le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
4583 fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
4584 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4585 for (i = 0; i < fw_size; i++)
4586 WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04004587 WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004588 }
4589 } else {
4590 const __be32 *fw_data;
4591
4592 /* MEC1 */
Alex Deucher841cf442012-12-18 21:47:44 -05004593 fw_data = (const __be32 *)rdev->mec_fw->data;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004594 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
Alex Deucher841cf442012-12-18 21:47:44 -05004595 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004596 WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
4597 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4598
4599 if (rdev->family == CHIP_KAVERI) {
4600 /* MEC2 */
4601 fw_data = (const __be32 *)rdev->mec_fw->data;
4602 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4603 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
4604 WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
4605 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4606 }
Alex Deucher841cf442012-12-18 21:47:44 -05004607 }
4608
4609 return 0;
4610}
4611
4612/**
4613 * cik_cp_compute_start - start the compute queues
4614 *
4615 * @rdev: radeon_device pointer
4616 *
4617 * Enable the compute queues.
4618 * Returns 0 for success, error for failure.
4619 */
4620static int cik_cp_compute_start(struct radeon_device *rdev)
4621{
Alex Deucher963e81f2013-06-26 17:37:11 -04004622 cik_cp_compute_enable(rdev, true);
4623
Alex Deucher841cf442012-12-18 21:47:44 -05004624 return 0;
4625}
4626
4627/**
4628 * cik_cp_compute_fini - stop the compute queues
4629 *
4630 * @rdev: radeon_device pointer
4631 *
4632 * Stop the compute queues and tear down the driver queue
4633 * info.
4634 */
4635static void cik_cp_compute_fini(struct radeon_device *rdev)
4636{
Alex Deucher963e81f2013-06-26 17:37:11 -04004637 int i, idx, r;
4638
Alex Deucher841cf442012-12-18 21:47:44 -05004639 cik_cp_compute_enable(rdev, false);
Alex Deucher963e81f2013-06-26 17:37:11 -04004640
4641 for (i = 0; i < 2; i++) {
4642 if (i == 0)
4643 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4644 else
4645 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4646
4647 if (rdev->ring[idx].mqd_obj) {
4648 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4649 if (unlikely(r != 0))
4650 dev_warn(rdev->dev, "(%d) reserve MQD bo failed\n", r);
4651
4652 radeon_bo_unpin(rdev->ring[idx].mqd_obj);
4653 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
4654
4655 radeon_bo_unref(&rdev->ring[idx].mqd_obj);
4656 rdev->ring[idx].mqd_obj = NULL;
4657 }
4658 }
Alex Deucher841cf442012-12-18 21:47:44 -05004659}
4660
Alex Deucher963e81f2013-06-26 17:37:11 -04004661static void cik_mec_fini(struct radeon_device *rdev)
4662{
4663 int r;
4664
4665 if (rdev->mec.hpd_eop_obj) {
4666 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4667 if (unlikely(r != 0))
4668 dev_warn(rdev->dev, "(%d) reserve HPD EOP bo failed\n", r);
4669 radeon_bo_unpin(rdev->mec.hpd_eop_obj);
4670 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4671
4672 radeon_bo_unref(&rdev->mec.hpd_eop_obj);
4673 rdev->mec.hpd_eop_obj = NULL;
4674 }
4675}
4676
4677#define MEC_HPD_SIZE 2048
4678
4679static int cik_mec_init(struct radeon_device *rdev)
4680{
4681 int r;
4682 u32 *hpd;
4683
4684 /*
4685 * KV: 2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
4686 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
Oded Gabbay62a7b7f2014-01-16 17:35:44 +02004687 * Nonetheless, we assign only 1 pipe because all other pipes will
4688 * be handled by KFD
Alex Deucher963e81f2013-06-26 17:37:11 -04004689 */
Oded Gabbay62a7b7f2014-01-16 17:35:44 +02004690 rdev->mec.num_mec = 1;
4691 rdev->mec.num_pipe = 1;
Alex Deucher963e81f2013-06-26 17:37:11 -04004692 rdev->mec.num_queue = rdev->mec.num_mec * rdev->mec.num_pipe * 8;
4693
4694 if (rdev->mec.hpd_eop_obj == NULL) {
4695 r = radeon_bo_create(rdev,
4696 rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
4697 PAGE_SIZE, true,
Maarten Lankhorst831b6962014-09-18 14:11:56 +02004698 RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
Alex Deucher963e81f2013-06-26 17:37:11 -04004699 &rdev->mec.hpd_eop_obj);
4700 if (r) {
4701 dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
4702 return r;
4703 }
4704 }
4705
4706 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4707 if (unlikely(r != 0)) {
4708 cik_mec_fini(rdev);
4709 return r;
4710 }
4711 r = radeon_bo_pin(rdev->mec.hpd_eop_obj, RADEON_GEM_DOMAIN_GTT,
4712 &rdev->mec.hpd_eop_gpu_addr);
4713 if (r) {
4714 dev_warn(rdev->dev, "(%d) pin HDP EOP bo failed\n", r);
4715 cik_mec_fini(rdev);
4716 return r;
4717 }
4718 r = radeon_bo_kmap(rdev->mec.hpd_eop_obj, (void **)&hpd);
4719 if (r) {
4720 dev_warn(rdev->dev, "(%d) map HDP EOP bo failed\n", r);
4721 cik_mec_fini(rdev);
4722 return r;
4723 }
4724
4725 /* clear memory. Not sure if this is required or not */
4726 memset(hpd, 0, rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2);
4727
4728 radeon_bo_kunmap(rdev->mec.hpd_eop_obj);
4729 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4730
4731 return 0;
4732}
4733
4734struct hqd_registers
4735{
4736 u32 cp_mqd_base_addr;
4737 u32 cp_mqd_base_addr_hi;
4738 u32 cp_hqd_active;
4739 u32 cp_hqd_vmid;
4740 u32 cp_hqd_persistent_state;
4741 u32 cp_hqd_pipe_priority;
4742 u32 cp_hqd_queue_priority;
4743 u32 cp_hqd_quantum;
4744 u32 cp_hqd_pq_base;
4745 u32 cp_hqd_pq_base_hi;
4746 u32 cp_hqd_pq_rptr;
4747 u32 cp_hqd_pq_rptr_report_addr;
4748 u32 cp_hqd_pq_rptr_report_addr_hi;
4749 u32 cp_hqd_pq_wptr_poll_addr;
4750 u32 cp_hqd_pq_wptr_poll_addr_hi;
4751 u32 cp_hqd_pq_doorbell_control;
4752 u32 cp_hqd_pq_wptr;
4753 u32 cp_hqd_pq_control;
4754 u32 cp_hqd_ib_base_addr;
4755 u32 cp_hqd_ib_base_addr_hi;
4756 u32 cp_hqd_ib_rptr;
4757 u32 cp_hqd_ib_control;
4758 u32 cp_hqd_iq_timer;
4759 u32 cp_hqd_iq_rptr;
4760 u32 cp_hqd_dequeue_request;
4761 u32 cp_hqd_dma_offload;
4762 u32 cp_hqd_sema_cmd;
4763 u32 cp_hqd_msg_type;
4764 u32 cp_hqd_atomic0_preop_lo;
4765 u32 cp_hqd_atomic0_preop_hi;
4766 u32 cp_hqd_atomic1_preop_lo;
4767 u32 cp_hqd_atomic1_preop_hi;
4768 u32 cp_hqd_hq_scheduler0;
4769 u32 cp_hqd_hq_scheduler1;
4770 u32 cp_mqd_control;
4771};
4772
4773struct bonaire_mqd
4774{
4775 u32 header;
4776 u32 dispatch_initiator;
4777 u32 dimensions[3];
4778 u32 start_idx[3];
4779 u32 num_threads[3];
4780 u32 pipeline_stat_enable;
4781 u32 perf_counter_enable;
4782 u32 pgm[2];
4783 u32 tba[2];
4784 u32 tma[2];
4785 u32 pgm_rsrc[2];
4786 u32 vmid;
4787 u32 resource_limits;
4788 u32 static_thread_mgmt01[2];
4789 u32 tmp_ring_size;
4790 u32 static_thread_mgmt23[2];
4791 u32 restart[3];
4792 u32 thread_trace_enable;
4793 u32 reserved1;
4794 u32 user_data[16];
4795 u32 vgtcs_invoke_count[2];
4796 struct hqd_registers queue_state;
4797 u32 dequeue_cntr;
4798 u32 interrupt_queue[64];
4799};
4800
Alex Deucher841cf442012-12-18 21:47:44 -05004801/**
4802 * cik_cp_compute_resume - setup the compute queue registers
4803 *
4804 * @rdev: radeon_device pointer
4805 *
4806 * Program the compute queues and test them to make sure they
4807 * are working.
4808 * Returns 0 for success, error for failure.
4809 */
4810static int cik_cp_compute_resume(struct radeon_device *rdev)
4811{
Alex Deucher370ce452014-09-23 10:20:13 -04004812 int r, i, j, idx;
Alex Deucher963e81f2013-06-26 17:37:11 -04004813 u32 tmp;
4814 bool use_doorbell = true;
4815 u64 hqd_gpu_addr;
4816 u64 mqd_gpu_addr;
4817 u64 eop_gpu_addr;
4818 u64 wb_gpu_addr;
4819 u32 *buf;
4820 struct bonaire_mqd *mqd;
Alex Deucher841cf442012-12-18 21:47:44 -05004821
Alex Deucher841cf442012-12-18 21:47:44 -05004822 r = cik_cp_compute_start(rdev);
4823 if (r)
4824 return r;
Alex Deucher963e81f2013-06-26 17:37:11 -04004825
4826 /* fix up chicken bits */
4827 tmp = RREG32(CP_CPF_DEBUG);
4828 tmp |= (1 << 23);
4829 WREG32(CP_CPF_DEBUG, tmp);
4830
4831 /* init the pipes */
Alex Deucherf61d5b462013-08-06 12:40:16 -04004832 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004833
Oded Gabbay62a7b7f2014-01-16 17:35:44 +02004834 eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr;
Alex Deucher963e81f2013-06-26 17:37:11 -04004835
Alex Deucher963e81f2013-06-26 17:37:11 -04004836 cik_srbm_select(rdev, 0, 0, 0, 0);
Oded Gabbay62a7b7f2014-01-16 17:35:44 +02004837
4838 /* write the EOP addr */
4839 WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
4840 WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
4841
4842 /* set the VMID assigned */
4843 WREG32(CP_HPD_EOP_VMID, 0);
4844
4845 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4846 tmp = RREG32(CP_HPD_EOP_CONTROL);
4847 tmp &= ~EOP_SIZE_MASK;
4848 tmp |= order_base_2(MEC_HPD_SIZE / 8);
4849 WREG32(CP_HPD_EOP_CONTROL, tmp);
4850
Alex Deucherf61d5b462013-08-06 12:40:16 -04004851 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004852
4853 /* init the queues. Just two for now. */
4854 for (i = 0; i < 2; i++) {
4855 if (i == 0)
4856 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4857 else
4858 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4859
4860 if (rdev->ring[idx].mqd_obj == NULL) {
4861 r = radeon_bo_create(rdev,
4862 sizeof(struct bonaire_mqd),
4863 PAGE_SIZE, true,
Michel Dänzer02376d82014-07-17 19:01:08 +09004864 RADEON_GEM_DOMAIN_GTT, 0, NULL,
Maarten Lankhorst831b6962014-09-18 14:11:56 +02004865 NULL, &rdev->ring[idx].mqd_obj);
Alex Deucher963e81f2013-06-26 17:37:11 -04004866 if (r) {
4867 dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
4868 return r;
4869 }
4870 }
4871
4872 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4873 if (unlikely(r != 0)) {
4874 cik_cp_compute_fini(rdev);
4875 return r;
4876 }
4877 r = radeon_bo_pin(rdev->ring[idx].mqd_obj, RADEON_GEM_DOMAIN_GTT,
4878 &mqd_gpu_addr);
4879 if (r) {
4880 dev_warn(rdev->dev, "(%d) pin MQD bo failed\n", r);
4881 cik_cp_compute_fini(rdev);
4882 return r;
4883 }
4884 r = radeon_bo_kmap(rdev->ring[idx].mqd_obj, (void **)&buf);
4885 if (r) {
4886 dev_warn(rdev->dev, "(%d) map MQD bo failed\n", r);
4887 cik_cp_compute_fini(rdev);
4888 return r;
4889 }
4890
Alex Deucher963e81f2013-06-26 17:37:11 -04004891 /* init the mqd struct */
4892 memset(buf, 0, sizeof(struct bonaire_mqd));
4893
4894 mqd = (struct bonaire_mqd *)buf;
4895 mqd->header = 0xC0310800;
4896 mqd->static_thread_mgmt01[0] = 0xffffffff;
4897 mqd->static_thread_mgmt01[1] = 0xffffffff;
4898 mqd->static_thread_mgmt23[0] = 0xffffffff;
4899 mqd->static_thread_mgmt23[1] = 0xffffffff;
4900
Alex Deucherf61d5b462013-08-06 12:40:16 -04004901 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004902 cik_srbm_select(rdev, rdev->ring[idx].me,
4903 rdev->ring[idx].pipe,
4904 rdev->ring[idx].queue, 0);
4905
4906 /* disable wptr polling */
4907 tmp = RREG32(CP_PQ_WPTR_POLL_CNTL);
4908 tmp &= ~WPTR_POLL_EN;
4909 WREG32(CP_PQ_WPTR_POLL_CNTL, tmp);
4910
4911 /* enable doorbell? */
4912 mqd->queue_state.cp_hqd_pq_doorbell_control =
4913 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4914 if (use_doorbell)
4915 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4916 else
4917 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_EN;
4918 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4919 mqd->queue_state.cp_hqd_pq_doorbell_control);
4920
4921 /* disable the queue if it's active */
4922 mqd->queue_state.cp_hqd_dequeue_request = 0;
4923 mqd->queue_state.cp_hqd_pq_rptr = 0;
4924 mqd->queue_state.cp_hqd_pq_wptr= 0;
4925 if (RREG32(CP_HQD_ACTIVE) & 1) {
4926 WREG32(CP_HQD_DEQUEUE_REQUEST, 1);
Alex Deucher370ce452014-09-23 10:20:13 -04004927 for (j = 0; j < rdev->usec_timeout; j++) {
Alex Deucher963e81f2013-06-26 17:37:11 -04004928 if (!(RREG32(CP_HQD_ACTIVE) & 1))
4929 break;
4930 udelay(1);
4931 }
4932 WREG32(CP_HQD_DEQUEUE_REQUEST, mqd->queue_state.cp_hqd_dequeue_request);
4933 WREG32(CP_HQD_PQ_RPTR, mqd->queue_state.cp_hqd_pq_rptr);
4934 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4935 }
4936
4937 /* set the pointer to the MQD */
4938 mqd->queue_state.cp_mqd_base_addr = mqd_gpu_addr & 0xfffffffc;
4939 mqd->queue_state.cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
4940 WREG32(CP_MQD_BASE_ADDR, mqd->queue_state.cp_mqd_base_addr);
4941 WREG32(CP_MQD_BASE_ADDR_HI, mqd->queue_state.cp_mqd_base_addr_hi);
4942 /* set MQD vmid to 0 */
4943 mqd->queue_state.cp_mqd_control = RREG32(CP_MQD_CONTROL);
4944 mqd->queue_state.cp_mqd_control &= ~MQD_VMID_MASK;
4945 WREG32(CP_MQD_CONTROL, mqd->queue_state.cp_mqd_control);
4946
4947 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4948 hqd_gpu_addr = rdev->ring[idx].gpu_addr >> 8;
4949 mqd->queue_state.cp_hqd_pq_base = hqd_gpu_addr;
4950 mqd->queue_state.cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
4951 WREG32(CP_HQD_PQ_BASE, mqd->queue_state.cp_hqd_pq_base);
4952 WREG32(CP_HQD_PQ_BASE_HI, mqd->queue_state.cp_hqd_pq_base_hi);
4953
4954 /* set up the HQD, this is similar to CP_RB0_CNTL */
4955 mqd->queue_state.cp_hqd_pq_control = RREG32(CP_HQD_PQ_CONTROL);
4956 mqd->queue_state.cp_hqd_pq_control &=
4957 ~(QUEUE_SIZE_MASK | RPTR_BLOCK_SIZE_MASK);
4958
4959 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004960 order_base_2(rdev->ring[idx].ring_size / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004961 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004962 (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004963#ifdef __BIG_ENDIAN
4964 mqd->queue_state.cp_hqd_pq_control |= BUF_SWAP_32BIT;
4965#endif
4966 mqd->queue_state.cp_hqd_pq_control &=
4967 ~(UNORD_DISPATCH | ROQ_PQ_IB_FLIP | PQ_VOLATILE);
4968 mqd->queue_state.cp_hqd_pq_control |=
4969 PRIV_STATE | KMD_QUEUE; /* assuming kernel queue control */
4970 WREG32(CP_HQD_PQ_CONTROL, mqd->queue_state.cp_hqd_pq_control);
4971
4972 /* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4973 if (i == 0)
4974 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP1_WPTR_OFFSET;
4975 else
4976 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP2_WPTR_OFFSET;
4977 mqd->queue_state.cp_hqd_pq_wptr_poll_addr = wb_gpu_addr & 0xfffffffc;
4978 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4979 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR, mqd->queue_state.cp_hqd_pq_wptr_poll_addr);
4980 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI,
4981 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi);
4982
4983 /* set the wb address wether it's enabled or not */
4984 if (i == 0)
4985 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET;
4986 else
4987 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET;
4988 mqd->queue_state.cp_hqd_pq_rptr_report_addr = wb_gpu_addr & 0xfffffffc;
4989 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi =
4990 upper_32_bits(wb_gpu_addr) & 0xffff;
4991 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR,
4992 mqd->queue_state.cp_hqd_pq_rptr_report_addr);
4993 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI,
4994 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi);
4995
4996 /* enable the doorbell if requested */
4997 if (use_doorbell) {
4998 mqd->queue_state.cp_hqd_pq_doorbell_control =
4999 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
5000 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_OFFSET_MASK;
5001 mqd->queue_state.cp_hqd_pq_doorbell_control |=
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05005002 DOORBELL_OFFSET(rdev->ring[idx].doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04005003 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
5004 mqd->queue_state.cp_hqd_pq_doorbell_control &=
5005 ~(DOORBELL_SOURCE | DOORBELL_HIT);
5006
5007 } else {
5008 mqd->queue_state.cp_hqd_pq_doorbell_control = 0;
5009 }
5010 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
5011 mqd->queue_state.cp_hqd_pq_doorbell_control);
5012
5013 /* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
5014 rdev->ring[idx].wptr = 0;
5015 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
5016 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
Christian Königff212f22014-02-18 14:52:33 +01005017 mqd->queue_state.cp_hqd_pq_rptr = RREG32(CP_HQD_PQ_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04005018
5019 /* set the vmid for the queue */
5020 mqd->queue_state.cp_hqd_vmid = 0;
5021 WREG32(CP_HQD_VMID, mqd->queue_state.cp_hqd_vmid);
5022
5023 /* activate the queue */
5024 mqd->queue_state.cp_hqd_active = 1;
5025 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
5026
5027 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005028 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04005029
5030 radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
5031 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
5032
5033 rdev->ring[idx].ready = true;
5034 r = radeon_ring_test(rdev, idx, &rdev->ring[idx]);
5035 if (r)
5036 rdev->ring[idx].ready = false;
5037 }
5038
Alex Deucher841cf442012-12-18 21:47:44 -05005039 return 0;
5040}
5041
Alex Deucher841cf442012-12-18 21:47:44 -05005042static void cik_cp_enable(struct radeon_device *rdev, bool enable)
5043{
5044 cik_cp_gfx_enable(rdev, enable);
5045 cik_cp_compute_enable(rdev, enable);
5046}
5047
Alex Deucher841cf442012-12-18 21:47:44 -05005048static int cik_cp_load_microcode(struct radeon_device *rdev)
5049{
5050 int r;
5051
5052 r = cik_cp_gfx_load_microcode(rdev);
5053 if (r)
5054 return r;
5055 r = cik_cp_compute_load_microcode(rdev);
5056 if (r)
5057 return r;
5058
5059 return 0;
5060}
5061
Alex Deucher841cf442012-12-18 21:47:44 -05005062static void cik_cp_fini(struct radeon_device *rdev)
5063{
5064 cik_cp_gfx_fini(rdev);
5065 cik_cp_compute_fini(rdev);
5066}
5067
Alex Deucher841cf442012-12-18 21:47:44 -05005068static int cik_cp_resume(struct radeon_device *rdev)
5069{
5070 int r;
5071
Alex Deucher4214faf2013-09-03 10:17:13 -04005072 cik_enable_gui_idle_interrupt(rdev, false);
5073
Alex Deucher841cf442012-12-18 21:47:44 -05005074 r = cik_cp_load_microcode(rdev);
5075 if (r)
5076 return r;
5077
5078 r = cik_cp_gfx_resume(rdev);
5079 if (r)
5080 return r;
5081 r = cik_cp_compute_resume(rdev);
5082 if (r)
5083 return r;
5084
Alex Deucher4214faf2013-09-03 10:17:13 -04005085 cik_enable_gui_idle_interrupt(rdev, true);
5086
Alex Deucher841cf442012-12-18 21:47:44 -05005087 return 0;
5088}
5089
Alex Deuchercc066712013-04-09 12:59:51 -04005090static void cik_print_gpu_status_regs(struct radeon_device *rdev)
5091{
5092 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
5093 RREG32(GRBM_STATUS));
5094 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
5095 RREG32(GRBM_STATUS2));
5096 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
5097 RREG32(GRBM_STATUS_SE0));
5098 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
5099 RREG32(GRBM_STATUS_SE1));
5100 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
5101 RREG32(GRBM_STATUS_SE2));
5102 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
5103 RREG32(GRBM_STATUS_SE3));
5104 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
5105 RREG32(SRBM_STATUS));
5106 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
5107 RREG32(SRBM_STATUS2));
5108 dev_info(rdev->dev, " SDMA0_STATUS_REG = 0x%08X\n",
5109 RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
5110 dev_info(rdev->dev, " SDMA1_STATUS_REG = 0x%08X\n",
5111 RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
Alex Deucher963e81f2013-06-26 17:37:11 -04005112 dev_info(rdev->dev, " CP_STAT = 0x%08x\n", RREG32(CP_STAT));
5113 dev_info(rdev->dev, " CP_STALLED_STAT1 = 0x%08x\n",
5114 RREG32(CP_STALLED_STAT1));
5115 dev_info(rdev->dev, " CP_STALLED_STAT2 = 0x%08x\n",
5116 RREG32(CP_STALLED_STAT2));
5117 dev_info(rdev->dev, " CP_STALLED_STAT3 = 0x%08x\n",
5118 RREG32(CP_STALLED_STAT3));
5119 dev_info(rdev->dev, " CP_CPF_BUSY_STAT = 0x%08x\n",
5120 RREG32(CP_CPF_BUSY_STAT));
5121 dev_info(rdev->dev, " CP_CPF_STALLED_STAT1 = 0x%08x\n",
5122 RREG32(CP_CPF_STALLED_STAT1));
5123 dev_info(rdev->dev, " CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS));
5124 dev_info(rdev->dev, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT));
5125 dev_info(rdev->dev, " CP_CPC_STALLED_STAT1 = 0x%08x\n",
5126 RREG32(CP_CPC_STALLED_STAT1));
5127 dev_info(rdev->dev, " CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS));
Alex Deuchercc066712013-04-09 12:59:51 -04005128}
5129
Alex Deucher6f2043c2013-04-09 12:43:41 -04005130/**
Alex Deuchercc066712013-04-09 12:59:51 -04005131 * cik_gpu_check_soft_reset - check which blocks are busy
5132 *
5133 * @rdev: radeon_device pointer
5134 *
5135 * Check which blocks are busy and return the relevant reset
5136 * mask to be used by cik_gpu_soft_reset().
5137 * Returns a mask of the blocks to be reset.
5138 */
Christian König2483b4e2013-08-13 11:56:54 +02005139u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
Alex Deuchercc066712013-04-09 12:59:51 -04005140{
5141 u32 reset_mask = 0;
5142 u32 tmp;
5143
5144 /* GRBM_STATUS */
5145 tmp = RREG32(GRBM_STATUS);
5146 if (tmp & (PA_BUSY | SC_BUSY |
5147 BCI_BUSY | SX_BUSY |
5148 TA_BUSY | VGT_BUSY |
5149 DB_BUSY | CB_BUSY |
5150 GDS_BUSY | SPI_BUSY |
5151 IA_BUSY | IA_BUSY_NO_DMA))
5152 reset_mask |= RADEON_RESET_GFX;
5153
5154 if (tmp & (CP_BUSY | CP_COHERENCY_BUSY))
5155 reset_mask |= RADEON_RESET_CP;
5156
5157 /* GRBM_STATUS2 */
5158 tmp = RREG32(GRBM_STATUS2);
5159 if (tmp & RLC_BUSY)
5160 reset_mask |= RADEON_RESET_RLC;
5161
5162 /* SDMA0_STATUS_REG */
5163 tmp = RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET);
5164 if (!(tmp & SDMA_IDLE))
5165 reset_mask |= RADEON_RESET_DMA;
5166
5167 /* SDMA1_STATUS_REG */
5168 tmp = RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
5169 if (!(tmp & SDMA_IDLE))
5170 reset_mask |= RADEON_RESET_DMA1;
5171
5172 /* SRBM_STATUS2 */
5173 tmp = RREG32(SRBM_STATUS2);
5174 if (tmp & SDMA_BUSY)
5175 reset_mask |= RADEON_RESET_DMA;
5176
5177 if (tmp & SDMA1_BUSY)
5178 reset_mask |= RADEON_RESET_DMA1;
5179
5180 /* SRBM_STATUS */
5181 tmp = RREG32(SRBM_STATUS);
5182
5183 if (tmp & IH_BUSY)
5184 reset_mask |= RADEON_RESET_IH;
5185
5186 if (tmp & SEM_BUSY)
5187 reset_mask |= RADEON_RESET_SEM;
5188
5189 if (tmp & GRBM_RQ_PENDING)
5190 reset_mask |= RADEON_RESET_GRBM;
5191
5192 if (tmp & VMC_BUSY)
5193 reset_mask |= RADEON_RESET_VMC;
5194
5195 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
5196 MCC_BUSY | MCD_BUSY))
5197 reset_mask |= RADEON_RESET_MC;
5198
5199 if (evergreen_is_display_hung(rdev))
5200 reset_mask |= RADEON_RESET_DISPLAY;
5201
5202 /* Skip MC reset as it's mostly likely not hung, just busy */
5203 if (reset_mask & RADEON_RESET_MC) {
5204 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
5205 reset_mask &= ~RADEON_RESET_MC;
5206 }
5207
5208 return reset_mask;
5209}
5210
5211/**
5212 * cik_gpu_soft_reset - soft reset GPU
5213 *
5214 * @rdev: radeon_device pointer
5215 * @reset_mask: mask of which blocks to reset
5216 *
5217 * Soft reset the blocks specified in @reset_mask.
5218 */
5219static void cik_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
5220{
5221 struct evergreen_mc_save save;
5222 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5223 u32 tmp;
5224
5225 if (reset_mask == 0)
5226 return;
5227
5228 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
5229
5230 cik_print_gpu_status_regs(rdev);
5231 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
5232 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
5233 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5234 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
5235
Alex Deucherfb2c7f42013-10-02 14:54:44 -04005236 /* disable CG/PG */
5237 cik_fini_pg(rdev);
5238 cik_fini_cg(rdev);
5239
Alex Deuchercc066712013-04-09 12:59:51 -04005240 /* stop the rlc */
5241 cik_rlc_stop(rdev);
5242
5243 /* Disable GFX parsing/prefetching */
5244 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5245
5246 /* Disable MEC parsing/prefetching */
5247 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5248
5249 if (reset_mask & RADEON_RESET_DMA) {
5250 /* sdma0 */
5251 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5252 tmp |= SDMA_HALT;
5253 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5254 }
5255 if (reset_mask & RADEON_RESET_DMA1) {
5256 /* sdma1 */
5257 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5258 tmp |= SDMA_HALT;
5259 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5260 }
5261
5262 evergreen_mc_stop(rdev, &save);
5263 if (evergreen_mc_wait_for_idle(rdev)) {
5264 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5265 }
5266
5267 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP))
5268 grbm_soft_reset = SOFT_RESET_CP | SOFT_RESET_GFX;
5269
5270 if (reset_mask & RADEON_RESET_CP) {
5271 grbm_soft_reset |= SOFT_RESET_CP;
5272
5273 srbm_soft_reset |= SOFT_RESET_GRBM;
5274 }
5275
5276 if (reset_mask & RADEON_RESET_DMA)
5277 srbm_soft_reset |= SOFT_RESET_SDMA;
5278
5279 if (reset_mask & RADEON_RESET_DMA1)
5280 srbm_soft_reset |= SOFT_RESET_SDMA1;
5281
5282 if (reset_mask & RADEON_RESET_DISPLAY)
5283 srbm_soft_reset |= SOFT_RESET_DC;
5284
5285 if (reset_mask & RADEON_RESET_RLC)
5286 grbm_soft_reset |= SOFT_RESET_RLC;
5287
5288 if (reset_mask & RADEON_RESET_SEM)
5289 srbm_soft_reset |= SOFT_RESET_SEM;
5290
5291 if (reset_mask & RADEON_RESET_IH)
5292 srbm_soft_reset |= SOFT_RESET_IH;
5293
5294 if (reset_mask & RADEON_RESET_GRBM)
5295 srbm_soft_reset |= SOFT_RESET_GRBM;
5296
5297 if (reset_mask & RADEON_RESET_VMC)
5298 srbm_soft_reset |= SOFT_RESET_VMC;
5299
5300 if (!(rdev->flags & RADEON_IS_IGP)) {
5301 if (reset_mask & RADEON_RESET_MC)
5302 srbm_soft_reset |= SOFT_RESET_MC;
5303 }
5304
5305 if (grbm_soft_reset) {
5306 tmp = RREG32(GRBM_SOFT_RESET);
5307 tmp |= grbm_soft_reset;
5308 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5309 WREG32(GRBM_SOFT_RESET, tmp);
5310 tmp = RREG32(GRBM_SOFT_RESET);
5311
5312 udelay(50);
5313
5314 tmp &= ~grbm_soft_reset;
5315 WREG32(GRBM_SOFT_RESET, tmp);
5316 tmp = RREG32(GRBM_SOFT_RESET);
5317 }
5318
5319 if (srbm_soft_reset) {
5320 tmp = RREG32(SRBM_SOFT_RESET);
5321 tmp |= srbm_soft_reset;
5322 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5323 WREG32(SRBM_SOFT_RESET, tmp);
5324 tmp = RREG32(SRBM_SOFT_RESET);
5325
5326 udelay(50);
5327
5328 tmp &= ~srbm_soft_reset;
5329 WREG32(SRBM_SOFT_RESET, tmp);
5330 tmp = RREG32(SRBM_SOFT_RESET);
5331 }
5332
5333 /* Wait a little for things to settle down */
5334 udelay(50);
5335
5336 evergreen_mc_resume(rdev, &save);
5337 udelay(50);
5338
5339 cik_print_gpu_status_regs(rdev);
5340}
5341
Alex Deucher0279ed12013-10-02 15:18:14 -04005342struct kv_reset_save_regs {
5343 u32 gmcon_reng_execute;
5344 u32 gmcon_misc;
5345 u32 gmcon_misc3;
5346};
5347
5348static void kv_save_regs_for_reset(struct radeon_device *rdev,
5349 struct kv_reset_save_regs *save)
5350{
5351 save->gmcon_reng_execute = RREG32(GMCON_RENG_EXECUTE);
5352 save->gmcon_misc = RREG32(GMCON_MISC);
5353 save->gmcon_misc3 = RREG32(GMCON_MISC3);
5354
5355 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute & ~RENG_EXECUTE_ON_PWR_UP);
5356 WREG32(GMCON_MISC, save->gmcon_misc & ~(RENG_EXECUTE_ON_REG_UPDATE |
5357 STCTRL_STUTTER_EN));
5358}
5359
5360static void kv_restore_regs_for_reset(struct radeon_device *rdev,
5361 struct kv_reset_save_regs *save)
5362{
5363 int i;
5364
5365 WREG32(GMCON_PGFSM_WRITE, 0);
5366 WREG32(GMCON_PGFSM_CONFIG, 0x200010ff);
5367
5368 for (i = 0; i < 5; i++)
5369 WREG32(GMCON_PGFSM_WRITE, 0);
5370
5371 WREG32(GMCON_PGFSM_WRITE, 0);
5372 WREG32(GMCON_PGFSM_CONFIG, 0x300010ff);
5373
5374 for (i = 0; i < 5; i++)
5375 WREG32(GMCON_PGFSM_WRITE, 0);
5376
5377 WREG32(GMCON_PGFSM_WRITE, 0x210000);
5378 WREG32(GMCON_PGFSM_CONFIG, 0xa00010ff);
5379
5380 for (i = 0; i < 5; i++)
5381 WREG32(GMCON_PGFSM_WRITE, 0);
5382
5383 WREG32(GMCON_PGFSM_WRITE, 0x21003);
5384 WREG32(GMCON_PGFSM_CONFIG, 0xb00010ff);
5385
5386 for (i = 0; i < 5; i++)
5387 WREG32(GMCON_PGFSM_WRITE, 0);
5388
5389 WREG32(GMCON_PGFSM_WRITE, 0x2b00);
5390 WREG32(GMCON_PGFSM_CONFIG, 0xc00010ff);
5391
5392 for (i = 0; i < 5; i++)
5393 WREG32(GMCON_PGFSM_WRITE, 0);
5394
5395 WREG32(GMCON_PGFSM_WRITE, 0);
5396 WREG32(GMCON_PGFSM_CONFIG, 0xd00010ff);
5397
5398 for (i = 0; i < 5; i++)
5399 WREG32(GMCON_PGFSM_WRITE, 0);
5400
5401 WREG32(GMCON_PGFSM_WRITE, 0x420000);
5402 WREG32(GMCON_PGFSM_CONFIG, 0x100010ff);
5403
5404 for (i = 0; i < 5; i++)
5405 WREG32(GMCON_PGFSM_WRITE, 0);
5406
5407 WREG32(GMCON_PGFSM_WRITE, 0x120202);
5408 WREG32(GMCON_PGFSM_CONFIG, 0x500010ff);
5409
5410 for (i = 0; i < 5; i++)
5411 WREG32(GMCON_PGFSM_WRITE, 0);
5412
5413 WREG32(GMCON_PGFSM_WRITE, 0x3e3e36);
5414 WREG32(GMCON_PGFSM_CONFIG, 0x600010ff);
5415
5416 for (i = 0; i < 5; i++)
5417 WREG32(GMCON_PGFSM_WRITE, 0);
5418
5419 WREG32(GMCON_PGFSM_WRITE, 0x373f3e);
5420 WREG32(GMCON_PGFSM_CONFIG, 0x700010ff);
5421
5422 for (i = 0; i < 5; i++)
5423 WREG32(GMCON_PGFSM_WRITE, 0);
5424
5425 WREG32(GMCON_PGFSM_WRITE, 0x3e1332);
5426 WREG32(GMCON_PGFSM_CONFIG, 0xe00010ff);
5427
5428 WREG32(GMCON_MISC3, save->gmcon_misc3);
5429 WREG32(GMCON_MISC, save->gmcon_misc);
5430 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute);
5431}
5432
5433static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
5434{
5435 struct evergreen_mc_save save;
5436 struct kv_reset_save_regs kv_save = { 0 };
5437 u32 tmp, i;
5438
5439 dev_info(rdev->dev, "GPU pci config reset\n");
5440
5441 /* disable dpm? */
5442
5443 /* disable cg/pg */
5444 cik_fini_pg(rdev);
5445 cik_fini_cg(rdev);
5446
5447 /* Disable GFX parsing/prefetching */
5448 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5449
5450 /* Disable MEC parsing/prefetching */
5451 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5452
5453 /* sdma0 */
5454 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5455 tmp |= SDMA_HALT;
5456 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5457 /* sdma1 */
5458 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5459 tmp |= SDMA_HALT;
5460 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5461 /* XXX other engines? */
5462
5463 /* halt the rlc, disable cp internal ints */
5464 cik_rlc_stop(rdev);
5465
5466 udelay(50);
5467
5468 /* disable mem access */
5469 evergreen_mc_stop(rdev, &save);
5470 if (evergreen_mc_wait_for_idle(rdev)) {
5471 dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
5472 }
5473
5474 if (rdev->flags & RADEON_IS_IGP)
5475 kv_save_regs_for_reset(rdev, &kv_save);
5476
5477 /* disable BM */
5478 pci_clear_master(rdev->pdev);
5479 /* reset */
5480 radeon_pci_config_reset(rdev);
5481
5482 udelay(100);
5483
5484 /* wait for asic to come out of reset */
5485 for (i = 0; i < rdev->usec_timeout; i++) {
5486 if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
5487 break;
5488 udelay(1);
5489 }
5490
5491 /* does asic init need to be run first??? */
5492 if (rdev->flags & RADEON_IS_IGP)
5493 kv_restore_regs_for_reset(rdev, &kv_save);
5494}
5495
Alex Deuchercc066712013-04-09 12:59:51 -04005496/**
5497 * cik_asic_reset - soft reset GPU
5498 *
5499 * @rdev: radeon_device pointer
5500 *
5501 * Look up which blocks are hung and attempt
5502 * to reset them.
5503 * Returns 0 for success.
5504 */
5505int cik_asic_reset(struct radeon_device *rdev)
5506{
5507 u32 reset_mask;
5508
5509 reset_mask = cik_gpu_check_soft_reset(rdev);
5510
5511 if (reset_mask)
5512 r600_set_bios_scratch_engine_hung(rdev, true);
5513
Alex Deucher0279ed12013-10-02 15:18:14 -04005514 /* try soft reset */
Alex Deuchercc066712013-04-09 12:59:51 -04005515 cik_gpu_soft_reset(rdev, reset_mask);
5516
5517 reset_mask = cik_gpu_check_soft_reset(rdev);
5518
Alex Deucher0279ed12013-10-02 15:18:14 -04005519 /* try pci config reset */
5520 if (reset_mask && radeon_hard_reset)
5521 cik_gpu_pci_config_reset(rdev);
5522
5523 reset_mask = cik_gpu_check_soft_reset(rdev);
5524
Alex Deuchercc066712013-04-09 12:59:51 -04005525 if (!reset_mask)
5526 r600_set_bios_scratch_engine_hung(rdev, false);
5527
5528 return 0;
5529}
5530
5531/**
5532 * cik_gfx_is_lockup - check if the 3D engine is locked up
Alex Deucher6f2043c2013-04-09 12:43:41 -04005533 *
5534 * @rdev: radeon_device pointer
5535 * @ring: radeon_ring structure holding ring information
5536 *
5537 * Check if the 3D engine is locked up (CIK).
5538 * Returns true if the engine is locked, false if not.
5539 */
Alex Deuchercc066712013-04-09 12:59:51 -04005540bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
Alex Deucher6f2043c2013-04-09 12:43:41 -04005541{
Alex Deuchercc066712013-04-09 12:59:51 -04005542 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005543
Alex Deuchercc066712013-04-09 12:59:51 -04005544 if (!(reset_mask & (RADEON_RESET_GFX |
5545 RADEON_RESET_COMPUTE |
5546 RADEON_RESET_CP))) {
Christian Königff212f22014-02-18 14:52:33 +01005547 radeon_ring_lockup_update(rdev, ring);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005548 return false;
5549 }
Alex Deucher6f2043c2013-04-09 12:43:41 -04005550 return radeon_ring_test_lockup(rdev, ring);
5551}
5552
Alex Deucher1c491652013-04-09 12:45:26 -04005553/* MC */
5554/**
5555 * cik_mc_program - program the GPU memory controller
5556 *
5557 * @rdev: radeon_device pointer
5558 *
5559 * Set the location of vram, gart, and AGP in the GPU's
5560 * physical address space (CIK).
5561 */
5562static void cik_mc_program(struct radeon_device *rdev)
5563{
5564 struct evergreen_mc_save save;
5565 u32 tmp;
5566 int i, j;
5567
5568 /* Initialize HDP */
5569 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
5570 WREG32((0x2c14 + j), 0x00000000);
5571 WREG32((0x2c18 + j), 0x00000000);
5572 WREG32((0x2c1c + j), 0x00000000);
5573 WREG32((0x2c20 + j), 0x00000000);
5574 WREG32((0x2c24 + j), 0x00000000);
5575 }
5576 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
5577
5578 evergreen_mc_stop(rdev, &save);
5579 if (radeon_mc_wait_for_idle(rdev)) {
5580 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5581 }
5582 /* Lockout access through VGA aperture*/
5583 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
5584 /* Update configuration */
5585 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
5586 rdev->mc.vram_start >> 12);
5587 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
5588 rdev->mc.vram_end >> 12);
5589 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
5590 rdev->vram_scratch.gpu_addr >> 12);
5591 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
5592 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
5593 WREG32(MC_VM_FB_LOCATION, tmp);
5594 /* XXX double check these! */
5595 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
5596 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
5597 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
5598 WREG32(MC_VM_AGP_BASE, 0);
5599 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
5600 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
5601 if (radeon_mc_wait_for_idle(rdev)) {
5602 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5603 }
5604 evergreen_mc_resume(rdev, &save);
5605 /* we need to own VRAM, so turn off the VGA renderer here
5606 * to stop it overwriting our objects */
5607 rv515_vga_render_disable(rdev);
5608}
5609
5610/**
5611 * cik_mc_init - initialize the memory controller driver params
5612 *
5613 * @rdev: radeon_device pointer
5614 *
5615 * Look up the amount of vram, vram width, and decide how to place
5616 * vram and gart within the GPU's physical address space (CIK).
5617 * Returns 0 for success.
5618 */
5619static int cik_mc_init(struct radeon_device *rdev)
5620{
5621 u32 tmp;
5622 int chansize, numchan;
5623
5624 /* Get VRAM informations */
5625 rdev->mc.vram_is_ddr = true;
5626 tmp = RREG32(MC_ARB_RAMCFG);
5627 if (tmp & CHANSIZE_MASK) {
5628 chansize = 64;
5629 } else {
5630 chansize = 32;
5631 }
5632 tmp = RREG32(MC_SHARED_CHMAP);
5633 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
5634 case 0:
5635 default:
5636 numchan = 1;
5637 break;
5638 case 1:
5639 numchan = 2;
5640 break;
5641 case 2:
5642 numchan = 4;
5643 break;
5644 case 3:
5645 numchan = 8;
5646 break;
5647 case 4:
5648 numchan = 3;
5649 break;
5650 case 5:
5651 numchan = 6;
5652 break;
5653 case 6:
5654 numchan = 10;
5655 break;
5656 case 7:
5657 numchan = 12;
5658 break;
5659 case 8:
5660 numchan = 16;
5661 break;
5662 }
5663 rdev->mc.vram_width = numchan * chansize;
5664 /* Could aper size report 0 ? */
5665 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
5666 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
5667 /* size in MB on si */
Alex Deucher13c5bfd2013-09-24 10:56:55 -04005668 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
5669 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
Alex Deucher1c491652013-04-09 12:45:26 -04005670 rdev->mc.visible_vram_size = rdev->mc.aper_size;
5671 si_vram_gtt_location(rdev, &rdev->mc);
5672 radeon_update_bandwidth_info(rdev);
5673
5674 return 0;
5675}
5676
5677/*
5678 * GART
5679 * VMID 0 is the physical GPU addresses as used by the kernel.
5680 * VMIDs 1-15 are used for userspace clients and are handled
5681 * by the radeon vm/hsa code.
5682 */
5683/**
5684 * cik_pcie_gart_tlb_flush - gart tlb flush callback
5685 *
5686 * @rdev: radeon_device pointer
5687 *
5688 * Flush the TLB for the VMID 0 page table (CIK).
5689 */
5690void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
5691{
5692 /* flush hdp cache */
5693 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
5694
5695 /* bits 0-15 are the VM contexts0-15 */
5696 WREG32(VM_INVALIDATE_REQUEST, 0x1);
5697}
5698
5699/**
5700 * cik_pcie_gart_enable - gart enable
5701 *
5702 * @rdev: radeon_device pointer
5703 *
5704 * This sets up the TLBs, programs the page tables for VMID0,
5705 * sets up the hw for VMIDs 1-15 which are allocated on
5706 * demand, and sets up the global locations for the LDS, GDS,
5707 * and GPUVM for FSA64 clients (CIK).
5708 * Returns 0 for success, errors for failure.
5709 */
5710static int cik_pcie_gart_enable(struct radeon_device *rdev)
5711{
5712 int r, i;
5713
5714 if (rdev->gart.robj == NULL) {
5715 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
5716 return -EINVAL;
5717 }
5718 r = radeon_gart_table_vram_pin(rdev);
5719 if (r)
5720 return r;
Alex Deucher1c491652013-04-09 12:45:26 -04005721 /* Setup TLB control */
5722 WREG32(MC_VM_MX_L1_TLB_CNTL,
5723 (0xA << 7) |
5724 ENABLE_L1_TLB |
Christian Königec3dbbc2014-05-10 12:17:55 +02005725 ENABLE_L1_FRAGMENT_PROCESSING |
Alex Deucher1c491652013-04-09 12:45:26 -04005726 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5727 ENABLE_ADVANCED_DRIVER_MODEL |
5728 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5729 /* Setup L2 cache */
5730 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
5731 ENABLE_L2_FRAGMENT_PROCESSING |
5732 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5733 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5734 EFFECTIVE_L2_QUEUE_SIZE(7) |
5735 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5736 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
5737 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
Christian Königec3dbbc2014-05-10 12:17:55 +02005738 BANK_SELECT(4) |
5739 L2_CACHE_BIGK_FRAGMENT_SIZE(4));
Alex Deucher1c491652013-04-09 12:45:26 -04005740 /* setup context0 */
5741 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
5742 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
5743 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
5744 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
5745 (u32)(rdev->dummy_page.addr >> 12));
5746 WREG32(VM_CONTEXT0_CNTL2, 0);
5747 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
5748 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
5749
5750 WREG32(0x15D4, 0);
5751 WREG32(0x15D8, 0);
5752 WREG32(0x15DC, 0);
5753
Christian König054e01d2014-08-26 14:45:54 +02005754 /* restore context1-15 */
Alex Deucher1c491652013-04-09 12:45:26 -04005755 /* set vm size, must be a multiple of 4 */
5756 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
5757 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
5758 for (i = 1; i < 16; i++) {
5759 if (i < 8)
5760 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
Christian König054e01d2014-08-26 14:45:54 +02005761 rdev->vm_manager.saved_table_addr[i]);
Alex Deucher1c491652013-04-09 12:45:26 -04005762 else
5763 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
Christian König054e01d2014-08-26 14:45:54 +02005764 rdev->vm_manager.saved_table_addr[i]);
Alex Deucher1c491652013-04-09 12:45:26 -04005765 }
5766
5767 /* enable context1-15 */
5768 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
5769 (u32)(rdev->dummy_page.addr >> 12));
Alex Deuchera00024b2012-09-18 16:06:01 -04005770 WREG32(VM_CONTEXT1_CNTL2, 4);
Alex Deucher1c491652013-04-09 12:45:26 -04005771 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
Christian König4510fb92014-06-05 23:56:50 -04005772 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
Alex Deuchera00024b2012-09-18 16:06:01 -04005773 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5774 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5775 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5776 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5777 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
5778 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
5779 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
5780 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
5781 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
5782 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
5783 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5784 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
Alex Deucher1c491652013-04-09 12:45:26 -04005785
Alex Deucher1c491652013-04-09 12:45:26 -04005786 if (rdev->family == CHIP_KAVERI) {
5787 u32 tmp = RREG32(CHUB_CONTROL);
5788 tmp &= ~BYPASS_VM;
5789 WREG32(CHUB_CONTROL, tmp);
5790 }
5791
5792 /* XXX SH_MEM regs */
5793 /* where to put LDS, scratch, GPUVM in FSA64 space */
Alex Deucherf61d5b462013-08-06 12:40:16 -04005794 mutex_lock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005795 for (i = 0; i < 16; i++) {
Alex Deucherb556b122013-01-29 10:44:22 -05005796 cik_srbm_select(rdev, 0, 0, 0, i);
Alex Deucher21a93e12013-04-09 12:47:11 -04005797 /* CP and shaders */
Alex Deucher1c491652013-04-09 12:45:26 -04005798 WREG32(SH_MEM_CONFIG, 0);
5799 WREG32(SH_MEM_APE1_BASE, 1);
5800 WREG32(SH_MEM_APE1_LIMIT, 0);
5801 WREG32(SH_MEM_BASES, 0);
Alex Deucher21a93e12013-04-09 12:47:11 -04005802 /* SDMA GFX */
5803 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA0_REGISTER_OFFSET, 0);
5804 WREG32(SDMA0_GFX_APE1_CNTL + SDMA0_REGISTER_OFFSET, 0);
5805 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA1_REGISTER_OFFSET, 0);
5806 WREG32(SDMA0_GFX_APE1_CNTL + SDMA1_REGISTER_OFFSET, 0);
5807 /* XXX SDMA RLC - todo */
Alex Deucher1c491652013-04-09 12:45:26 -04005808 }
Alex Deucherb556b122013-01-29 10:44:22 -05005809 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005810 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005811
5812 cik_pcie_gart_tlb_flush(rdev);
5813 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
5814 (unsigned)(rdev->mc.gtt_size >> 20),
5815 (unsigned long long)rdev->gart.table_addr);
5816 rdev->gart.ready = true;
5817 return 0;
5818}
5819
5820/**
5821 * cik_pcie_gart_disable - gart disable
5822 *
5823 * @rdev: radeon_device pointer
5824 *
5825 * This disables all VM page table (CIK).
5826 */
5827static void cik_pcie_gart_disable(struct radeon_device *rdev)
5828{
Christian König054e01d2014-08-26 14:45:54 +02005829 unsigned i;
5830
5831 for (i = 1; i < 16; ++i) {
5832 uint32_t reg;
5833 if (i < 8)
5834 reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2);
5835 else
5836 reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2);
5837 rdev->vm_manager.saved_table_addr[i] = RREG32(reg);
5838 }
5839
Alex Deucher1c491652013-04-09 12:45:26 -04005840 /* Disable all tables */
5841 WREG32(VM_CONTEXT0_CNTL, 0);
5842 WREG32(VM_CONTEXT1_CNTL, 0);
5843 /* Setup TLB control */
5844 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5845 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5846 /* Setup L2 cache */
5847 WREG32(VM_L2_CNTL,
5848 ENABLE_L2_FRAGMENT_PROCESSING |
5849 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5850 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5851 EFFECTIVE_L2_QUEUE_SIZE(7) |
5852 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5853 WREG32(VM_L2_CNTL2, 0);
5854 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
5855 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
5856 radeon_gart_table_vram_unpin(rdev);
5857}
5858
5859/**
5860 * cik_pcie_gart_fini - vm fini callback
5861 *
5862 * @rdev: radeon_device pointer
5863 *
5864 * Tears down the driver GART/VM setup (CIK).
5865 */
5866static void cik_pcie_gart_fini(struct radeon_device *rdev)
5867{
5868 cik_pcie_gart_disable(rdev);
5869 radeon_gart_table_vram_free(rdev);
5870 radeon_gart_fini(rdev);
5871}
5872
5873/* vm parser */
5874/**
5875 * cik_ib_parse - vm ib_parse callback
5876 *
5877 * @rdev: radeon_device pointer
5878 * @ib: indirect buffer pointer
5879 *
5880 * CIK uses hw IB checking so this is a nop (CIK).
5881 */
5882int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
5883{
5884 return 0;
5885}
5886
5887/*
5888 * vm
5889 * VMID 0 is the physical GPU addresses as used by the kernel.
5890 * VMIDs 1-15 are used for userspace clients and are handled
5891 * by the radeon vm/hsa code.
5892 */
5893/**
5894 * cik_vm_init - cik vm init callback
5895 *
5896 * @rdev: radeon_device pointer
5897 *
5898 * Inits cik specific vm parameters (number of VMs, base of vram for
5899 * VMIDs 1-15) (CIK).
5900 * Returns 0 for success.
5901 */
5902int cik_vm_init(struct radeon_device *rdev)
5903{
Oded Gabbay62a7b7f2014-01-16 17:35:44 +02005904 /*
5905 * number of VMs
5906 * VMID 0 is reserved for System
5907 * radeon graphics/compute will use VMIDs 1-7
5908 * amdkfd will use VMIDs 8-15
5909 */
5910 rdev->vm_manager.nvm = RADEON_NUM_OF_VMIDS;
Alex Deucher1c491652013-04-09 12:45:26 -04005911 /* base offset of vram pages */
5912 if (rdev->flags & RADEON_IS_IGP) {
5913 u64 tmp = RREG32(MC_VM_FB_OFFSET);
5914 tmp <<= 22;
5915 rdev->vm_manager.vram_base_offset = tmp;
5916 } else
5917 rdev->vm_manager.vram_base_offset = 0;
5918
5919 return 0;
5920}
5921
5922/**
5923 * cik_vm_fini - cik vm fini callback
5924 *
5925 * @rdev: radeon_device pointer
5926 *
5927 * Tear down any asic specific VM setup (CIK).
5928 */
5929void cik_vm_fini(struct radeon_device *rdev)
5930{
5931}
5932
Alex Deucherf96ab482012-08-31 10:37:47 -04005933/**
Alex Deucher3ec7d112013-06-14 10:42:22 -04005934 * cik_vm_decode_fault - print human readable fault info
5935 *
5936 * @rdev: radeon_device pointer
5937 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
5938 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
5939 *
5940 * Print human readable fault information (CIK).
5941 */
5942static void cik_vm_decode_fault(struct radeon_device *rdev,
5943 u32 status, u32 addr, u32 mc_client)
5944{
Alex Deucher939c0d32013-09-30 18:03:06 -04005945 u32 mc_id;
Alex Deucher3ec7d112013-06-14 10:42:22 -04005946 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
5947 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005948 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
5949 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
Alex Deucher3ec7d112013-06-14 10:42:22 -04005950
Alex Deucher939c0d32013-09-30 18:03:06 -04005951 if (rdev->family == CHIP_HAWAII)
5952 mc_id = (status & HAWAII_MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5953 else
5954 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5955
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005956 printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04005957 protections, vmid, addr,
5958 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005959 block, mc_client, mc_id);
Alex Deucher3ec7d112013-06-14 10:42:22 -04005960}
5961
5962/**
Alex Deucherf96ab482012-08-31 10:37:47 -04005963 * cik_vm_flush - cik vm flush using the CP
5964 *
5965 * @rdev: radeon_device pointer
5966 *
5967 * Update the page table base and flush the VM TLB
5968 * using the CP (CIK).
5969 */
5970void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
5971{
5972 struct radeon_ring *ring = &rdev->ring[ridx];
Christian Königf1d2a262014-07-30 17:18:12 +02005973 int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX);
Alex Deucherf96ab482012-08-31 10:37:47 -04005974
5975 if (vm == NULL)
5976 return;
5977
5978 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Christian Königf1d2a262014-07-30 17:18:12 +02005979 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04005980 WRITE_DATA_DST_SEL(0)));
5981 if (vm->id < 8) {
5982 radeon_ring_write(ring,
5983 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
5984 } else {
5985 radeon_ring_write(ring,
5986 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
5987 }
5988 radeon_ring_write(ring, 0);
5989 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
5990
5991 /* update SH_MEM_* regs */
5992 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04005993 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04005994 WRITE_DATA_DST_SEL(0)));
5995 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
5996 radeon_ring_write(ring, 0);
5997 radeon_ring_write(ring, VMID(vm->id));
5998
5999 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04006000 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04006001 WRITE_DATA_DST_SEL(0)));
6002 radeon_ring_write(ring, SH_MEM_BASES >> 2);
6003 radeon_ring_write(ring, 0);
6004
6005 radeon_ring_write(ring, 0); /* SH_MEM_BASES */
6006 radeon_ring_write(ring, 0); /* SH_MEM_CONFIG */
6007 radeon_ring_write(ring, 1); /* SH_MEM_APE1_BASE */
6008 radeon_ring_write(ring, 0); /* SH_MEM_APE1_LIMIT */
6009
6010 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04006011 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04006012 WRITE_DATA_DST_SEL(0)));
6013 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
6014 radeon_ring_write(ring, 0);
6015 radeon_ring_write(ring, VMID(0));
6016
6017 /* HDP flush */
Alex Deucher780f5dd2014-01-09 16:18:11 -05006018 cik_hdp_flush_cp_ring_emit(rdev, ridx);
Alex Deucherf96ab482012-08-31 10:37:47 -04006019
6020 /* bits 0-15 are the VM contexts0-15 */
6021 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04006022 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04006023 WRITE_DATA_DST_SEL(0)));
6024 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
6025 radeon_ring_write(ring, 0);
6026 radeon_ring_write(ring, 1 << vm->id);
6027
Alex Deucherb07fdd32013-04-11 09:36:17 -04006028 /* compute doesn't have PFP */
Christian Königf1d2a262014-07-30 17:18:12 +02006029 if (usepfp) {
Alex Deucherb07fdd32013-04-11 09:36:17 -04006030 /* sync PFP to ME, otherwise we might get invalid PFP reads */
6031 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6032 radeon_ring_write(ring, 0x0);
6033 }
Alex Deucherf96ab482012-08-31 10:37:47 -04006034}
6035
Alex Deucherf6796ca2012-11-09 10:44:08 -05006036/*
6037 * RLC
6038 * The RLC is a multi-purpose microengine that handles a
6039 * variety of functions, the most important of which is
6040 * the interrupt controller.
6041 */
Alex Deucher866d83d2013-04-15 17:13:29 -04006042static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
6043 bool enable)
Alex Deucherf6796ca2012-11-09 10:44:08 -05006044{
Alex Deucher866d83d2013-04-15 17:13:29 -04006045 u32 tmp = RREG32(CP_INT_CNTL_RING0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006046
Alex Deucher866d83d2013-04-15 17:13:29 -04006047 if (enable)
6048 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6049 else
6050 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006051 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher866d83d2013-04-15 17:13:29 -04006052}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006053
Alex Deucher866d83d2013-04-15 17:13:29 -04006054static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
6055{
6056 u32 tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006057
Alex Deucher866d83d2013-04-15 17:13:29 -04006058 tmp = RREG32(RLC_LB_CNTL);
6059 if (enable)
6060 tmp |= LOAD_BALANCE_ENABLE;
6061 else
6062 tmp &= ~LOAD_BALANCE_ENABLE;
6063 WREG32(RLC_LB_CNTL, tmp);
6064}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006065
Alex Deucher866d83d2013-04-15 17:13:29 -04006066static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
6067{
6068 u32 i, j, k;
6069 u32 mask;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006070
6071 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6072 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6073 cik_select_se_sh(rdev, i, j);
6074 for (k = 0; k < rdev->usec_timeout; k++) {
6075 if (RREG32(RLC_SERDES_CU_MASTER_BUSY) == 0)
6076 break;
6077 udelay(1);
6078 }
6079 }
6080 }
6081 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6082
6083 mask = SE_MASTER_BUSY_MASK | GC_MASTER_BUSY | TC0_MASTER_BUSY | TC1_MASTER_BUSY;
6084 for (k = 0; k < rdev->usec_timeout; k++) {
6085 if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
6086 break;
6087 udelay(1);
6088 }
6089}
6090
Alex Deucher22c775c2013-07-23 09:41:05 -04006091static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
6092{
6093 u32 tmp;
6094
6095 tmp = RREG32(RLC_CNTL);
6096 if (tmp != rlc)
6097 WREG32(RLC_CNTL, rlc);
6098}
6099
6100static u32 cik_halt_rlc(struct radeon_device *rdev)
6101{
6102 u32 data, orig;
6103
6104 orig = data = RREG32(RLC_CNTL);
6105
6106 if (data & RLC_ENABLE) {
6107 u32 i;
6108
6109 data &= ~RLC_ENABLE;
6110 WREG32(RLC_CNTL, data);
6111
6112 for (i = 0; i < rdev->usec_timeout; i++) {
6113 if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
6114 break;
6115 udelay(1);
6116 }
6117
6118 cik_wait_for_rlc_serdes(rdev);
6119 }
6120
6121 return orig;
6122}
6123
Alex Deuchera412fce2013-04-22 20:23:31 -04006124void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
6125{
6126 u32 tmp, i, mask;
6127
6128 tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
6129 WREG32(RLC_GPR_REG2, tmp);
6130
6131 mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
6132 for (i = 0; i < rdev->usec_timeout; i++) {
6133 if ((RREG32(RLC_GPM_STAT) & mask) == mask)
6134 break;
6135 udelay(1);
6136 }
6137
6138 for (i = 0; i < rdev->usec_timeout; i++) {
6139 if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
6140 break;
6141 udelay(1);
6142 }
6143}
6144
6145void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
6146{
6147 u32 tmp;
6148
6149 tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
6150 WREG32(RLC_GPR_REG2, tmp);
6151}
6152
Alex Deucherf6796ca2012-11-09 10:44:08 -05006153/**
Alex Deucher866d83d2013-04-15 17:13:29 -04006154 * cik_rlc_stop - stop the RLC ME
6155 *
6156 * @rdev: radeon_device pointer
6157 *
6158 * Halt the RLC ME (MicroEngine) (CIK).
6159 */
6160static void cik_rlc_stop(struct radeon_device *rdev)
6161{
Alex Deucher22c775c2013-07-23 09:41:05 -04006162 WREG32(RLC_CNTL, 0);
Alex Deucher866d83d2013-04-15 17:13:29 -04006163
6164 cik_enable_gui_idle_interrupt(rdev, false);
6165
Alex Deucher866d83d2013-04-15 17:13:29 -04006166 cik_wait_for_rlc_serdes(rdev);
6167}
6168
Alex Deucherf6796ca2012-11-09 10:44:08 -05006169/**
6170 * cik_rlc_start - start the RLC ME
6171 *
6172 * @rdev: radeon_device pointer
6173 *
6174 * Unhalt the RLC ME (MicroEngine) (CIK).
6175 */
6176static void cik_rlc_start(struct radeon_device *rdev)
6177{
Alex Deucherf6796ca2012-11-09 10:44:08 -05006178 WREG32(RLC_CNTL, RLC_ENABLE);
6179
Alex Deucher866d83d2013-04-15 17:13:29 -04006180 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006181
6182 udelay(50);
6183}
6184
6185/**
6186 * cik_rlc_resume - setup the RLC hw
6187 *
6188 * @rdev: radeon_device pointer
6189 *
6190 * Initialize the RLC registers, load the ucode,
6191 * and start the RLC (CIK).
6192 * Returns 0 for success, -EINVAL if the ucode is not available.
6193 */
6194static int cik_rlc_resume(struct radeon_device *rdev)
6195{
Alex Deucher22c775c2013-07-23 09:41:05 -04006196 u32 i, size, tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006197
6198 if (!rdev->rlc_fw)
6199 return -EINVAL;
6200
Alex Deucherf6796ca2012-11-09 10:44:08 -05006201 cik_rlc_stop(rdev);
6202
Alex Deucher22c775c2013-07-23 09:41:05 -04006203 /* disable CG */
6204 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
6205 WREG32(RLC_CGCG_CGLS_CTRL, tmp);
6206
Alex Deucher866d83d2013-04-15 17:13:29 -04006207 si_rlc_reset(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006208
Alex Deucher22c775c2013-07-23 09:41:05 -04006209 cik_init_pg(rdev);
6210
6211 cik_init_cg(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006212
6213 WREG32(RLC_LB_CNTR_INIT, 0);
6214 WREG32(RLC_LB_CNTR_MAX, 0x00008000);
6215
6216 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6217 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
6218 WREG32(RLC_LB_PARAMS, 0x00600408);
6219 WREG32(RLC_LB_CNTL, 0x80000004);
6220
6221 WREG32(RLC_MC_CNTL, 0);
6222 WREG32(RLC_UCODE_CNTL, 0);
6223
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006224 if (rdev->new_fw) {
6225 const struct rlc_firmware_header_v1_0 *hdr =
6226 (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
6227 const __le32 *fw_data = (const __le32 *)
6228 (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6229
6230 radeon_ucode_print_rlc_hdr(&hdr->header);
6231
6232 size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006233 WREG32(RLC_GPM_UCODE_ADDR, 0);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006234 for (i = 0; i < size; i++)
6235 WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
Alex Deucher38aea072014-09-30 09:51:02 -04006236 WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version));
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006237 } else {
6238 const __be32 *fw_data;
6239
6240 switch (rdev->family) {
6241 case CHIP_BONAIRE:
6242 case CHIP_HAWAII:
6243 default:
6244 size = BONAIRE_RLC_UCODE_SIZE;
6245 break;
6246 case CHIP_KAVERI:
6247 size = KV_RLC_UCODE_SIZE;
6248 break;
6249 case CHIP_KABINI:
6250 size = KB_RLC_UCODE_SIZE;
6251 break;
6252 case CHIP_MULLINS:
6253 size = ML_RLC_UCODE_SIZE;
6254 break;
6255 }
6256
6257 fw_data = (const __be32 *)rdev->rlc_fw->data;
6258 WREG32(RLC_GPM_UCODE_ADDR, 0);
6259 for (i = 0; i < size; i++)
6260 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
6261 WREG32(RLC_GPM_UCODE_ADDR, 0);
6262 }
Alex Deucherf6796ca2012-11-09 10:44:08 -05006263
Alex Deucher866d83d2013-04-15 17:13:29 -04006264 /* XXX - find out what chips support lbpw */
6265 cik_enable_lbpw(rdev, false);
6266
Alex Deucher22c775c2013-07-23 09:41:05 -04006267 if (rdev->family == CHIP_BONAIRE)
6268 WREG32(RLC_DRIVER_DMA_STATUS, 0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006269
6270 cik_rlc_start(rdev);
6271
6272 return 0;
6273}
Alex Deuchera59781b2012-11-09 10:45:57 -05006274
Alex Deucher22c775c2013-07-23 09:41:05 -04006275static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
6276{
6277 u32 data, orig, tmp, tmp2;
6278
6279 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
6280
Alex Deucher473359b2013-08-09 11:18:39 -04006281 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006282 cik_enable_gui_idle_interrupt(rdev, true);
6283
Alex Deucher22c775c2013-07-23 09:41:05 -04006284 tmp = cik_halt_rlc(rdev);
6285
6286 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6287 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6288 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6289 tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
6290 WREG32(RLC_SERDES_WR_CTRL, tmp2);
6291
6292 cik_update_rlc(rdev, tmp);
6293
6294 data |= CGCG_EN | CGLS_EN;
6295 } else {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006296 cik_enable_gui_idle_interrupt(rdev, false);
6297
Alex Deucher22c775c2013-07-23 09:41:05 -04006298 RREG32(CB_CGTT_SCLK_CTRL);
6299 RREG32(CB_CGTT_SCLK_CTRL);
6300 RREG32(CB_CGTT_SCLK_CTRL);
6301 RREG32(CB_CGTT_SCLK_CTRL);
6302
6303 data &= ~(CGCG_EN | CGLS_EN);
6304 }
6305
6306 if (orig != data)
6307 WREG32(RLC_CGCG_CGLS_CTRL, data);
6308
6309}
6310
6311static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
6312{
6313 u32 data, orig, tmp = 0;
6314
Alex Deucher473359b2013-08-09 11:18:39 -04006315 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
6316 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
6317 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
6318 orig = data = RREG32(CP_MEM_SLP_CNTL);
6319 data |= CP_MEM_LS_EN;
6320 if (orig != data)
6321 WREG32(CP_MEM_SLP_CNTL, data);
6322 }
6323 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006324
6325 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6326 data &= 0xfffffffd;
6327 if (orig != data)
6328 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6329
6330 tmp = cik_halt_rlc(rdev);
6331
6332 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6333 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6334 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6335 data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
6336 WREG32(RLC_SERDES_WR_CTRL, data);
6337
6338 cik_update_rlc(rdev, tmp);
6339
Alex Deucher473359b2013-08-09 11:18:39 -04006340 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
6341 orig = data = RREG32(CGTS_SM_CTRL_REG);
6342 data &= ~SM_MODE_MASK;
6343 data |= SM_MODE(0x2);
6344 data |= SM_MODE_ENABLE;
6345 data &= ~CGTS_OVERRIDE;
6346 if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
6347 (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
6348 data &= ~CGTS_LS_OVERRIDE;
6349 data &= ~ON_MONITOR_ADD_MASK;
6350 data |= ON_MONITOR_ADD_EN;
6351 data |= ON_MONITOR_ADD(0x96);
6352 if (orig != data)
6353 WREG32(CGTS_SM_CTRL_REG, data);
6354 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006355 } else {
6356 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6357 data |= 0x00000002;
6358 if (orig != data)
6359 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6360
6361 data = RREG32(RLC_MEM_SLP_CNTL);
6362 if (data & RLC_MEM_LS_EN) {
6363 data &= ~RLC_MEM_LS_EN;
6364 WREG32(RLC_MEM_SLP_CNTL, data);
6365 }
6366
6367 data = RREG32(CP_MEM_SLP_CNTL);
6368 if (data & CP_MEM_LS_EN) {
6369 data &= ~CP_MEM_LS_EN;
6370 WREG32(CP_MEM_SLP_CNTL, data);
6371 }
6372
6373 orig = data = RREG32(CGTS_SM_CTRL_REG);
6374 data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
6375 if (orig != data)
6376 WREG32(CGTS_SM_CTRL_REG, data);
6377
6378 tmp = cik_halt_rlc(rdev);
6379
6380 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6381 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6382 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6383 data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
6384 WREG32(RLC_SERDES_WR_CTRL, data);
6385
6386 cik_update_rlc(rdev, tmp);
6387 }
6388}
6389
6390static const u32 mc_cg_registers[] =
6391{
6392 MC_HUB_MISC_HUB_CG,
6393 MC_HUB_MISC_SIP_CG,
6394 MC_HUB_MISC_VM_CG,
6395 MC_XPB_CLK_GAT,
6396 ATC_MISC_CG,
6397 MC_CITF_MISC_WR_CG,
6398 MC_CITF_MISC_RD_CG,
6399 MC_CITF_MISC_VM_CG,
6400 VM_L2_CG,
6401};
6402
6403static void cik_enable_mc_ls(struct radeon_device *rdev,
6404 bool enable)
6405{
6406 int i;
6407 u32 orig, data;
6408
6409 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6410 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006411 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006412 data |= MC_LS_ENABLE;
6413 else
6414 data &= ~MC_LS_ENABLE;
6415 if (data != orig)
6416 WREG32(mc_cg_registers[i], data);
6417 }
6418}
6419
6420static void cik_enable_mc_mgcg(struct radeon_device *rdev,
6421 bool enable)
6422{
6423 int i;
6424 u32 orig, data;
6425
6426 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6427 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006428 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006429 data |= MC_CG_ENABLE;
6430 else
6431 data &= ~MC_CG_ENABLE;
6432 if (data != orig)
6433 WREG32(mc_cg_registers[i], data);
6434 }
6435}
6436
6437static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
6438 bool enable)
6439{
6440 u32 orig, data;
6441
Alex Deucher473359b2013-08-09 11:18:39 -04006442 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006443 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
6444 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
6445 } else {
6446 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
6447 data |= 0xff000000;
6448 if (data != orig)
6449 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
6450
6451 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
6452 data |= 0xff000000;
6453 if (data != orig)
6454 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
6455 }
6456}
6457
6458static void cik_enable_sdma_mgls(struct radeon_device *rdev,
6459 bool enable)
6460{
6461 u32 orig, data;
6462
Alex Deucher473359b2013-08-09 11:18:39 -04006463 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006464 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6465 data |= 0x100;
6466 if (orig != data)
6467 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6468
6469 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6470 data |= 0x100;
6471 if (orig != data)
6472 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6473 } else {
6474 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6475 data &= ~0x100;
6476 if (orig != data)
6477 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6478
6479 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6480 data &= ~0x100;
6481 if (orig != data)
6482 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6483 }
6484}
6485
6486static void cik_enable_uvd_mgcg(struct radeon_device *rdev,
6487 bool enable)
6488{
6489 u32 orig, data;
6490
Alex Deucher473359b2013-08-09 11:18:39 -04006491 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006492 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6493 data = 0xfff;
6494 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6495
6496 orig = data = RREG32(UVD_CGC_CTRL);
6497 data |= DCM;
6498 if (orig != data)
6499 WREG32(UVD_CGC_CTRL, data);
6500 } else {
6501 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6502 data &= ~0xfff;
6503 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6504
6505 orig = data = RREG32(UVD_CGC_CTRL);
6506 data &= ~DCM;
6507 if (orig != data)
6508 WREG32(UVD_CGC_CTRL, data);
6509 }
6510}
6511
Alex Deucher473359b2013-08-09 11:18:39 -04006512static void cik_enable_bif_mgls(struct radeon_device *rdev,
6513 bool enable)
6514{
6515 u32 orig, data;
6516
6517 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
6518
6519 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
6520 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
6521 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
6522 else
6523 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
6524 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
6525
6526 if (orig != data)
6527 WREG32_PCIE_PORT(PCIE_CNTL2, data);
6528}
6529
Alex Deucher22c775c2013-07-23 09:41:05 -04006530static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
6531 bool enable)
6532{
6533 u32 orig, data;
6534
6535 orig = data = RREG32(HDP_HOST_PATH_CNTL);
6536
Alex Deucher473359b2013-08-09 11:18:39 -04006537 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006538 data &= ~CLOCK_GATING_DIS;
6539 else
6540 data |= CLOCK_GATING_DIS;
6541
6542 if (orig != data)
6543 WREG32(HDP_HOST_PATH_CNTL, data);
6544}
6545
6546static void cik_enable_hdp_ls(struct radeon_device *rdev,
6547 bool enable)
6548{
6549 u32 orig, data;
6550
6551 orig = data = RREG32(HDP_MEM_POWER_LS);
6552
Alex Deucher473359b2013-08-09 11:18:39 -04006553 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006554 data |= HDP_LS_ENABLE;
6555 else
6556 data &= ~HDP_LS_ENABLE;
6557
6558 if (orig != data)
6559 WREG32(HDP_MEM_POWER_LS, data);
6560}
6561
6562void cik_update_cg(struct radeon_device *rdev,
6563 u32 block, bool enable)
6564{
Alex Deucher4214faf2013-09-03 10:17:13 -04006565
Alex Deucher22c775c2013-07-23 09:41:05 -04006566 if (block & RADEON_CG_BLOCK_GFX) {
Alex Deucher4214faf2013-09-03 10:17:13 -04006567 cik_enable_gui_idle_interrupt(rdev, false);
Alex Deucher22c775c2013-07-23 09:41:05 -04006568 /* order matters! */
6569 if (enable) {
6570 cik_enable_mgcg(rdev, true);
6571 cik_enable_cgcg(rdev, true);
6572 } else {
6573 cik_enable_cgcg(rdev, false);
6574 cik_enable_mgcg(rdev, false);
6575 }
Alex Deucher4214faf2013-09-03 10:17:13 -04006576 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006577 }
6578
6579 if (block & RADEON_CG_BLOCK_MC) {
6580 if (!(rdev->flags & RADEON_IS_IGP)) {
6581 cik_enable_mc_mgcg(rdev, enable);
6582 cik_enable_mc_ls(rdev, enable);
6583 }
6584 }
6585
6586 if (block & RADEON_CG_BLOCK_SDMA) {
6587 cik_enable_sdma_mgcg(rdev, enable);
6588 cik_enable_sdma_mgls(rdev, enable);
6589 }
6590
Alex Deucher473359b2013-08-09 11:18:39 -04006591 if (block & RADEON_CG_BLOCK_BIF) {
6592 cik_enable_bif_mgls(rdev, enable);
6593 }
6594
Alex Deucher22c775c2013-07-23 09:41:05 -04006595 if (block & RADEON_CG_BLOCK_UVD) {
6596 if (rdev->has_uvd)
6597 cik_enable_uvd_mgcg(rdev, enable);
6598 }
6599
6600 if (block & RADEON_CG_BLOCK_HDP) {
6601 cik_enable_hdp_mgcg(rdev, enable);
6602 cik_enable_hdp_ls(rdev, enable);
6603 }
Alex Deuchera1d6f972013-09-06 12:33:04 -04006604
6605 if (block & RADEON_CG_BLOCK_VCE) {
6606 vce_v2_0_enable_mgcg(rdev, enable);
6607 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006608}
6609
6610static void cik_init_cg(struct radeon_device *rdev)
6611{
6612
Alex Deucherddc76ff2013-08-12 17:25:26 -04006613 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006614
6615 if (rdev->has_uvd)
6616 si_init_uvd_internal_cg(rdev);
6617
6618 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6619 RADEON_CG_BLOCK_SDMA |
Alex Deucher473359b2013-08-09 11:18:39 -04006620 RADEON_CG_BLOCK_BIF |
Alex Deucher22c775c2013-07-23 09:41:05 -04006621 RADEON_CG_BLOCK_UVD |
6622 RADEON_CG_BLOCK_HDP), true);
6623}
6624
Alex Deucher473359b2013-08-09 11:18:39 -04006625static void cik_fini_cg(struct radeon_device *rdev)
6626{
6627 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6628 RADEON_CG_BLOCK_SDMA |
6629 RADEON_CG_BLOCK_BIF |
6630 RADEON_CG_BLOCK_UVD |
6631 RADEON_CG_BLOCK_HDP), false);
6632
6633 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
6634}
6635
Alex Deucher22c775c2013-07-23 09:41:05 -04006636static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
6637 bool enable)
6638{
6639 u32 data, orig;
6640
6641 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006642 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006643 data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6644 else
6645 data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6646 if (orig != data)
6647 WREG32(RLC_PG_CNTL, data);
6648}
6649
6650static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
6651 bool enable)
6652{
6653 u32 data, orig;
6654
6655 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006656 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006657 data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6658 else
6659 data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6660 if (orig != data)
6661 WREG32(RLC_PG_CNTL, data);
6662}
6663
6664static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
6665{
6666 u32 data, orig;
6667
6668 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006669 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
Alex Deucher22c775c2013-07-23 09:41:05 -04006670 data &= ~DISABLE_CP_PG;
6671 else
6672 data |= DISABLE_CP_PG;
6673 if (orig != data)
6674 WREG32(RLC_PG_CNTL, data);
6675}
6676
6677static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
6678{
6679 u32 data, orig;
6680
6681 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006682 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006683 data &= ~DISABLE_GDS_PG;
6684 else
6685 data |= DISABLE_GDS_PG;
6686 if (orig != data)
6687 WREG32(RLC_PG_CNTL, data);
6688}
6689
6690#define CP_ME_TABLE_SIZE 96
6691#define CP_ME_TABLE_OFFSET 2048
6692#define CP_MEC_TABLE_OFFSET 4096
6693
6694void cik_init_cp_pg_table(struct radeon_device *rdev)
6695{
Alex Deucher22c775c2013-07-23 09:41:05 -04006696 volatile u32 *dst_ptr;
6697 int me, i, max_me = 4;
6698 u32 bo_offset = 0;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006699 u32 table_offset, table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006700
6701 if (rdev->family == CHIP_KAVERI)
6702 max_me = 5;
6703
6704 if (rdev->rlc.cp_table_ptr == NULL)
6705 return;
6706
6707 /* write the cp table buffer */
6708 dst_ptr = rdev->rlc.cp_table_ptr;
6709 for (me = 0; me < max_me; me++) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006710 if (rdev->new_fw) {
6711 const __le32 *fw_data;
6712 const struct gfx_firmware_header_v1_0 *hdr;
Alex Deucher22c775c2013-07-23 09:41:05 -04006713
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006714 if (me == 0) {
6715 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
6716 fw_data = (const __le32 *)
6717 (rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6718 table_offset = le32_to_cpu(hdr->jt_offset);
6719 table_size = le32_to_cpu(hdr->jt_size);
6720 } else if (me == 1) {
6721 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
6722 fw_data = (const __le32 *)
6723 (rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6724 table_offset = le32_to_cpu(hdr->jt_offset);
6725 table_size = le32_to_cpu(hdr->jt_size);
6726 } else if (me == 2) {
6727 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
6728 fw_data = (const __le32 *)
6729 (rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6730 table_offset = le32_to_cpu(hdr->jt_offset);
6731 table_size = le32_to_cpu(hdr->jt_size);
6732 } else if (me == 3) {
6733 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
6734 fw_data = (const __le32 *)
6735 (rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6736 table_offset = le32_to_cpu(hdr->jt_offset);
6737 table_size = le32_to_cpu(hdr->jt_size);
6738 } else {
6739 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
6740 fw_data = (const __le32 *)
6741 (rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6742 table_offset = le32_to_cpu(hdr->jt_offset);
6743 table_size = le32_to_cpu(hdr->jt_size);
6744 }
6745
6746 for (i = 0; i < table_size; i ++) {
6747 dst_ptr[bo_offset + i] =
6748 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
6749 }
6750 bo_offset += table_size;
6751 } else {
6752 const __be32 *fw_data;
6753 table_size = CP_ME_TABLE_SIZE;
6754
6755 if (me == 0) {
6756 fw_data = (const __be32 *)rdev->ce_fw->data;
6757 table_offset = CP_ME_TABLE_OFFSET;
6758 } else if (me == 1) {
6759 fw_data = (const __be32 *)rdev->pfp_fw->data;
6760 table_offset = CP_ME_TABLE_OFFSET;
6761 } else if (me == 2) {
6762 fw_data = (const __be32 *)rdev->me_fw->data;
6763 table_offset = CP_ME_TABLE_OFFSET;
6764 } else {
6765 fw_data = (const __be32 *)rdev->mec_fw->data;
6766 table_offset = CP_MEC_TABLE_OFFSET;
6767 }
6768
6769 for (i = 0; i < table_size; i ++) {
6770 dst_ptr[bo_offset + i] =
6771 cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
6772 }
6773 bo_offset += table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006774 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006775 }
6776}
6777
6778static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
6779 bool enable)
6780{
6781 u32 data, orig;
6782
Alex Deucher2b19d172013-09-04 16:58:29 -04006783 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006784 orig = data = RREG32(RLC_PG_CNTL);
6785 data |= GFX_PG_ENABLE;
6786 if (orig != data)
6787 WREG32(RLC_PG_CNTL, data);
6788
6789 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6790 data |= AUTO_PG_EN;
6791 if (orig != data)
6792 WREG32(RLC_AUTO_PG_CTRL, data);
6793 } else {
6794 orig = data = RREG32(RLC_PG_CNTL);
6795 data &= ~GFX_PG_ENABLE;
6796 if (orig != data)
6797 WREG32(RLC_PG_CNTL, data);
6798
6799 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6800 data &= ~AUTO_PG_EN;
6801 if (orig != data)
6802 WREG32(RLC_AUTO_PG_CTRL, data);
6803
6804 data = RREG32(DB_RENDER_CONTROL);
6805 }
6806}
6807
6808static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
6809{
6810 u32 mask = 0, tmp, tmp1;
6811 int i;
6812
6813 cik_select_se_sh(rdev, se, sh);
6814 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
6815 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
6816 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6817
6818 tmp &= 0xffff0000;
6819
6820 tmp |= tmp1;
6821 tmp >>= 16;
6822
6823 for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
6824 mask <<= 1;
6825 mask |= 1;
6826 }
6827
6828 return (~tmp) & mask;
6829}
6830
6831static void cik_init_ao_cu_mask(struct radeon_device *rdev)
6832{
6833 u32 i, j, k, active_cu_number = 0;
6834 u32 mask, counter, cu_bitmap;
6835 u32 tmp = 0;
6836
6837 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6838 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6839 mask = 1;
6840 cu_bitmap = 0;
6841 counter = 0;
6842 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
6843 if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
6844 if (counter < 2)
6845 cu_bitmap |= mask;
6846 counter ++;
6847 }
6848 mask <<= 1;
6849 }
6850
6851 active_cu_number += counter;
6852 tmp |= (cu_bitmap << (i * 16 + j * 8));
6853 }
6854 }
6855
6856 WREG32(RLC_PG_AO_CU_MASK, tmp);
6857
6858 tmp = RREG32(RLC_MAX_PG_CU);
6859 tmp &= ~MAX_PU_CU_MASK;
6860 tmp |= MAX_PU_CU(active_cu_number);
6861 WREG32(RLC_MAX_PG_CU, tmp);
6862}
6863
6864static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
6865 bool enable)
6866{
6867 u32 data, orig;
6868
6869 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006870 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006871 data |= STATIC_PER_CU_PG_ENABLE;
6872 else
6873 data &= ~STATIC_PER_CU_PG_ENABLE;
6874 if (orig != data)
6875 WREG32(RLC_PG_CNTL, data);
6876}
6877
6878static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
6879 bool enable)
6880{
6881 u32 data, orig;
6882
6883 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006884 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006885 data |= DYN_PER_CU_PG_ENABLE;
6886 else
6887 data &= ~DYN_PER_CU_PG_ENABLE;
6888 if (orig != data)
6889 WREG32(RLC_PG_CNTL, data);
6890}
6891
6892#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
6893#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
6894
6895static void cik_init_gfx_cgpg(struct radeon_device *rdev)
6896{
6897 u32 data, orig;
6898 u32 i;
6899
6900 if (rdev->rlc.cs_data) {
6901 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6902 WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deuchera0f38602013-08-22 11:57:46 -04006903 WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deucher22c775c2013-07-23 09:41:05 -04006904 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
6905 } else {
6906 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6907 for (i = 0; i < 3; i++)
6908 WREG32(RLC_GPM_SCRATCH_DATA, 0);
6909 }
6910 if (rdev->rlc.reg_list) {
6911 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
6912 for (i = 0; i < rdev->rlc.reg_list_size; i++)
6913 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
6914 }
6915
6916 orig = data = RREG32(RLC_PG_CNTL);
6917 data |= GFX_PG_SRC;
6918 if (orig != data)
6919 WREG32(RLC_PG_CNTL, data);
6920
6921 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
6922 WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
6923
6924 data = RREG32(CP_RB_WPTR_POLL_CNTL);
6925 data &= ~IDLE_POLL_COUNT_MASK;
6926 data |= IDLE_POLL_COUNT(0x60);
6927 WREG32(CP_RB_WPTR_POLL_CNTL, data);
6928
6929 data = 0x10101010;
6930 WREG32(RLC_PG_DELAY, data);
6931
6932 data = RREG32(RLC_PG_DELAY_2);
6933 data &= ~0xff;
6934 data |= 0x3;
6935 WREG32(RLC_PG_DELAY_2, data);
6936
6937 data = RREG32(RLC_AUTO_PG_CTRL);
6938 data &= ~GRBM_REG_SGIT_MASK;
6939 data |= GRBM_REG_SGIT(0x700);
6940 WREG32(RLC_AUTO_PG_CTRL, data);
6941
6942}
6943
6944static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
6945{
Alex Deucher473359b2013-08-09 11:18:39 -04006946 cik_enable_gfx_cgpg(rdev, enable);
6947 cik_enable_gfx_static_mgpg(rdev, enable);
6948 cik_enable_gfx_dynamic_mgpg(rdev, enable);
Alex Deucher22c775c2013-07-23 09:41:05 -04006949}
6950
Alex Deuchera0f38602013-08-22 11:57:46 -04006951u32 cik_get_csb_size(struct radeon_device *rdev)
6952{
6953 u32 count = 0;
6954 const struct cs_section_def *sect = NULL;
6955 const struct cs_extent_def *ext = NULL;
6956
6957 if (rdev->rlc.cs_data == NULL)
6958 return 0;
6959
6960 /* begin clear state */
6961 count += 2;
6962 /* context control state */
6963 count += 3;
6964
6965 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6966 for (ext = sect->section; ext->extent != NULL; ++ext) {
6967 if (sect->id == SECT_CONTEXT)
6968 count += 2 + ext->reg_count;
6969 else
6970 return 0;
6971 }
6972 }
6973 /* pa_sc_raster_config/pa_sc_raster_config1 */
6974 count += 4;
6975 /* end clear state */
6976 count += 2;
6977 /* clear state */
6978 count += 2;
6979
6980 return count;
6981}
6982
6983void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
6984{
6985 u32 count = 0, i;
6986 const struct cs_section_def *sect = NULL;
6987 const struct cs_extent_def *ext = NULL;
6988
6989 if (rdev->rlc.cs_data == NULL)
6990 return;
6991 if (buffer == NULL)
6992 return;
6993
Alex Deucher6ba81e52013-10-23 18:27:10 -04006994 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
6995 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04006996
Alex Deucher6ba81e52013-10-23 18:27:10 -04006997 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
6998 buffer[count++] = cpu_to_le32(0x80000000);
6999 buffer[count++] = cpu_to_le32(0x80000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007000
7001 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
7002 for (ext = sect->section; ext->extent != NULL; ++ext) {
7003 if (sect->id == SECT_CONTEXT) {
Alex Deucher6ba81e52013-10-23 18:27:10 -04007004 buffer[count++] =
7005 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
7006 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007007 for (i = 0; i < ext->reg_count; i++)
Alex Deucher6ba81e52013-10-23 18:27:10 -04007008 buffer[count++] = cpu_to_le32(ext->extent[i]);
Alex Deuchera0f38602013-08-22 11:57:46 -04007009 } else {
7010 return;
7011 }
7012 }
7013 }
7014
Alex Deucher6ba81e52013-10-23 18:27:10 -04007015 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
7016 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
Alex Deuchera0f38602013-08-22 11:57:46 -04007017 switch (rdev->family) {
7018 case CHIP_BONAIRE:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007019 buffer[count++] = cpu_to_le32(0x16000012);
7020 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007021 break;
7022 case CHIP_KAVERI:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007023 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7024 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007025 break;
7026 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04007027 case CHIP_MULLINS:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007028 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7029 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007030 break;
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007031 case CHIP_HAWAII:
Alex Deuchera8947f52014-04-02 08:42:48 -04007032 buffer[count++] = cpu_to_le32(0x3a00161a);
7033 buffer[count++] = cpu_to_le32(0x0000002e);
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007034 break;
Alex Deuchera0f38602013-08-22 11:57:46 -04007035 default:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007036 buffer[count++] = cpu_to_le32(0x00000000);
7037 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007038 break;
7039 }
7040
Alex Deucher6ba81e52013-10-23 18:27:10 -04007041 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
7042 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04007043
Alex Deucher6ba81e52013-10-23 18:27:10 -04007044 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
7045 buffer[count++] = cpu_to_le32(0);
Alex Deuchera0f38602013-08-22 11:57:46 -04007046}
7047
Alex Deucher473359b2013-08-09 11:18:39 -04007048static void cik_init_pg(struct radeon_device *rdev)
Alex Deucher22c775c2013-07-23 09:41:05 -04007049{
Alex Deucher473359b2013-08-09 11:18:39 -04007050 if (rdev->pg_flags) {
Alex Deucher22c775c2013-07-23 09:41:05 -04007051 cik_enable_sck_slowdown_on_pu(rdev, true);
7052 cik_enable_sck_slowdown_on_pd(rdev, true);
Alex Deucher2b19d172013-09-04 16:58:29 -04007053 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007054 cik_init_gfx_cgpg(rdev);
7055 cik_enable_cp_pg(rdev, true);
7056 cik_enable_gds_pg(rdev, true);
7057 }
Alex Deucher22c775c2013-07-23 09:41:05 -04007058 cik_init_ao_cu_mask(rdev);
7059 cik_update_gfx_pg(rdev, true);
7060 }
7061}
7062
Alex Deucher473359b2013-08-09 11:18:39 -04007063static void cik_fini_pg(struct radeon_device *rdev)
7064{
7065 if (rdev->pg_flags) {
7066 cik_update_gfx_pg(rdev, false);
Alex Deucher2b19d172013-09-04 16:58:29 -04007067 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007068 cik_enable_cp_pg(rdev, false);
7069 cik_enable_gds_pg(rdev, false);
7070 }
7071 }
7072}
7073
Alex Deuchera59781b2012-11-09 10:45:57 -05007074/*
7075 * Interrupts
7076 * Starting with r6xx, interrupts are handled via a ring buffer.
7077 * Ring buffers are areas of GPU accessible memory that the GPU
7078 * writes interrupt vectors into and the host reads vectors out of.
7079 * There is a rptr (read pointer) that determines where the
7080 * host is currently reading, and a wptr (write pointer)
7081 * which determines where the GPU has written. When the
7082 * pointers are equal, the ring is idle. When the GPU
7083 * writes vectors to the ring buffer, it increments the
7084 * wptr. When there is an interrupt, the host then starts
7085 * fetching commands and processing them until the pointers are
7086 * equal again at which point it updates the rptr.
7087 */
7088
7089/**
7090 * cik_enable_interrupts - Enable the interrupt ring buffer
7091 *
7092 * @rdev: radeon_device pointer
7093 *
7094 * Enable the interrupt ring buffer (CIK).
7095 */
7096static void cik_enable_interrupts(struct radeon_device *rdev)
7097{
7098 u32 ih_cntl = RREG32(IH_CNTL);
7099 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7100
7101 ih_cntl |= ENABLE_INTR;
7102 ih_rb_cntl |= IH_RB_ENABLE;
7103 WREG32(IH_CNTL, ih_cntl);
7104 WREG32(IH_RB_CNTL, ih_rb_cntl);
7105 rdev->ih.enabled = true;
7106}
7107
7108/**
7109 * cik_disable_interrupts - Disable the interrupt ring buffer
7110 *
7111 * @rdev: radeon_device pointer
7112 *
7113 * Disable the interrupt ring buffer (CIK).
7114 */
7115static void cik_disable_interrupts(struct radeon_device *rdev)
7116{
7117 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7118 u32 ih_cntl = RREG32(IH_CNTL);
7119
7120 ih_rb_cntl &= ~IH_RB_ENABLE;
7121 ih_cntl &= ~ENABLE_INTR;
7122 WREG32(IH_RB_CNTL, ih_rb_cntl);
7123 WREG32(IH_CNTL, ih_cntl);
7124 /* set rptr, wptr to 0 */
7125 WREG32(IH_RB_RPTR, 0);
7126 WREG32(IH_RB_WPTR, 0);
7127 rdev->ih.enabled = false;
7128 rdev->ih.rptr = 0;
7129}
7130
7131/**
7132 * cik_disable_interrupt_state - Disable all interrupt sources
7133 *
7134 * @rdev: radeon_device pointer
7135 *
7136 * Clear all interrupt enable bits used by the driver (CIK).
7137 */
7138static void cik_disable_interrupt_state(struct radeon_device *rdev)
7139{
7140 u32 tmp;
7141
7142 /* gfx ring */
Alex Deucher4214faf2013-09-03 10:17:13 -04007143 tmp = RREG32(CP_INT_CNTL_RING0) &
7144 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7145 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher21a93e12013-04-09 12:47:11 -04007146 /* sdma */
7147 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7148 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
7149 tmp = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7150 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, tmp);
Alex Deuchera59781b2012-11-09 10:45:57 -05007151 /* compute queues */
7152 WREG32(CP_ME1_PIPE0_INT_CNTL, 0);
7153 WREG32(CP_ME1_PIPE1_INT_CNTL, 0);
7154 WREG32(CP_ME1_PIPE2_INT_CNTL, 0);
7155 WREG32(CP_ME1_PIPE3_INT_CNTL, 0);
7156 WREG32(CP_ME2_PIPE0_INT_CNTL, 0);
7157 WREG32(CP_ME2_PIPE1_INT_CNTL, 0);
7158 WREG32(CP_ME2_PIPE2_INT_CNTL, 0);
7159 WREG32(CP_ME2_PIPE3_INT_CNTL, 0);
7160 /* grbm */
7161 WREG32(GRBM_INT_CNTL, 0);
7162 /* vline/vblank, etc. */
7163 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7164 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7165 if (rdev->num_crtc >= 4) {
7166 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7167 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7168 }
7169 if (rdev->num_crtc >= 6) {
7170 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7171 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7172 }
Christian Königf5d636d2014-04-23 20:46:06 +02007173 /* pflip */
7174 if (rdev->num_crtc >= 2) {
7175 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7176 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7177 }
7178 if (rdev->num_crtc >= 4) {
7179 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7180 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7181 }
7182 if (rdev->num_crtc >= 6) {
7183 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7184 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7185 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007186
7187 /* dac hotplug */
7188 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
7189
7190 /* digital hotplug */
7191 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7192 WREG32(DC_HPD1_INT_CONTROL, tmp);
7193 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7194 WREG32(DC_HPD2_INT_CONTROL, tmp);
7195 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7196 WREG32(DC_HPD3_INT_CONTROL, tmp);
7197 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7198 WREG32(DC_HPD4_INT_CONTROL, tmp);
7199 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7200 WREG32(DC_HPD5_INT_CONTROL, tmp);
7201 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7202 WREG32(DC_HPD6_INT_CONTROL, tmp);
7203
7204}
7205
7206/**
7207 * cik_irq_init - init and enable the interrupt ring
7208 *
7209 * @rdev: radeon_device pointer
7210 *
7211 * Allocate a ring buffer for the interrupt controller,
7212 * enable the RLC, disable interrupts, enable the IH
7213 * ring buffer and enable it (CIK).
7214 * Called at device load and reume.
7215 * Returns 0 for success, errors for failure.
7216 */
7217static int cik_irq_init(struct radeon_device *rdev)
7218{
7219 int ret = 0;
7220 int rb_bufsz;
7221 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
7222
7223 /* allocate ring */
7224 ret = r600_ih_ring_alloc(rdev);
7225 if (ret)
7226 return ret;
7227
7228 /* disable irqs */
7229 cik_disable_interrupts(rdev);
7230
7231 /* init rlc */
7232 ret = cik_rlc_resume(rdev);
7233 if (ret) {
7234 r600_ih_ring_fini(rdev);
7235 return ret;
7236 }
7237
7238 /* setup interrupt control */
7239 /* XXX this should actually be a bus address, not an MC address. same on older asics */
7240 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
7241 interrupt_cntl = RREG32(INTERRUPT_CNTL);
7242 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
7243 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
7244 */
7245 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
7246 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
7247 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
7248 WREG32(INTERRUPT_CNTL, interrupt_cntl);
7249
7250 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
Daniel Vetterb72a8922013-07-10 14:11:59 +02007251 rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007252
7253 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
7254 IH_WPTR_OVERFLOW_CLEAR |
7255 (rb_bufsz << 1));
7256
7257 if (rdev->wb.enabled)
7258 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
7259
7260 /* set the writeback address whether it's enabled or not */
7261 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
7262 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
7263
7264 WREG32(IH_RB_CNTL, ih_rb_cntl);
7265
7266 /* set rptr, wptr to 0 */
7267 WREG32(IH_RB_RPTR, 0);
7268 WREG32(IH_RB_WPTR, 0);
7269
7270 /* Default settings for IH_CNTL (disabled at first) */
7271 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
7272 /* RPTR_REARM only works if msi's are enabled */
7273 if (rdev->msi_enabled)
7274 ih_cntl |= RPTR_REARM;
7275 WREG32(IH_CNTL, ih_cntl);
7276
7277 /* force the active interrupt state to all disabled */
7278 cik_disable_interrupt_state(rdev);
7279
7280 pci_set_master(rdev->pdev);
7281
7282 /* enable irqs */
7283 cik_enable_interrupts(rdev);
7284
7285 return ret;
7286}
7287
7288/**
7289 * cik_irq_set - enable/disable interrupt sources
7290 *
7291 * @rdev: radeon_device pointer
7292 *
7293 * Enable interrupt sources on the GPU (vblanks, hpd,
7294 * etc.) (CIK).
7295 * Returns 0 for success, errors for failure.
7296 */
7297int cik_irq_set(struct radeon_device *rdev)
7298{
Alex Deucher4214faf2013-09-03 10:17:13 -04007299 u32 cp_int_cntl;
Oded Gabbay28b57b82014-02-11 18:28:24 +02007300 u32 cp_m1p0;
Alex Deuchera59781b2012-11-09 10:45:57 -05007301 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
7302 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7303 u32 grbm_int_cntl = 0;
Alex Deucher21a93e12013-04-09 12:47:11 -04007304 u32 dma_cntl, dma_cntl1;
Alex Deucher41a524a2013-08-14 01:01:40 -04007305 u32 thermal_int;
Alex Deuchera59781b2012-11-09 10:45:57 -05007306
7307 if (!rdev->irq.installed) {
7308 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
7309 return -EINVAL;
7310 }
7311 /* don't enable anything if the ih is disabled */
7312 if (!rdev->ih.enabled) {
7313 cik_disable_interrupts(rdev);
7314 /* force the active interrupt state to all disabled */
7315 cik_disable_interrupt_state(rdev);
7316 return 0;
7317 }
7318
Alex Deucher4214faf2013-09-03 10:17:13 -04007319 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
7320 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7321 cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
7322
Alex Deuchera59781b2012-11-09 10:45:57 -05007323 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
7324 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
7325 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
7326 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
7327 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
7328 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
7329
Alex Deucher21a93e12013-04-09 12:47:11 -04007330 dma_cntl = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7331 dma_cntl1 = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7332
Alex Deucher2b0781a2013-04-09 14:26:16 -04007333 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
Alex Deucher2b0781a2013-04-09 14:26:16 -04007334
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007335 if (rdev->flags & RADEON_IS_IGP)
7336 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7337 ~(THERM_INTH_MASK | THERM_INTL_MASK);
7338 else
7339 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7340 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
Alex Deucher41a524a2013-08-14 01:01:40 -04007341
Alex Deuchera59781b2012-11-09 10:45:57 -05007342 /* enable CP interrupts on all rings */
7343 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
7344 DRM_DEBUG("cik_irq_set: sw int gfx\n");
7345 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
7346 }
Alex Deucher2b0781a2013-04-09 14:26:16 -04007347 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
7348 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7349 DRM_DEBUG("si_irq_set: sw int cp1\n");
7350 if (ring->me == 1) {
7351 switch (ring->pipe) {
7352 case 0:
7353 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7354 break;
Alex Deucher2b0781a2013-04-09 14:26:16 -04007355 default:
7356 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7357 break;
7358 }
7359 } else {
7360 DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring->me);
7361 }
7362 }
7363 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
7364 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7365 DRM_DEBUG("si_irq_set: sw int cp2\n");
7366 if (ring->me == 1) {
7367 switch (ring->pipe) {
7368 case 0:
7369 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7370 break;
Alex Deucher2b0781a2013-04-09 14:26:16 -04007371 default:
7372 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7373 break;
7374 }
7375 } else {
7376 DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring->me);
7377 }
7378 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007379
Alex Deucher21a93e12013-04-09 12:47:11 -04007380 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
7381 DRM_DEBUG("cik_irq_set: sw int dma\n");
7382 dma_cntl |= TRAP_ENABLE;
7383 }
7384
7385 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
7386 DRM_DEBUG("cik_irq_set: sw int dma1\n");
7387 dma_cntl1 |= TRAP_ENABLE;
7388 }
7389
Alex Deuchera59781b2012-11-09 10:45:57 -05007390 if (rdev->irq.crtc_vblank_int[0] ||
7391 atomic_read(&rdev->irq.pflip[0])) {
7392 DRM_DEBUG("cik_irq_set: vblank 0\n");
7393 crtc1 |= VBLANK_INTERRUPT_MASK;
7394 }
7395 if (rdev->irq.crtc_vblank_int[1] ||
7396 atomic_read(&rdev->irq.pflip[1])) {
7397 DRM_DEBUG("cik_irq_set: vblank 1\n");
7398 crtc2 |= VBLANK_INTERRUPT_MASK;
7399 }
7400 if (rdev->irq.crtc_vblank_int[2] ||
7401 atomic_read(&rdev->irq.pflip[2])) {
7402 DRM_DEBUG("cik_irq_set: vblank 2\n");
7403 crtc3 |= VBLANK_INTERRUPT_MASK;
7404 }
7405 if (rdev->irq.crtc_vblank_int[3] ||
7406 atomic_read(&rdev->irq.pflip[3])) {
7407 DRM_DEBUG("cik_irq_set: vblank 3\n");
7408 crtc4 |= VBLANK_INTERRUPT_MASK;
7409 }
7410 if (rdev->irq.crtc_vblank_int[4] ||
7411 atomic_read(&rdev->irq.pflip[4])) {
7412 DRM_DEBUG("cik_irq_set: vblank 4\n");
7413 crtc5 |= VBLANK_INTERRUPT_MASK;
7414 }
7415 if (rdev->irq.crtc_vblank_int[5] ||
7416 atomic_read(&rdev->irq.pflip[5])) {
7417 DRM_DEBUG("cik_irq_set: vblank 5\n");
7418 crtc6 |= VBLANK_INTERRUPT_MASK;
7419 }
7420 if (rdev->irq.hpd[0]) {
7421 DRM_DEBUG("cik_irq_set: hpd 1\n");
7422 hpd1 |= DC_HPDx_INT_EN;
7423 }
7424 if (rdev->irq.hpd[1]) {
7425 DRM_DEBUG("cik_irq_set: hpd 2\n");
7426 hpd2 |= DC_HPDx_INT_EN;
7427 }
7428 if (rdev->irq.hpd[2]) {
7429 DRM_DEBUG("cik_irq_set: hpd 3\n");
7430 hpd3 |= DC_HPDx_INT_EN;
7431 }
7432 if (rdev->irq.hpd[3]) {
7433 DRM_DEBUG("cik_irq_set: hpd 4\n");
7434 hpd4 |= DC_HPDx_INT_EN;
7435 }
7436 if (rdev->irq.hpd[4]) {
7437 DRM_DEBUG("cik_irq_set: hpd 5\n");
7438 hpd5 |= DC_HPDx_INT_EN;
7439 }
7440 if (rdev->irq.hpd[5]) {
7441 DRM_DEBUG("cik_irq_set: hpd 6\n");
7442 hpd6 |= DC_HPDx_INT_EN;
7443 }
7444
Alex Deucher41a524a2013-08-14 01:01:40 -04007445 if (rdev->irq.dpm_thermal) {
7446 DRM_DEBUG("dpm thermal\n");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007447 if (rdev->flags & RADEON_IS_IGP)
7448 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7449 else
7450 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
Alex Deucher41a524a2013-08-14 01:01:40 -04007451 }
7452
Alex Deuchera59781b2012-11-09 10:45:57 -05007453 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7454
Alex Deucher21a93e12013-04-09 12:47:11 -04007455 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
7456 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, dma_cntl1);
7457
Alex Deucher2b0781a2013-04-09 14:26:16 -04007458 WREG32(CP_ME1_PIPE0_INT_CNTL, cp_m1p0);
Alex Deucher2b0781a2013-04-09 14:26:16 -04007459
Alex Deuchera59781b2012-11-09 10:45:57 -05007460 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
7461
7462 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
7463 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
7464 if (rdev->num_crtc >= 4) {
7465 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
7466 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
7467 }
7468 if (rdev->num_crtc >= 6) {
7469 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
7470 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
7471 }
7472
Christian Königf5d636d2014-04-23 20:46:06 +02007473 if (rdev->num_crtc >= 2) {
7474 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
7475 GRPH_PFLIP_INT_MASK);
7476 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
7477 GRPH_PFLIP_INT_MASK);
7478 }
7479 if (rdev->num_crtc >= 4) {
7480 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
7481 GRPH_PFLIP_INT_MASK);
7482 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
7483 GRPH_PFLIP_INT_MASK);
7484 }
7485 if (rdev->num_crtc >= 6) {
7486 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
7487 GRPH_PFLIP_INT_MASK);
7488 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
7489 GRPH_PFLIP_INT_MASK);
7490 }
7491
Alex Deuchera59781b2012-11-09 10:45:57 -05007492 WREG32(DC_HPD1_INT_CONTROL, hpd1);
7493 WREG32(DC_HPD2_INT_CONTROL, hpd2);
7494 WREG32(DC_HPD3_INT_CONTROL, hpd3);
7495 WREG32(DC_HPD4_INT_CONTROL, hpd4);
7496 WREG32(DC_HPD5_INT_CONTROL, hpd5);
7497 WREG32(DC_HPD6_INT_CONTROL, hpd6);
7498
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007499 if (rdev->flags & RADEON_IS_IGP)
7500 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7501 else
7502 WREG32_SMC(CG_THERMAL_INT, thermal_int);
Alex Deucher41a524a2013-08-14 01:01:40 -04007503
Alex Deuchera59781b2012-11-09 10:45:57 -05007504 return 0;
7505}
7506
7507/**
7508 * cik_irq_ack - ack interrupt sources
7509 *
7510 * @rdev: radeon_device pointer
7511 *
7512 * Ack interrupt sources on the GPU (vblanks, hpd,
7513 * etc.) (CIK). Certain interrupts sources are sw
7514 * generated and do not require an explicit ack.
7515 */
7516static inline void cik_irq_ack(struct radeon_device *rdev)
7517{
7518 u32 tmp;
7519
7520 rdev->irq.stat_regs.cik.disp_int = RREG32(DISP_INTERRUPT_STATUS);
7521 rdev->irq.stat_regs.cik.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
7522 rdev->irq.stat_regs.cik.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
7523 rdev->irq.stat_regs.cik.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
7524 rdev->irq.stat_regs.cik.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
7525 rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
7526 rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
7527
Christian Königf5d636d2014-04-23 20:46:06 +02007528 rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
7529 EVERGREEN_CRTC0_REGISTER_OFFSET);
7530 rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
7531 EVERGREEN_CRTC1_REGISTER_OFFSET);
7532 if (rdev->num_crtc >= 4) {
7533 rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
7534 EVERGREEN_CRTC2_REGISTER_OFFSET);
7535 rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
7536 EVERGREEN_CRTC3_REGISTER_OFFSET);
7537 }
7538 if (rdev->num_crtc >= 6) {
7539 rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
7540 EVERGREEN_CRTC4_REGISTER_OFFSET);
7541 rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
7542 EVERGREEN_CRTC5_REGISTER_OFFSET);
7543 }
7544
7545 if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
7546 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
7547 GRPH_PFLIP_INT_CLEAR);
7548 if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
7549 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
7550 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007551 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
7552 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
7553 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
7554 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
7555 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
7556 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
7557 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)
7558 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
7559
7560 if (rdev->num_crtc >= 4) {
Christian Königf5d636d2014-04-23 20:46:06 +02007561 if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
7562 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
7563 GRPH_PFLIP_INT_CLEAR);
7564 if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
7565 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
7566 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007567 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
7568 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
7569 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
7570 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
7571 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
7572 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
7573 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
7574 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
7575 }
7576
7577 if (rdev->num_crtc >= 6) {
Christian Königf5d636d2014-04-23 20:46:06 +02007578 if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
7579 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
7580 GRPH_PFLIP_INT_CLEAR);
7581 if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
7582 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
7583 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007584 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
7585 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
7586 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
7587 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
7588 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
7589 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
7590 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
7591 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
7592 }
7593
7594 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7595 tmp = RREG32(DC_HPD1_INT_CONTROL);
7596 tmp |= DC_HPDx_INT_ACK;
7597 WREG32(DC_HPD1_INT_CONTROL, tmp);
7598 }
7599 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7600 tmp = RREG32(DC_HPD2_INT_CONTROL);
7601 tmp |= DC_HPDx_INT_ACK;
7602 WREG32(DC_HPD2_INT_CONTROL, tmp);
7603 }
7604 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
7605 tmp = RREG32(DC_HPD3_INT_CONTROL);
7606 tmp |= DC_HPDx_INT_ACK;
7607 WREG32(DC_HPD3_INT_CONTROL, tmp);
7608 }
7609 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
7610 tmp = RREG32(DC_HPD4_INT_CONTROL);
7611 tmp |= DC_HPDx_INT_ACK;
7612 WREG32(DC_HPD4_INT_CONTROL, tmp);
7613 }
7614 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
7615 tmp = RREG32(DC_HPD5_INT_CONTROL);
7616 tmp |= DC_HPDx_INT_ACK;
7617 WREG32(DC_HPD5_INT_CONTROL, tmp);
7618 }
7619 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
7620 tmp = RREG32(DC_HPD5_INT_CONTROL);
7621 tmp |= DC_HPDx_INT_ACK;
7622 WREG32(DC_HPD6_INT_CONTROL, tmp);
7623 }
7624}
7625
7626/**
7627 * cik_irq_disable - disable interrupts
7628 *
7629 * @rdev: radeon_device pointer
7630 *
7631 * Disable interrupts on the hw (CIK).
7632 */
7633static void cik_irq_disable(struct radeon_device *rdev)
7634{
7635 cik_disable_interrupts(rdev);
7636 /* Wait and acknowledge irq */
7637 mdelay(1);
7638 cik_irq_ack(rdev);
7639 cik_disable_interrupt_state(rdev);
7640}
7641
7642/**
7643 * cik_irq_disable - disable interrupts for suspend
7644 *
7645 * @rdev: radeon_device pointer
7646 *
7647 * Disable interrupts and stop the RLC (CIK).
7648 * Used for suspend.
7649 */
7650static void cik_irq_suspend(struct radeon_device *rdev)
7651{
7652 cik_irq_disable(rdev);
7653 cik_rlc_stop(rdev);
7654}
7655
7656/**
7657 * cik_irq_fini - tear down interrupt support
7658 *
7659 * @rdev: radeon_device pointer
7660 *
7661 * Disable interrupts on the hw and free the IH ring
7662 * buffer (CIK).
7663 * Used for driver unload.
7664 */
7665static void cik_irq_fini(struct radeon_device *rdev)
7666{
7667 cik_irq_suspend(rdev);
7668 r600_ih_ring_fini(rdev);
7669}
7670
7671/**
7672 * cik_get_ih_wptr - get the IH ring buffer wptr
7673 *
7674 * @rdev: radeon_device pointer
7675 *
7676 * Get the IH ring buffer wptr from either the register
7677 * or the writeback memory buffer (CIK). Also check for
7678 * ring buffer overflow and deal with it.
7679 * Used by cik_irq_process().
7680 * Returns the value of the wptr.
7681 */
7682static inline u32 cik_get_ih_wptr(struct radeon_device *rdev)
7683{
7684 u32 wptr, tmp;
7685
7686 if (rdev->wb.enabled)
7687 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
7688 else
7689 wptr = RREG32(IH_RB_WPTR);
7690
7691 if (wptr & RB_OVERFLOW) {
Michel Dänzer11bab0a2014-09-19 12:07:11 +09007692 wptr &= ~RB_OVERFLOW;
Alex Deuchera59781b2012-11-09 10:45:57 -05007693 /* When a ring buffer overflow happen start parsing interrupt
7694 * from the last not overwritten vector (wptr + 16). Hopefully
7695 * this should allow us to catchup.
7696 */
Michel Dänzer6cc2fda2014-09-19 12:22:07 +09007697 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
7698 wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
Alex Deuchera59781b2012-11-09 10:45:57 -05007699 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
7700 tmp = RREG32(IH_RB_CNTL);
7701 tmp |= IH_WPTR_OVERFLOW_CLEAR;
7702 WREG32(IH_RB_CNTL, tmp);
7703 }
7704 return (wptr & rdev->ih.ptr_mask);
7705}
7706
7707/* CIK IV Ring
7708 * Each IV ring entry is 128 bits:
7709 * [7:0] - interrupt source id
7710 * [31:8] - reserved
7711 * [59:32] - interrupt source data
7712 * [63:60] - reserved
Alex Deucher21a93e12013-04-09 12:47:11 -04007713 * [71:64] - RINGID
7714 * CP:
7715 * ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
Alex Deuchera59781b2012-11-09 10:45:57 -05007716 * QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
7717 * - for gfx, hw shader state (0=PS...5=LS, 6=CS)
7718 * ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
7719 * PIPE_ID - ME0 0=3D
7720 * - ME1&2 compute dispatcher (4 pipes each)
Alex Deucher21a93e12013-04-09 12:47:11 -04007721 * SDMA:
7722 * INSTANCE_ID [1:0], QUEUE_ID[1:0]
7723 * INSTANCE_ID - 0 = sdma0, 1 = sdma1
7724 * QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
Alex Deuchera59781b2012-11-09 10:45:57 -05007725 * [79:72] - VMID
7726 * [95:80] - PASID
7727 * [127:96] - reserved
7728 */
7729/**
7730 * cik_irq_process - interrupt handler
7731 *
7732 * @rdev: radeon_device pointer
7733 *
7734 * Interrupt hander (CIK). Walk the IH ring,
7735 * ack interrupts and schedule work to handle
7736 * interrupt events.
7737 * Returns irq process return code.
7738 */
7739int cik_irq_process(struct radeon_device *rdev)
7740{
Alex Deucher2b0781a2013-04-09 14:26:16 -04007741 struct radeon_ring *cp1_ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7742 struct radeon_ring *cp2_ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
Alex Deuchera59781b2012-11-09 10:45:57 -05007743 u32 wptr;
7744 u32 rptr;
7745 u32 src_id, src_data, ring_id;
7746 u8 me_id, pipe_id, queue_id;
7747 u32 ring_index;
7748 bool queue_hotplug = false;
7749 bool queue_reset = false;
Alex Deucher3ec7d112013-06-14 10:42:22 -04007750 u32 addr, status, mc_client;
Alex Deucher41a524a2013-08-14 01:01:40 -04007751 bool queue_thermal = false;
Alex Deuchera59781b2012-11-09 10:45:57 -05007752
7753 if (!rdev->ih.enabled || rdev->shutdown)
7754 return IRQ_NONE;
7755
7756 wptr = cik_get_ih_wptr(rdev);
7757
7758restart_ih:
7759 /* is somebody else already processing irqs? */
7760 if (atomic_xchg(&rdev->ih.lock, 1))
7761 return IRQ_NONE;
7762
7763 rptr = rdev->ih.rptr;
7764 DRM_DEBUG("cik_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
7765
7766 /* Order reading of wptr vs. reading of IH ring data */
7767 rmb();
7768
7769 /* display interrupts */
7770 cik_irq_ack(rdev);
7771
7772 while (rptr != wptr) {
7773 /* wptr/rptr are in bytes! */
7774 ring_index = rptr / 4;
7775 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
7776 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
7777 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
Alex Deuchera59781b2012-11-09 10:45:57 -05007778
7779 switch (src_id) {
7780 case 1: /* D1 vblank/vline */
7781 switch (src_data) {
7782 case 0: /* D1 vblank */
7783 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) {
7784 if (rdev->irq.crtc_vblank_int[0]) {
7785 drm_handle_vblank(rdev->ddev, 0);
7786 rdev->pm.vblank_sync = true;
7787 wake_up(&rdev->irq.vblank_queue);
7788 }
7789 if (atomic_read(&rdev->irq.pflip[0]))
Christian König1a0e7912014-05-27 16:49:21 +02007790 radeon_crtc_handle_vblank(rdev, 0);
Alex Deuchera59781b2012-11-09 10:45:57 -05007791 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
7792 DRM_DEBUG("IH: D1 vblank\n");
7793 }
7794 break;
7795 case 1: /* D1 vline */
7796 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) {
7797 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT;
7798 DRM_DEBUG("IH: D1 vline\n");
7799 }
7800 break;
7801 default:
7802 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7803 break;
7804 }
7805 break;
7806 case 2: /* D2 vblank/vline */
7807 switch (src_data) {
7808 case 0: /* D2 vblank */
7809 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
7810 if (rdev->irq.crtc_vblank_int[1]) {
7811 drm_handle_vblank(rdev->ddev, 1);
7812 rdev->pm.vblank_sync = true;
7813 wake_up(&rdev->irq.vblank_queue);
7814 }
7815 if (atomic_read(&rdev->irq.pflip[1]))
Christian König1a0e7912014-05-27 16:49:21 +02007816 radeon_crtc_handle_vblank(rdev, 1);
Alex Deuchera59781b2012-11-09 10:45:57 -05007817 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
7818 DRM_DEBUG("IH: D2 vblank\n");
7819 }
7820 break;
7821 case 1: /* D2 vline */
7822 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
7823 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
7824 DRM_DEBUG("IH: D2 vline\n");
7825 }
7826 break;
7827 default:
7828 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7829 break;
7830 }
7831 break;
7832 case 3: /* D3 vblank/vline */
7833 switch (src_data) {
7834 case 0: /* D3 vblank */
7835 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
7836 if (rdev->irq.crtc_vblank_int[2]) {
7837 drm_handle_vblank(rdev->ddev, 2);
7838 rdev->pm.vblank_sync = true;
7839 wake_up(&rdev->irq.vblank_queue);
7840 }
7841 if (atomic_read(&rdev->irq.pflip[2]))
Christian König1a0e7912014-05-27 16:49:21 +02007842 radeon_crtc_handle_vblank(rdev, 2);
Alex Deuchera59781b2012-11-09 10:45:57 -05007843 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
7844 DRM_DEBUG("IH: D3 vblank\n");
7845 }
7846 break;
7847 case 1: /* D3 vline */
7848 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
7849 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
7850 DRM_DEBUG("IH: D3 vline\n");
7851 }
7852 break;
7853 default:
7854 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7855 break;
7856 }
7857 break;
7858 case 4: /* D4 vblank/vline */
7859 switch (src_data) {
7860 case 0: /* D4 vblank */
7861 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
7862 if (rdev->irq.crtc_vblank_int[3]) {
7863 drm_handle_vblank(rdev->ddev, 3);
7864 rdev->pm.vblank_sync = true;
7865 wake_up(&rdev->irq.vblank_queue);
7866 }
7867 if (atomic_read(&rdev->irq.pflip[3]))
Christian König1a0e7912014-05-27 16:49:21 +02007868 radeon_crtc_handle_vblank(rdev, 3);
Alex Deuchera59781b2012-11-09 10:45:57 -05007869 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
7870 DRM_DEBUG("IH: D4 vblank\n");
7871 }
7872 break;
7873 case 1: /* D4 vline */
7874 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
7875 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
7876 DRM_DEBUG("IH: D4 vline\n");
7877 }
7878 break;
7879 default:
7880 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7881 break;
7882 }
7883 break;
7884 case 5: /* D5 vblank/vline */
7885 switch (src_data) {
7886 case 0: /* D5 vblank */
7887 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
7888 if (rdev->irq.crtc_vblank_int[4]) {
7889 drm_handle_vblank(rdev->ddev, 4);
7890 rdev->pm.vblank_sync = true;
7891 wake_up(&rdev->irq.vblank_queue);
7892 }
7893 if (atomic_read(&rdev->irq.pflip[4]))
Christian König1a0e7912014-05-27 16:49:21 +02007894 radeon_crtc_handle_vblank(rdev, 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007895 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
7896 DRM_DEBUG("IH: D5 vblank\n");
7897 }
7898 break;
7899 case 1: /* D5 vline */
7900 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
7901 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
7902 DRM_DEBUG("IH: D5 vline\n");
7903 }
7904 break;
7905 default:
7906 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7907 break;
7908 }
7909 break;
7910 case 6: /* D6 vblank/vline */
7911 switch (src_data) {
7912 case 0: /* D6 vblank */
7913 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
7914 if (rdev->irq.crtc_vblank_int[5]) {
7915 drm_handle_vblank(rdev->ddev, 5);
7916 rdev->pm.vblank_sync = true;
7917 wake_up(&rdev->irq.vblank_queue);
7918 }
7919 if (atomic_read(&rdev->irq.pflip[5]))
Christian König1a0e7912014-05-27 16:49:21 +02007920 radeon_crtc_handle_vblank(rdev, 5);
Alex Deuchera59781b2012-11-09 10:45:57 -05007921 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
7922 DRM_DEBUG("IH: D6 vblank\n");
7923 }
7924 break;
7925 case 1: /* D6 vline */
7926 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
7927 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
7928 DRM_DEBUG("IH: D6 vline\n");
7929 }
7930 break;
7931 default:
7932 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7933 break;
7934 }
7935 break;
Christian Königf5d636d2014-04-23 20:46:06 +02007936 case 8: /* D1 page flip */
7937 case 10: /* D2 page flip */
7938 case 12: /* D3 page flip */
7939 case 14: /* D4 page flip */
7940 case 16: /* D5 page flip */
7941 case 18: /* D6 page flip */
7942 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
Mario Kleiner39dc5452014-07-29 06:21:44 +02007943 if (radeon_use_pflipirq > 0)
7944 radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
Christian Königf5d636d2014-04-23 20:46:06 +02007945 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05007946 case 42: /* HPD hotplug */
7947 switch (src_data) {
7948 case 0:
7949 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7950 rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT;
7951 queue_hotplug = true;
7952 DRM_DEBUG("IH: HPD1\n");
7953 }
7954 break;
7955 case 1:
7956 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7957 rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT;
7958 queue_hotplug = true;
7959 DRM_DEBUG("IH: HPD2\n");
7960 }
7961 break;
7962 case 2:
7963 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
7964 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
7965 queue_hotplug = true;
7966 DRM_DEBUG("IH: HPD3\n");
7967 }
7968 break;
7969 case 3:
7970 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
7971 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
7972 queue_hotplug = true;
7973 DRM_DEBUG("IH: HPD4\n");
7974 }
7975 break;
7976 case 4:
7977 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
7978 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
7979 queue_hotplug = true;
7980 DRM_DEBUG("IH: HPD5\n");
7981 }
7982 break;
7983 case 5:
7984 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
7985 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
7986 queue_hotplug = true;
7987 DRM_DEBUG("IH: HPD6\n");
7988 }
7989 break;
7990 default:
7991 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7992 break;
7993 }
7994 break;
Christian König6a3808b2013-08-30 11:10:33 +02007995 case 124: /* UVD */
7996 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
7997 radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
7998 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04007999 case 146:
8000 case 147:
Alex Deucher3ec7d112013-06-14 10:42:22 -04008001 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
8002 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
8003 mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
Christian König9b7d7862014-07-07 11:16:29 +02008004 /* reset addr and status */
8005 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
8006 if (addr == 0x0 && status == 0x0)
8007 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04008008 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
8009 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008010 addr);
Alex Deucher9d97c992012-09-06 14:24:48 -04008011 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008012 status);
8013 cik_vm_decode_fault(rdev, status, addr, mc_client);
Alex Deucher9d97c992012-09-06 14:24:48 -04008014 break;
Christian Königd93f7932013-05-23 12:10:04 +02008015 case 167: /* VCE */
8016 DRM_DEBUG("IH: VCE int: 0x%08x\n", src_data);
8017 switch (src_data) {
8018 case 0:
8019 radeon_fence_process(rdev, TN_RING_TYPE_VCE1_INDEX);
8020 break;
8021 case 1:
8022 radeon_fence_process(rdev, TN_RING_TYPE_VCE2_INDEX);
8023 break;
8024 default:
8025 DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
8026 break;
8027 }
8028 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008029 case 176: /* GFX RB CP_INT */
8030 case 177: /* GFX IB CP_INT */
8031 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8032 break;
8033 case 181: /* CP EOP event */
8034 DRM_DEBUG("IH: CP EOP\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008035 /* XXX check the bitfield order! */
8036 me_id = (ring_id & 0x60) >> 5;
8037 pipe_id = (ring_id & 0x18) >> 3;
8038 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008039 switch (me_id) {
8040 case 0:
8041 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8042 break;
8043 case 1:
Alex Deuchera59781b2012-11-09 10:45:57 -05008044 case 2:
Alex Deucher2b0781a2013-04-09 14:26:16 -04008045 if ((cp1_ring->me == me_id) & (cp1_ring->pipe == pipe_id))
8046 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8047 if ((cp2_ring->me == me_id) & (cp2_ring->pipe == pipe_id))
8048 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
Alex Deuchera59781b2012-11-09 10:45:57 -05008049 break;
8050 }
8051 break;
8052 case 184: /* CP Privileged reg access */
8053 DRM_ERROR("Illegal register access in command stream\n");
8054 /* XXX check the bitfield order! */
8055 me_id = (ring_id & 0x60) >> 5;
8056 pipe_id = (ring_id & 0x18) >> 3;
8057 queue_id = (ring_id & 0x7) >> 0;
8058 switch (me_id) {
8059 case 0:
8060 /* This results in a full GPU reset, but all we need to do is soft
8061 * reset the CP for gfx
8062 */
8063 queue_reset = true;
8064 break;
8065 case 1:
8066 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008067 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008068 break;
8069 case 2:
8070 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008071 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008072 break;
8073 }
8074 break;
8075 case 185: /* CP Privileged inst */
8076 DRM_ERROR("Illegal instruction in command stream\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008077 /* XXX check the bitfield order! */
8078 me_id = (ring_id & 0x60) >> 5;
8079 pipe_id = (ring_id & 0x18) >> 3;
8080 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008081 switch (me_id) {
8082 case 0:
8083 /* This results in a full GPU reset, but all we need to do is soft
8084 * reset the CP for gfx
8085 */
8086 queue_reset = true;
8087 break;
8088 case 1:
8089 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008090 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008091 break;
8092 case 2:
8093 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008094 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008095 break;
8096 }
8097 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008098 case 224: /* SDMA trap event */
8099 /* XXX check the bitfield order! */
8100 me_id = (ring_id & 0x3) >> 0;
8101 queue_id = (ring_id & 0xc) >> 2;
8102 DRM_DEBUG("IH: SDMA trap\n");
8103 switch (me_id) {
8104 case 0:
8105 switch (queue_id) {
8106 case 0:
8107 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
8108 break;
8109 case 1:
8110 /* XXX compute */
8111 break;
8112 case 2:
8113 /* XXX compute */
8114 break;
8115 }
8116 break;
8117 case 1:
8118 switch (queue_id) {
8119 case 0:
8120 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8121 break;
8122 case 1:
8123 /* XXX compute */
8124 break;
8125 case 2:
8126 /* XXX compute */
8127 break;
8128 }
8129 break;
8130 }
8131 break;
Alex Deucher41a524a2013-08-14 01:01:40 -04008132 case 230: /* thermal low to high */
8133 DRM_DEBUG("IH: thermal low to high\n");
8134 rdev->pm.dpm.thermal.high_to_low = false;
8135 queue_thermal = true;
8136 break;
8137 case 231: /* thermal high to low */
8138 DRM_DEBUG("IH: thermal high to low\n");
8139 rdev->pm.dpm.thermal.high_to_low = true;
8140 queue_thermal = true;
8141 break;
8142 case 233: /* GUI IDLE */
8143 DRM_DEBUG("IH: GUI idle\n");
8144 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008145 case 241: /* SDMA Privileged inst */
8146 case 247: /* SDMA Privileged inst */
8147 DRM_ERROR("Illegal instruction in SDMA command stream\n");
8148 /* XXX check the bitfield order! */
8149 me_id = (ring_id & 0x3) >> 0;
8150 queue_id = (ring_id & 0xc) >> 2;
8151 switch (me_id) {
8152 case 0:
8153 switch (queue_id) {
8154 case 0:
8155 queue_reset = true;
8156 break;
8157 case 1:
8158 /* XXX compute */
8159 queue_reset = true;
8160 break;
8161 case 2:
8162 /* XXX compute */
8163 queue_reset = true;
8164 break;
8165 }
8166 break;
8167 case 1:
8168 switch (queue_id) {
8169 case 0:
8170 queue_reset = true;
8171 break;
8172 case 1:
8173 /* XXX compute */
8174 queue_reset = true;
8175 break;
8176 case 2:
8177 /* XXX compute */
8178 queue_reset = true;
8179 break;
8180 }
8181 break;
8182 }
8183 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008184 default:
8185 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8186 break;
8187 }
8188
8189 /* wptr/rptr are in bytes! */
8190 rptr += 16;
8191 rptr &= rdev->ih.ptr_mask;
Michel Dänzerf55e03b2014-09-19 12:22:10 +09008192 WREG32(IH_RB_RPTR, rptr);
Alex Deuchera59781b2012-11-09 10:45:57 -05008193 }
8194 if (queue_hotplug)
8195 schedule_work(&rdev->hotplug_work);
Christian König3c036382014-08-27 15:22:01 +02008196 if (queue_reset) {
8197 rdev->needs_reset = true;
8198 wake_up_all(&rdev->fence_queue);
8199 }
Alex Deucher41a524a2013-08-14 01:01:40 -04008200 if (queue_thermal)
8201 schedule_work(&rdev->pm.dpm.thermal.work);
Alex Deuchera59781b2012-11-09 10:45:57 -05008202 rdev->ih.rptr = rptr;
Alex Deuchera59781b2012-11-09 10:45:57 -05008203 atomic_set(&rdev->ih.lock, 0);
8204
8205 /* make sure wptr hasn't changed while processing */
8206 wptr = cik_get_ih_wptr(rdev);
8207 if (wptr != rptr)
8208 goto restart_ih;
8209
8210 return IRQ_HANDLED;
8211}
Alex Deucher7bf94a22012-08-17 11:48:29 -04008212
8213/*
8214 * startup/shutdown callbacks
8215 */
8216/**
8217 * cik_startup - program the asic to a functional state
8218 *
8219 * @rdev: radeon_device pointer
8220 *
8221 * Programs the asic to a functional state (CIK).
8222 * Called by cik_init() and cik_resume().
8223 * Returns 0 for success, error for failure.
8224 */
8225static int cik_startup(struct radeon_device *rdev)
8226{
8227 struct radeon_ring *ring;
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008228 u32 nop;
Alex Deucher7bf94a22012-08-17 11:48:29 -04008229 int r;
8230
Alex Deucher8a7cd272013-08-06 11:29:39 -04008231 /* enable pcie gen2/3 link */
8232 cik_pcie_gen3_enable(rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -04008233 /* enable aspm */
8234 cik_program_aspm(rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -04008235
Alex Deuchere5903d32013-08-30 08:58:20 -04008236 /* scratch needs to be initialized before MC */
8237 r = r600_vram_scratch_init(rdev);
8238 if (r)
8239 return r;
8240
Alex Deucher6fab3feb2013-08-04 12:13:17 -04008241 cik_mc_program(rdev);
8242
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008243 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
Alex Deucher7bf94a22012-08-17 11:48:29 -04008244 r = ci_mc_load_microcode(rdev);
8245 if (r) {
8246 DRM_ERROR("Failed to load MC firmware!\n");
8247 return r;
8248 }
8249 }
8250
Alex Deucher7bf94a22012-08-17 11:48:29 -04008251 r = cik_pcie_gart_enable(rdev);
8252 if (r)
8253 return r;
8254 cik_gpu_init(rdev);
8255
8256 /* allocate rlc buffers */
Alex Deucher22c775c2013-07-23 09:41:05 -04008257 if (rdev->flags & RADEON_IS_IGP) {
8258 if (rdev->family == CHIP_KAVERI) {
8259 rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
8260 rdev->rlc.reg_list_size =
8261 (u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
8262 } else {
8263 rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
8264 rdev->rlc.reg_list_size =
8265 (u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
8266 }
8267 }
8268 rdev->rlc.cs_data = ci_cs_data;
8269 rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
Alex Deucher1fd11772013-04-17 17:53:50 -04008270 r = sumo_rlc_init(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008271 if (r) {
8272 DRM_ERROR("Failed to init rlc BOs!\n");
8273 return r;
8274 }
8275
8276 /* allocate wb buffer */
8277 r = radeon_wb_init(rdev);
8278 if (r)
8279 return r;
8280
Alex Deucher963e81f2013-06-26 17:37:11 -04008281 /* allocate mec buffers */
8282 r = cik_mec_init(rdev);
8283 if (r) {
8284 DRM_ERROR("Failed to init MEC BOs!\n");
8285 return r;
8286 }
8287
Alex Deucher7bf94a22012-08-17 11:48:29 -04008288 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
8289 if (r) {
8290 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8291 return r;
8292 }
8293
Alex Deucher963e81f2013-06-26 17:37:11 -04008294 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8295 if (r) {
8296 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8297 return r;
8298 }
8299
8300 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
8301 if (r) {
8302 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8303 return r;
8304 }
8305
Alex Deucher7bf94a22012-08-17 11:48:29 -04008306 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
8307 if (r) {
8308 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8309 return r;
8310 }
8311
8312 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8313 if (r) {
8314 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8315 return r;
8316 }
8317
Alex Deucher2ce529d2013-08-28 18:12:59 -04008318 r = radeon_uvd_resume(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008319 if (!r) {
Alex Deucher2ce529d2013-08-28 18:12:59 -04008320 r = uvd_v4_2_resume(rdev);
8321 if (!r) {
8322 r = radeon_fence_driver_start_ring(rdev,
8323 R600_RING_TYPE_UVD_INDEX);
8324 if (r)
8325 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
8326 }
Christian König87167bb2013-04-09 13:39:21 -04008327 }
8328 if (r)
8329 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
8330
Christian Königd93f7932013-05-23 12:10:04 +02008331 r = radeon_vce_resume(rdev);
8332 if (!r) {
8333 r = vce_v2_0_resume(rdev);
8334 if (!r)
8335 r = radeon_fence_driver_start_ring(rdev,
8336 TN_RING_TYPE_VCE1_INDEX);
8337 if (!r)
8338 r = radeon_fence_driver_start_ring(rdev,
8339 TN_RING_TYPE_VCE2_INDEX);
8340 }
8341 if (r) {
8342 dev_err(rdev->dev, "VCE init error (%d).\n", r);
8343 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
8344 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
8345 }
8346
Alex Deucher7bf94a22012-08-17 11:48:29 -04008347 /* Enable IRQ */
8348 if (!rdev->irq.installed) {
8349 r = radeon_irq_kms_init(rdev);
8350 if (r)
8351 return r;
8352 }
8353
8354 r = cik_irq_init(rdev);
8355 if (r) {
8356 DRM_ERROR("radeon: IH init failed (%d).\n", r);
8357 radeon_irq_kms_fini(rdev);
8358 return r;
8359 }
8360 cik_irq_set(rdev);
8361
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008362 if (rdev->family == CHIP_HAWAII) {
Alex Deucher78cd3662014-08-01 20:05:31 +02008363 if (rdev->new_fw)
8364 nop = PACKET3(PACKET3_NOP, 0x3FFF);
8365 else
8366 nop = RADEON_CP_PACKET2;
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008367 } else {
8368 nop = PACKET3(PACKET3_NOP, 0x3FFF);
8369 }
8370
Alex Deucher7bf94a22012-08-17 11:48:29 -04008371 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8372 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008373 nop);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008374 if (r)
8375 return r;
8376
Alex Deucher963e81f2013-06-26 17:37:11 -04008377 /* set up the compute queues */
Alex Deucher2615b532013-06-03 11:21:58 -04008378 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008379 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8380 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008381 nop);
Alex Deucher963e81f2013-06-26 17:37:11 -04008382 if (r)
8383 return r;
8384 ring->me = 1; /* first MEC */
8385 ring->pipe = 0; /* first pipe */
8386 ring->queue = 0; /* first queue */
8387 ring->wptr_offs = CIK_WB_CP1_WPTR_OFFSET;
8388
Alex Deucher2615b532013-06-03 11:21:58 -04008389 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008390 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8391 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008392 nop);
Alex Deucher963e81f2013-06-26 17:37:11 -04008393 if (r)
8394 return r;
8395 /* dGPU only have 1 MEC */
8396 ring->me = 1; /* first MEC */
8397 ring->pipe = 0; /* first pipe */
8398 ring->queue = 1; /* second queue */
8399 ring->wptr_offs = CIK_WB_CP2_WPTR_OFFSET;
8400
Alex Deucher7bf94a22012-08-17 11:48:29 -04008401 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8402 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008403 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008404 if (r)
8405 return r;
8406
8407 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8408 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008409 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008410 if (r)
8411 return r;
8412
8413 r = cik_cp_resume(rdev);
8414 if (r)
8415 return r;
8416
8417 r = cik_sdma_resume(rdev);
8418 if (r)
8419 return r;
8420
Christian König87167bb2013-04-09 13:39:21 -04008421 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8422 if (ring->ring_size) {
Christian König02c9f7f2013-08-13 11:56:51 +02008423 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
Christian König2e1e6da2013-08-13 11:56:52 +02008424 RADEON_CP_PACKET2);
Christian König87167bb2013-04-09 13:39:21 -04008425 if (!r)
Christian Könige409b122013-08-13 11:56:53 +02008426 r = uvd_v1_0_init(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008427 if (r)
8428 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
8429 }
8430
Christian Königd93f7932013-05-23 12:10:04 +02008431 r = -ENOENT;
8432
8433 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8434 if (ring->ring_size)
8435 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8436 VCE_CMD_NO_OP);
8437
8438 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8439 if (ring->ring_size)
8440 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8441 VCE_CMD_NO_OP);
8442
8443 if (!r)
8444 r = vce_v1_0_init(rdev);
8445 else if (r != -ENOENT)
8446 DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
8447
Alex Deucher7bf94a22012-08-17 11:48:29 -04008448 r = radeon_ib_pool_init(rdev);
8449 if (r) {
8450 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
8451 return r;
8452 }
8453
8454 r = radeon_vm_manager_init(rdev);
8455 if (r) {
8456 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
8457 return r;
8458 }
8459
Alex Deucherb5306022013-07-31 16:51:33 -04008460 r = dce6_audio_init(rdev);
8461 if (r)
8462 return r;
8463
Alex Deucher7bf94a22012-08-17 11:48:29 -04008464 return 0;
8465}
8466
8467/**
8468 * cik_resume - resume the asic to a functional state
8469 *
8470 * @rdev: radeon_device pointer
8471 *
8472 * Programs the asic to a functional state (CIK).
8473 * Called at resume.
8474 * Returns 0 for success, error for failure.
8475 */
8476int cik_resume(struct radeon_device *rdev)
8477{
8478 int r;
8479
8480 /* post card */
8481 atom_asic_init(rdev->mode_info.atom_context);
8482
Alex Deucher0aafd312013-04-09 14:43:30 -04008483 /* init golden registers */
8484 cik_init_golden_registers(rdev);
8485
Alex Deucherbc6a6292014-02-25 12:01:28 -05008486 if (rdev->pm.pm_method == PM_METHOD_DPM)
8487 radeon_pm_resume(rdev);
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008488
Alex Deucher7bf94a22012-08-17 11:48:29 -04008489 rdev->accel_working = true;
8490 r = cik_startup(rdev);
8491 if (r) {
8492 DRM_ERROR("cik startup failed on resume\n");
8493 rdev->accel_working = false;
8494 return r;
8495 }
8496
8497 return r;
8498
8499}
8500
8501/**
8502 * cik_suspend - suspend the asic
8503 *
8504 * @rdev: radeon_device pointer
8505 *
8506 * Bring the chip into a state suitable for suspend (CIK).
8507 * Called at suspend.
8508 * Returns 0 for success.
8509 */
8510int cik_suspend(struct radeon_device *rdev)
8511{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008512 radeon_pm_suspend(rdev);
Alex Deucherb5306022013-07-31 16:51:33 -04008513 dce6_audio_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008514 radeon_vm_manager_fini(rdev);
8515 cik_cp_enable(rdev, false);
8516 cik_sdma_enable(rdev, false);
Christian Könige409b122013-08-13 11:56:53 +02008517 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008518 radeon_uvd_suspend(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008519 radeon_vce_suspend(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008520 cik_fini_pg(rdev);
8521 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008522 cik_irq_suspend(rdev);
8523 radeon_wb_disable(rdev);
8524 cik_pcie_gart_disable(rdev);
8525 return 0;
8526}
8527
8528/* Plan is to move initialization in that function and use
8529 * helper function so that radeon_device_init pretty much
8530 * do nothing more than calling asic specific function. This
8531 * should also allow to remove a bunch of callback function
8532 * like vram_info.
8533 */
8534/**
8535 * cik_init - asic specific driver and hw init
8536 *
8537 * @rdev: radeon_device pointer
8538 *
8539 * Setup asic specific driver variables and program the hw
8540 * to a functional state (CIK).
8541 * Called at driver startup.
8542 * Returns 0 for success, errors for failure.
8543 */
8544int cik_init(struct radeon_device *rdev)
8545{
8546 struct radeon_ring *ring;
8547 int r;
8548
8549 /* Read BIOS */
8550 if (!radeon_get_bios(rdev)) {
8551 if (ASIC_IS_AVIVO(rdev))
8552 return -EINVAL;
8553 }
8554 /* Must be an ATOMBIOS */
8555 if (!rdev->is_atom_bios) {
8556 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
8557 return -EINVAL;
8558 }
8559 r = radeon_atombios_init(rdev);
8560 if (r)
8561 return r;
8562
8563 /* Post card if necessary */
8564 if (!radeon_card_posted(rdev)) {
8565 if (!rdev->bios) {
8566 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
8567 return -EINVAL;
8568 }
8569 DRM_INFO("GPU not posted. posting now...\n");
8570 atom_asic_init(rdev->mode_info.atom_context);
8571 }
Alex Deucher0aafd312013-04-09 14:43:30 -04008572 /* init golden registers */
8573 cik_init_golden_registers(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008574 /* Initialize scratch registers */
8575 cik_scratch_init(rdev);
8576 /* Initialize surface registers */
8577 radeon_surface_init(rdev);
8578 /* Initialize clocks */
8579 radeon_get_clock_info(rdev->ddev);
8580
8581 /* Fence driver */
8582 r = radeon_fence_driver_init(rdev);
8583 if (r)
8584 return r;
8585
8586 /* initialize memory controller */
8587 r = cik_mc_init(rdev);
8588 if (r)
8589 return r;
8590 /* Memory manager */
8591 r = radeon_bo_init(rdev);
8592 if (r)
8593 return r;
8594
Alex Deucher01ac8792013-12-18 19:11:27 -05008595 if (rdev->flags & RADEON_IS_IGP) {
8596 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8597 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
8598 r = cik_init_microcode(rdev);
8599 if (r) {
8600 DRM_ERROR("Failed to load firmware!\n");
8601 return r;
8602 }
8603 }
8604 } else {
8605 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8606 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
8607 !rdev->mc_fw) {
8608 r = cik_init_microcode(rdev);
8609 if (r) {
8610 DRM_ERROR("Failed to load firmware!\n");
8611 return r;
8612 }
8613 }
8614 }
8615
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008616 /* Initialize power management */
8617 radeon_pm_init(rdev);
8618
Alex Deucher7bf94a22012-08-17 11:48:29 -04008619 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8620 ring->ring_obj = NULL;
8621 r600_ring_init(rdev, ring, 1024 * 1024);
8622
Alex Deucher963e81f2013-06-26 17:37:11 -04008623 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8624 ring->ring_obj = NULL;
8625 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008626 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008627 if (r)
8628 return r;
8629
8630 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8631 ring->ring_obj = NULL;
8632 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008633 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008634 if (r)
8635 return r;
8636
Alex Deucher7bf94a22012-08-17 11:48:29 -04008637 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8638 ring->ring_obj = NULL;
8639 r600_ring_init(rdev, ring, 256 * 1024);
8640
8641 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8642 ring->ring_obj = NULL;
8643 r600_ring_init(rdev, ring, 256 * 1024);
8644
Christian König87167bb2013-04-09 13:39:21 -04008645 r = radeon_uvd_init(rdev);
8646 if (!r) {
8647 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8648 ring->ring_obj = NULL;
8649 r600_ring_init(rdev, ring, 4096);
8650 }
8651
Christian Königd93f7932013-05-23 12:10:04 +02008652 r = radeon_vce_init(rdev);
8653 if (!r) {
8654 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8655 ring->ring_obj = NULL;
8656 r600_ring_init(rdev, ring, 4096);
8657
8658 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8659 ring->ring_obj = NULL;
8660 r600_ring_init(rdev, ring, 4096);
8661 }
8662
Alex Deucher7bf94a22012-08-17 11:48:29 -04008663 rdev->ih.ring_obj = NULL;
8664 r600_ih_ring_init(rdev, 64 * 1024);
8665
8666 r = r600_pcie_gart_init(rdev);
8667 if (r)
8668 return r;
8669
8670 rdev->accel_working = true;
8671 r = cik_startup(rdev);
8672 if (r) {
8673 dev_err(rdev->dev, "disabling GPU acceleration\n");
8674 cik_cp_fini(rdev);
8675 cik_sdma_fini(rdev);
8676 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008677 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008678 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008679 radeon_wb_fini(rdev);
8680 radeon_ib_pool_fini(rdev);
8681 radeon_vm_manager_fini(rdev);
8682 radeon_irq_kms_fini(rdev);
8683 cik_pcie_gart_fini(rdev);
8684 rdev->accel_working = false;
8685 }
8686
8687 /* Don't start up if the MC ucode is missing.
8688 * The default clocks and voltages before the MC ucode
8689 * is loaded are not suffient for advanced operations.
8690 */
8691 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
8692 DRM_ERROR("radeon: MC ucode required for NI+.\n");
8693 return -EINVAL;
8694 }
8695
8696 return 0;
8697}
8698
8699/**
8700 * cik_fini - asic specific driver and hw fini
8701 *
8702 * @rdev: radeon_device pointer
8703 *
8704 * Tear down the asic specific driver variables and program the hw
8705 * to an idle state (CIK).
8706 * Called at driver unload.
8707 */
8708void cik_fini(struct radeon_device *rdev)
8709{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008710 radeon_pm_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008711 cik_cp_fini(rdev);
8712 cik_sdma_fini(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008713 cik_fini_pg(rdev);
8714 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008715 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008716 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008717 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008718 radeon_wb_fini(rdev);
8719 radeon_vm_manager_fini(rdev);
8720 radeon_ib_pool_fini(rdev);
8721 radeon_irq_kms_fini(rdev);
Christian Könige409b122013-08-13 11:56:53 +02008722 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008723 radeon_uvd_fini(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008724 radeon_vce_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008725 cik_pcie_gart_fini(rdev);
8726 r600_vram_scratch_fini(rdev);
8727 radeon_gem_fini(rdev);
8728 radeon_fence_driver_fini(rdev);
8729 radeon_bo_fini(rdev);
8730 radeon_atombios_fini(rdev);
8731 kfree(rdev->bios);
8732 rdev->bios = NULL;
8733}
Alex Deuchercd84a272012-07-20 17:13:13 -04008734
Alex Deucher134b4802013-09-23 12:22:11 -04008735void dce8_program_fmt(struct drm_encoder *encoder)
8736{
8737 struct drm_device *dev = encoder->dev;
8738 struct radeon_device *rdev = dev->dev_private;
8739 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
8740 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
8741 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
8742 int bpc = 0;
8743 u32 tmp = 0;
Alex Deucher6214bb72013-09-24 17:26:26 -04008744 enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
Alex Deucher134b4802013-09-23 12:22:11 -04008745
Alex Deucher6214bb72013-09-24 17:26:26 -04008746 if (connector) {
8747 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
Alex Deucher134b4802013-09-23 12:22:11 -04008748 bpc = radeon_get_monitor_bpc(connector);
Alex Deucher6214bb72013-09-24 17:26:26 -04008749 dither = radeon_connector->dither;
8750 }
Alex Deucher134b4802013-09-23 12:22:11 -04008751
8752 /* LVDS/eDP FMT is set up by atom */
8753 if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
8754 return;
8755
8756 /* not needed for analog */
8757 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
8758 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
8759 return;
8760
8761 if (bpc == 0)
8762 return;
8763
8764 switch (bpc) {
8765 case 6:
Alex Deucher6214bb72013-09-24 17:26:26 -04008766 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008767 /* XXX sort out optimal dither settings */
8768 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8769 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(0));
8770 else
8771 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(0));
8772 break;
8773 case 8:
Alex Deucher6214bb72013-09-24 17:26:26 -04008774 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008775 /* XXX sort out optimal dither settings */
8776 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8777 FMT_RGB_RANDOM_ENABLE |
8778 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(1));
8779 else
8780 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(1));
8781 break;
8782 case 10:
Alex Deucher6214bb72013-09-24 17:26:26 -04008783 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008784 /* XXX sort out optimal dither settings */
8785 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8786 FMT_RGB_RANDOM_ENABLE |
8787 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(2));
8788 else
8789 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(2));
8790 break;
8791 default:
8792 /* not needed */
8793 break;
8794 }
8795
8796 WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
8797}
8798
Alex Deuchercd84a272012-07-20 17:13:13 -04008799/* display watermark setup */
8800/**
8801 * dce8_line_buffer_adjust - Set up the line buffer
8802 *
8803 * @rdev: radeon_device pointer
8804 * @radeon_crtc: the selected display controller
8805 * @mode: the current display mode on the selected display
8806 * controller
8807 *
8808 * Setup up the line buffer allocation for
8809 * the selected display controller (CIK).
8810 * Returns the line buffer size in pixels.
8811 */
8812static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
8813 struct radeon_crtc *radeon_crtc,
8814 struct drm_display_mode *mode)
8815{
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008816 u32 tmp, buffer_alloc, i;
8817 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
Alex Deuchercd84a272012-07-20 17:13:13 -04008818 /*
8819 * Line Buffer Setup
8820 * There are 6 line buffers, one for each display controllers.
8821 * There are 3 partitions per LB. Select the number of partitions
8822 * to enable based on the display width. For display widths larger
8823 * than 4096, you need use to use 2 display controllers and combine
8824 * them using the stereo blender.
8825 */
8826 if (radeon_crtc->base.enabled && mode) {
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008827 if (mode->crtc_hdisplay < 1920) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008828 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008829 buffer_alloc = 2;
8830 } else if (mode->crtc_hdisplay < 2560) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008831 tmp = 2;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008832 buffer_alloc = 2;
8833 } else if (mode->crtc_hdisplay < 4096) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008834 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008835 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
8836 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008837 DRM_DEBUG_KMS("Mode too big for LB!\n");
8838 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008839 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
Alex Deuchercd84a272012-07-20 17:13:13 -04008840 }
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008841 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008842 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008843 buffer_alloc = 0;
8844 }
Alex Deuchercd84a272012-07-20 17:13:13 -04008845
8846 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
8847 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
8848
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008849 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
8850 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
8851 for (i = 0; i < rdev->usec_timeout; i++) {
8852 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
8853 DMIF_BUFFERS_ALLOCATED_COMPLETED)
8854 break;
8855 udelay(1);
8856 }
8857
Alex Deuchercd84a272012-07-20 17:13:13 -04008858 if (radeon_crtc->base.enabled && mode) {
8859 switch (tmp) {
8860 case 0:
8861 default:
8862 return 4096 * 2;
8863 case 1:
8864 return 1920 * 2;
8865 case 2:
8866 return 2560 * 2;
8867 }
8868 }
8869
8870 /* controller not enabled, so no lb used */
8871 return 0;
8872}
8873
8874/**
8875 * cik_get_number_of_dram_channels - get the number of dram channels
8876 *
8877 * @rdev: radeon_device pointer
8878 *
8879 * Look up the number of video ram channels (CIK).
8880 * Used for display watermark bandwidth calculations
8881 * Returns the number of dram channels
8882 */
8883static u32 cik_get_number_of_dram_channels(struct radeon_device *rdev)
8884{
8885 u32 tmp = RREG32(MC_SHARED_CHMAP);
8886
8887 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
8888 case 0:
8889 default:
8890 return 1;
8891 case 1:
8892 return 2;
8893 case 2:
8894 return 4;
8895 case 3:
8896 return 8;
8897 case 4:
8898 return 3;
8899 case 5:
8900 return 6;
8901 case 6:
8902 return 10;
8903 case 7:
8904 return 12;
8905 case 8:
8906 return 16;
8907 }
8908}
8909
8910struct dce8_wm_params {
8911 u32 dram_channels; /* number of dram channels */
8912 u32 yclk; /* bandwidth per dram data pin in kHz */
8913 u32 sclk; /* engine clock in kHz */
8914 u32 disp_clk; /* display clock in kHz */
8915 u32 src_width; /* viewport width */
8916 u32 active_time; /* active display time in ns */
8917 u32 blank_time; /* blank time in ns */
8918 bool interlaced; /* mode is interlaced */
8919 fixed20_12 vsc; /* vertical scale ratio */
8920 u32 num_heads; /* number of active crtcs */
8921 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
8922 u32 lb_size; /* line buffer allocated to pipe */
8923 u32 vtaps; /* vertical scaler taps */
8924};
8925
8926/**
8927 * dce8_dram_bandwidth - get the dram bandwidth
8928 *
8929 * @wm: watermark calculation data
8930 *
8931 * Calculate the raw dram bandwidth (CIK).
8932 * Used for display watermark bandwidth calculations
8933 * Returns the dram bandwidth in MBytes/s
8934 */
8935static u32 dce8_dram_bandwidth(struct dce8_wm_params *wm)
8936{
8937 /* Calculate raw DRAM Bandwidth */
8938 fixed20_12 dram_efficiency; /* 0.7 */
8939 fixed20_12 yclk, dram_channels, bandwidth;
8940 fixed20_12 a;
8941
8942 a.full = dfixed_const(1000);
8943 yclk.full = dfixed_const(wm->yclk);
8944 yclk.full = dfixed_div(yclk, a);
8945 dram_channels.full = dfixed_const(wm->dram_channels * 4);
8946 a.full = dfixed_const(10);
8947 dram_efficiency.full = dfixed_const(7);
8948 dram_efficiency.full = dfixed_div(dram_efficiency, a);
8949 bandwidth.full = dfixed_mul(dram_channels, yclk);
8950 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
8951
8952 return dfixed_trunc(bandwidth);
8953}
8954
8955/**
8956 * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
8957 *
8958 * @wm: watermark calculation data
8959 *
8960 * Calculate the dram bandwidth used for display (CIK).
8961 * Used for display watermark bandwidth calculations
8962 * Returns the dram bandwidth for display in MBytes/s
8963 */
8964static u32 dce8_dram_bandwidth_for_display(struct dce8_wm_params *wm)
8965{
8966 /* Calculate DRAM Bandwidth and the part allocated to display. */
8967 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
8968 fixed20_12 yclk, dram_channels, bandwidth;
8969 fixed20_12 a;
8970
8971 a.full = dfixed_const(1000);
8972 yclk.full = dfixed_const(wm->yclk);
8973 yclk.full = dfixed_div(yclk, a);
8974 dram_channels.full = dfixed_const(wm->dram_channels * 4);
8975 a.full = dfixed_const(10);
8976 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
8977 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
8978 bandwidth.full = dfixed_mul(dram_channels, yclk);
8979 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
8980
8981 return dfixed_trunc(bandwidth);
8982}
8983
8984/**
8985 * dce8_data_return_bandwidth - get the data return bandwidth
8986 *
8987 * @wm: watermark calculation data
8988 *
8989 * Calculate the data return bandwidth used for display (CIK).
8990 * Used for display watermark bandwidth calculations
8991 * Returns the data return bandwidth in MBytes/s
8992 */
8993static u32 dce8_data_return_bandwidth(struct dce8_wm_params *wm)
8994{
8995 /* Calculate the display Data return Bandwidth */
8996 fixed20_12 return_efficiency; /* 0.8 */
8997 fixed20_12 sclk, bandwidth;
8998 fixed20_12 a;
8999
9000 a.full = dfixed_const(1000);
9001 sclk.full = dfixed_const(wm->sclk);
9002 sclk.full = dfixed_div(sclk, a);
9003 a.full = dfixed_const(10);
9004 return_efficiency.full = dfixed_const(8);
9005 return_efficiency.full = dfixed_div(return_efficiency, a);
9006 a.full = dfixed_const(32);
9007 bandwidth.full = dfixed_mul(a, sclk);
9008 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
9009
9010 return dfixed_trunc(bandwidth);
9011}
9012
9013/**
9014 * dce8_dmif_request_bandwidth - get the dmif bandwidth
9015 *
9016 * @wm: watermark calculation data
9017 *
9018 * Calculate the dmif bandwidth used for display (CIK).
9019 * Used for display watermark bandwidth calculations
9020 * Returns the dmif bandwidth in MBytes/s
9021 */
9022static u32 dce8_dmif_request_bandwidth(struct dce8_wm_params *wm)
9023{
9024 /* Calculate the DMIF Request Bandwidth */
9025 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
9026 fixed20_12 disp_clk, bandwidth;
9027 fixed20_12 a, b;
9028
9029 a.full = dfixed_const(1000);
9030 disp_clk.full = dfixed_const(wm->disp_clk);
9031 disp_clk.full = dfixed_div(disp_clk, a);
9032 a.full = dfixed_const(32);
9033 b.full = dfixed_mul(a, disp_clk);
9034
9035 a.full = dfixed_const(10);
9036 disp_clk_request_efficiency.full = dfixed_const(8);
9037 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
9038
9039 bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
9040
9041 return dfixed_trunc(bandwidth);
9042}
9043
9044/**
9045 * dce8_available_bandwidth - get the min available bandwidth
9046 *
9047 * @wm: watermark calculation data
9048 *
9049 * Calculate the min available bandwidth used for display (CIK).
9050 * Used for display watermark bandwidth calculations
9051 * Returns the min available bandwidth in MBytes/s
9052 */
9053static u32 dce8_available_bandwidth(struct dce8_wm_params *wm)
9054{
9055 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
9056 u32 dram_bandwidth = dce8_dram_bandwidth(wm);
9057 u32 data_return_bandwidth = dce8_data_return_bandwidth(wm);
9058 u32 dmif_req_bandwidth = dce8_dmif_request_bandwidth(wm);
9059
9060 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
9061}
9062
9063/**
9064 * dce8_average_bandwidth - get the average available bandwidth
9065 *
9066 * @wm: watermark calculation data
9067 *
9068 * Calculate the average available bandwidth used for display (CIK).
9069 * Used for display watermark bandwidth calculations
9070 * Returns the average available bandwidth in MBytes/s
9071 */
9072static u32 dce8_average_bandwidth(struct dce8_wm_params *wm)
9073{
9074 /* Calculate the display mode Average Bandwidth
9075 * DisplayMode should contain the source and destination dimensions,
9076 * timing, etc.
9077 */
9078 fixed20_12 bpp;
9079 fixed20_12 line_time;
9080 fixed20_12 src_width;
9081 fixed20_12 bandwidth;
9082 fixed20_12 a;
9083
9084 a.full = dfixed_const(1000);
9085 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
9086 line_time.full = dfixed_div(line_time, a);
9087 bpp.full = dfixed_const(wm->bytes_per_pixel);
9088 src_width.full = dfixed_const(wm->src_width);
9089 bandwidth.full = dfixed_mul(src_width, bpp);
9090 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
9091 bandwidth.full = dfixed_div(bandwidth, line_time);
9092
9093 return dfixed_trunc(bandwidth);
9094}
9095
9096/**
9097 * dce8_latency_watermark - get the latency watermark
9098 *
9099 * @wm: watermark calculation data
9100 *
9101 * Calculate the latency watermark (CIK).
9102 * Used for display watermark bandwidth calculations
9103 * Returns the latency watermark in ns
9104 */
9105static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
9106{
9107 /* First calculate the latency in ns */
9108 u32 mc_latency = 2000; /* 2000 ns. */
9109 u32 available_bandwidth = dce8_available_bandwidth(wm);
9110 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
9111 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
9112 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
9113 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
9114 (wm->num_heads * cursor_line_pair_return_time);
9115 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
9116 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
9117 u32 tmp, dmif_size = 12288;
9118 fixed20_12 a, b, c;
9119
9120 if (wm->num_heads == 0)
9121 return 0;
9122
9123 a.full = dfixed_const(2);
9124 b.full = dfixed_const(1);
9125 if ((wm->vsc.full > a.full) ||
9126 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
9127 (wm->vtaps >= 5) ||
9128 ((wm->vsc.full >= a.full) && wm->interlaced))
9129 max_src_lines_per_dst_line = 4;
9130 else
9131 max_src_lines_per_dst_line = 2;
9132
9133 a.full = dfixed_const(available_bandwidth);
9134 b.full = dfixed_const(wm->num_heads);
9135 a.full = dfixed_div(a, b);
9136
9137 b.full = dfixed_const(mc_latency + 512);
9138 c.full = dfixed_const(wm->disp_clk);
9139 b.full = dfixed_div(b, c);
9140
9141 c.full = dfixed_const(dmif_size);
9142 b.full = dfixed_div(c, b);
9143
9144 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
9145
9146 b.full = dfixed_const(1000);
9147 c.full = dfixed_const(wm->disp_clk);
9148 b.full = dfixed_div(c, b);
9149 c.full = dfixed_const(wm->bytes_per_pixel);
9150 b.full = dfixed_mul(b, c);
9151
9152 lb_fill_bw = min(tmp, dfixed_trunc(b));
9153
9154 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
9155 b.full = dfixed_const(1000);
9156 c.full = dfixed_const(lb_fill_bw);
9157 b.full = dfixed_div(c, b);
9158 a.full = dfixed_div(a, b);
9159 line_fill_time = dfixed_trunc(a);
9160
9161 if (line_fill_time < wm->active_time)
9162 return latency;
9163 else
9164 return latency + (line_fill_time - wm->active_time);
9165
9166}
9167
9168/**
9169 * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
9170 * average and available dram bandwidth
9171 *
9172 * @wm: watermark calculation data
9173 *
9174 * Check if the display average bandwidth fits in the display
9175 * dram bandwidth (CIK).
9176 * Used for display watermark bandwidth calculations
9177 * Returns true if the display fits, false if not.
9178 */
9179static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9180{
9181 if (dce8_average_bandwidth(wm) <=
9182 (dce8_dram_bandwidth_for_display(wm) / wm->num_heads))
9183 return true;
9184 else
9185 return false;
9186}
9187
9188/**
9189 * dce8_average_bandwidth_vs_available_bandwidth - check
9190 * average and available bandwidth
9191 *
9192 * @wm: watermark calculation data
9193 *
9194 * Check if the display average bandwidth fits in the display
9195 * available bandwidth (CIK).
9196 * Used for display watermark bandwidth calculations
9197 * Returns true if the display fits, false if not.
9198 */
9199static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params *wm)
9200{
9201 if (dce8_average_bandwidth(wm) <=
9202 (dce8_available_bandwidth(wm) / wm->num_heads))
9203 return true;
9204 else
9205 return false;
9206}
9207
9208/**
9209 * dce8_check_latency_hiding - check latency hiding
9210 *
9211 * @wm: watermark calculation data
9212 *
9213 * Check latency hiding (CIK).
9214 * Used for display watermark bandwidth calculations
9215 * Returns true if the display fits, false if not.
9216 */
9217static bool dce8_check_latency_hiding(struct dce8_wm_params *wm)
9218{
9219 u32 lb_partitions = wm->lb_size / wm->src_width;
9220 u32 line_time = wm->active_time + wm->blank_time;
9221 u32 latency_tolerant_lines;
9222 u32 latency_hiding;
9223 fixed20_12 a;
9224
9225 a.full = dfixed_const(1);
9226 if (wm->vsc.full > a.full)
9227 latency_tolerant_lines = 1;
9228 else {
9229 if (lb_partitions <= (wm->vtaps + 1))
9230 latency_tolerant_lines = 1;
9231 else
9232 latency_tolerant_lines = 2;
9233 }
9234
9235 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
9236
9237 if (dce8_latency_watermark(wm) <= latency_hiding)
9238 return true;
9239 else
9240 return false;
9241}
9242
9243/**
9244 * dce8_program_watermarks - program display watermarks
9245 *
9246 * @rdev: radeon_device pointer
9247 * @radeon_crtc: the selected display controller
9248 * @lb_size: line buffer size
9249 * @num_heads: number of display controllers in use
9250 *
9251 * Calculate and program the display watermarks for the
9252 * selected display controller (CIK).
9253 */
9254static void dce8_program_watermarks(struct radeon_device *rdev,
9255 struct radeon_crtc *radeon_crtc,
9256 u32 lb_size, u32 num_heads)
9257{
9258 struct drm_display_mode *mode = &radeon_crtc->base.mode;
Alex Deucher58ea2de2013-01-24 10:03:39 -05009259 struct dce8_wm_params wm_low, wm_high;
Alex Deuchercd84a272012-07-20 17:13:13 -04009260 u32 pixel_period;
9261 u32 line_time = 0;
9262 u32 latency_watermark_a = 0, latency_watermark_b = 0;
9263 u32 tmp, wm_mask;
9264
9265 if (radeon_crtc->base.enabled && num_heads && mode) {
9266 pixel_period = 1000000 / (u32)mode->clock;
9267 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
9268
Alex Deucher58ea2de2013-01-24 10:03:39 -05009269 /* watermark for high clocks */
9270 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9271 rdev->pm.dpm_enabled) {
9272 wm_high.yclk =
9273 radeon_dpm_get_mclk(rdev, false) * 10;
9274 wm_high.sclk =
9275 radeon_dpm_get_sclk(rdev, false) * 10;
9276 } else {
9277 wm_high.yclk = rdev->pm.current_mclk * 10;
9278 wm_high.sclk = rdev->pm.current_sclk * 10;
9279 }
9280
9281 wm_high.disp_clk = mode->clock;
9282 wm_high.src_width = mode->crtc_hdisplay;
9283 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
9284 wm_high.blank_time = line_time - wm_high.active_time;
9285 wm_high.interlaced = false;
Alex Deuchercd84a272012-07-20 17:13:13 -04009286 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009287 wm_high.interlaced = true;
9288 wm_high.vsc = radeon_crtc->vsc;
9289 wm_high.vtaps = 1;
Alex Deuchercd84a272012-07-20 17:13:13 -04009290 if (radeon_crtc->rmx_type != RMX_OFF)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009291 wm_high.vtaps = 2;
9292 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
9293 wm_high.lb_size = lb_size;
9294 wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
9295 wm_high.num_heads = num_heads;
Alex Deuchercd84a272012-07-20 17:13:13 -04009296
9297 /* set for high clocks */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009298 latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
Alex Deuchercd84a272012-07-20 17:13:13 -04009299
9300 /* possibly force display priority to high */
9301 /* should really do this at mode validation time... */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009302 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
9303 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
9304 !dce8_check_latency_hiding(&wm_high) ||
9305 (rdev->disp_priority == 2)) {
9306 DRM_DEBUG_KMS("force priority to high\n");
9307 }
9308
9309 /* watermark for low clocks */
9310 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9311 rdev->pm.dpm_enabled) {
9312 wm_low.yclk =
9313 radeon_dpm_get_mclk(rdev, true) * 10;
9314 wm_low.sclk =
9315 radeon_dpm_get_sclk(rdev, true) * 10;
9316 } else {
9317 wm_low.yclk = rdev->pm.current_mclk * 10;
9318 wm_low.sclk = rdev->pm.current_sclk * 10;
9319 }
9320
9321 wm_low.disp_clk = mode->clock;
9322 wm_low.src_width = mode->crtc_hdisplay;
9323 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
9324 wm_low.blank_time = line_time - wm_low.active_time;
9325 wm_low.interlaced = false;
9326 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
9327 wm_low.interlaced = true;
9328 wm_low.vsc = radeon_crtc->vsc;
9329 wm_low.vtaps = 1;
9330 if (radeon_crtc->rmx_type != RMX_OFF)
9331 wm_low.vtaps = 2;
9332 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
9333 wm_low.lb_size = lb_size;
9334 wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
9335 wm_low.num_heads = num_heads;
9336
9337 /* set for low clocks */
9338 latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
9339
9340 /* possibly force display priority to high */
9341 /* should really do this at mode validation time... */
9342 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
9343 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
9344 !dce8_check_latency_hiding(&wm_low) ||
Alex Deuchercd84a272012-07-20 17:13:13 -04009345 (rdev->disp_priority == 2)) {
9346 DRM_DEBUG_KMS("force priority to high\n");
9347 }
9348 }
9349
9350 /* select wm A */
9351 wm_mask = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9352 tmp = wm_mask;
9353 tmp &= ~LATENCY_WATERMARK_MASK(3);
9354 tmp |= LATENCY_WATERMARK_MASK(1);
9355 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9356 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9357 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
9358 LATENCY_HIGH_WATERMARK(line_time)));
9359 /* select wm B */
9360 tmp = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9361 tmp &= ~LATENCY_WATERMARK_MASK(3);
9362 tmp |= LATENCY_WATERMARK_MASK(2);
9363 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9364 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9365 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
9366 LATENCY_HIGH_WATERMARK(line_time)));
9367 /* restore original selection */
9368 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
Alex Deucher58ea2de2013-01-24 10:03:39 -05009369
9370 /* save values for DPM */
9371 radeon_crtc->line_time = line_time;
9372 radeon_crtc->wm_high = latency_watermark_a;
9373 radeon_crtc->wm_low = latency_watermark_b;
Alex Deuchercd84a272012-07-20 17:13:13 -04009374}
9375
9376/**
9377 * dce8_bandwidth_update - program display watermarks
9378 *
9379 * @rdev: radeon_device pointer
9380 *
9381 * Calculate and program the display watermarks and line
9382 * buffer allocation (CIK).
9383 */
9384void dce8_bandwidth_update(struct radeon_device *rdev)
9385{
9386 struct drm_display_mode *mode = NULL;
9387 u32 num_heads = 0, lb_size;
9388 int i;
9389
9390 radeon_update_display_priority(rdev);
9391
9392 for (i = 0; i < rdev->num_crtc; i++) {
9393 if (rdev->mode_info.crtcs[i]->base.enabled)
9394 num_heads++;
9395 }
9396 for (i = 0; i < rdev->num_crtc; i++) {
9397 mode = &rdev->mode_info.crtcs[i]->base.mode;
9398 lb_size = dce8_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode);
9399 dce8_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
9400 }
9401}
Alex Deucher44fa3462012-12-18 22:17:00 -05009402
9403/**
9404 * cik_get_gpu_clock_counter - return GPU clock counter snapshot
9405 *
9406 * @rdev: radeon_device pointer
9407 *
9408 * Fetches a GPU clock counter snapshot (SI).
9409 * Returns the 64 bit clock counter snapshot.
9410 */
9411uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
9412{
9413 uint64_t clock;
9414
9415 mutex_lock(&rdev->gpu_clock_mutex);
9416 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
9417 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
9418 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
9419 mutex_unlock(&rdev->gpu_clock_mutex);
9420 return clock;
9421}
9422
Christian König87167bb2013-04-09 13:39:21 -04009423static int cik_set_uvd_clock(struct radeon_device *rdev, u32 clock,
9424 u32 cntl_reg, u32 status_reg)
9425{
9426 int r, i;
9427 struct atom_clock_dividers dividers;
9428 uint32_t tmp;
9429
9430 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9431 clock, false, &dividers);
9432 if (r)
9433 return r;
9434
9435 tmp = RREG32_SMC(cntl_reg);
9436 tmp &= ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK);
9437 tmp |= dividers.post_divider;
9438 WREG32_SMC(cntl_reg, tmp);
9439
9440 for (i = 0; i < 100; i++) {
9441 if (RREG32_SMC(status_reg) & DCLK_STATUS)
9442 break;
9443 mdelay(10);
9444 }
9445 if (i == 100)
9446 return -ETIMEDOUT;
9447
9448 return 0;
9449}
9450
9451int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
9452{
9453 int r = 0;
9454
9455 r = cik_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
9456 if (r)
9457 return r;
9458
9459 r = cik_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
9460 return r;
9461}
9462
Alex Deucher5ad6bf92013-08-22 17:09:06 -04009463int cik_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
9464{
9465 int r, i;
9466 struct atom_clock_dividers dividers;
9467 u32 tmp;
9468
9469 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9470 ecclk, false, &dividers);
9471 if (r)
9472 return r;
9473
9474 for (i = 0; i < 100; i++) {
9475 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9476 break;
9477 mdelay(10);
9478 }
9479 if (i == 100)
9480 return -ETIMEDOUT;
9481
9482 tmp = RREG32_SMC(CG_ECLK_CNTL);
9483 tmp &= ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK);
9484 tmp |= dividers.post_divider;
9485 WREG32_SMC(CG_ECLK_CNTL, tmp);
9486
9487 for (i = 0; i < 100; i++) {
9488 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9489 break;
9490 mdelay(10);
9491 }
9492 if (i == 100)
9493 return -ETIMEDOUT;
9494
9495 return 0;
9496}
9497
Alex Deucher8a7cd272013-08-06 11:29:39 -04009498static void cik_pcie_gen3_enable(struct radeon_device *rdev)
Christian König87167bb2013-04-09 13:39:21 -04009499{
Alex Deucher8a7cd272013-08-06 11:29:39 -04009500 struct pci_dev *root = rdev->pdev->bus->self;
9501 int bridge_pos, gpu_pos;
9502 u32 speed_cntl, mask, current_data_rate;
9503 int ret, i;
9504 u16 tmp16;
Christian König87167bb2013-04-09 13:39:21 -04009505
Alex Williamson0bd252d2014-08-27 13:01:35 -06009506 if (pci_is_root_bus(rdev->pdev->bus))
9507 return;
9508
Alex Deucher8a7cd272013-08-06 11:29:39 -04009509 if (radeon_pcie_gen2 == 0)
9510 return;
Christian König87167bb2013-04-09 13:39:21 -04009511
Alex Deucher8a7cd272013-08-06 11:29:39 -04009512 if (rdev->flags & RADEON_IS_IGP)
9513 return;
Christian König87167bb2013-04-09 13:39:21 -04009514
Alex Deucher8a7cd272013-08-06 11:29:39 -04009515 if (!(rdev->flags & RADEON_IS_PCIE))
9516 return;
Christian König87167bb2013-04-09 13:39:21 -04009517
Alex Deucher8a7cd272013-08-06 11:29:39 -04009518 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
9519 if (ret != 0)
9520 return;
Christian König87167bb2013-04-09 13:39:21 -04009521
Alex Deucher8a7cd272013-08-06 11:29:39 -04009522 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
9523 return;
Christian König87167bb2013-04-09 13:39:21 -04009524
Alex Deucher8a7cd272013-08-06 11:29:39 -04009525 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9526 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
9527 LC_CURRENT_DATA_RATE_SHIFT;
9528 if (mask & DRM_PCIE_SPEED_80) {
9529 if (current_data_rate == 2) {
9530 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
9531 return;
9532 }
9533 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
9534 } else if (mask & DRM_PCIE_SPEED_50) {
9535 if (current_data_rate == 1) {
9536 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
9537 return;
9538 }
9539 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
9540 }
Christian König87167bb2013-04-09 13:39:21 -04009541
Alex Deucher8a7cd272013-08-06 11:29:39 -04009542 bridge_pos = pci_pcie_cap(root);
9543 if (!bridge_pos)
9544 return;
9545
9546 gpu_pos = pci_pcie_cap(rdev->pdev);
9547 if (!gpu_pos)
9548 return;
9549
9550 if (mask & DRM_PCIE_SPEED_80) {
9551 /* re-try equalization if gen3 is not already enabled */
9552 if (current_data_rate != 2) {
9553 u16 bridge_cfg, gpu_cfg;
9554 u16 bridge_cfg2, gpu_cfg2;
9555 u32 max_lw, current_lw, tmp;
9556
9557 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9558 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9559
9560 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
9561 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9562
9563 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
9564 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9565
9566 tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9567 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
9568 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
9569
9570 if (current_lw < max_lw) {
9571 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9572 if (tmp & LC_RENEGOTIATION_SUPPORT) {
9573 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
9574 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
9575 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
9576 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
9577 }
9578 }
9579
9580 for (i = 0; i < 10; i++) {
9581 /* check status */
9582 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
9583 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
9584 break;
9585
9586 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9587 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9588
9589 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
9590 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
9591
9592 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9593 tmp |= LC_SET_QUIESCE;
9594 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9595
9596 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9597 tmp |= LC_REDO_EQ;
9598 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9599
9600 mdelay(100);
9601
9602 /* linkctl */
9603 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
9604 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9605 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
9606 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9607
9608 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
9609 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9610 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
9611 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9612
9613 /* linkctl2 */
9614 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
9615 tmp16 &= ~((1 << 4) | (7 << 9));
9616 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
9617 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
9618
9619 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9620 tmp16 &= ~((1 << 4) | (7 << 9));
9621 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
9622 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9623
9624 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9625 tmp &= ~LC_SET_QUIESCE;
9626 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9627 }
9628 }
9629 }
9630
9631 /* set the link speed */
9632 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
9633 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
9634 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9635
9636 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9637 tmp16 &= ~0xf;
9638 if (mask & DRM_PCIE_SPEED_80)
9639 tmp16 |= 3; /* gen3 */
9640 else if (mask & DRM_PCIE_SPEED_50)
9641 tmp16 |= 2; /* gen2 */
9642 else
9643 tmp16 |= 1; /* gen1 */
9644 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9645
9646 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9647 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
9648 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9649
9650 for (i = 0; i < rdev->usec_timeout; i++) {
9651 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9652 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
9653 break;
9654 udelay(1);
9655 }
9656}
Alex Deucher7235711a42013-04-04 13:58:09 -04009657
9658static void cik_program_aspm(struct radeon_device *rdev)
9659{
9660 u32 data, orig;
9661 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
9662 bool disable_clkreq = false;
9663
9664 if (radeon_aspm == 0)
9665 return;
9666
9667 /* XXX double check IGPs */
9668 if (rdev->flags & RADEON_IS_IGP)
9669 return;
9670
9671 if (!(rdev->flags & RADEON_IS_PCIE))
9672 return;
9673
9674 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9675 data &= ~LC_XMIT_N_FTS_MASK;
9676 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
9677 if (orig != data)
9678 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
9679
9680 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
9681 data |= LC_GO_TO_RECOVERY;
9682 if (orig != data)
9683 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
9684
9685 orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
9686 data |= P_IGNORE_EDB_ERR;
9687 if (orig != data)
9688 WREG32_PCIE_PORT(PCIE_P_CNTL, data);
9689
9690 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9691 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
9692 data |= LC_PMI_TO_L1_DIS;
9693 if (!disable_l0s)
9694 data |= LC_L0S_INACTIVITY(7);
9695
9696 if (!disable_l1) {
9697 data |= LC_L1_INACTIVITY(7);
9698 data &= ~LC_PMI_TO_L1_DIS;
9699 if (orig != data)
9700 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9701
9702 if (!disable_plloff_in_l1) {
9703 bool clk_req_support;
9704
9705 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
9706 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9707 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9708 if (orig != data)
9709 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
9710
9711 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
9712 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9713 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9714 if (orig != data)
9715 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
9716
9717 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
9718 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9719 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9720 if (orig != data)
9721 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
9722
9723 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
9724 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9725 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9726 if (orig != data)
9727 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
9728
9729 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9730 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
9731 data |= LC_DYN_LANES_PWR_STATE(3);
9732 if (orig != data)
9733 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
9734
Alex Williamson0bd252d2014-08-27 13:01:35 -06009735 if (!disable_clkreq &&
9736 !pci_is_root_bus(rdev->pdev->bus)) {
Alex Deucher7235711a42013-04-04 13:58:09 -04009737 struct pci_dev *root = rdev->pdev->bus->self;
9738 u32 lnkcap;
9739
9740 clk_req_support = false;
9741 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
9742 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
9743 clk_req_support = true;
9744 } else {
9745 clk_req_support = false;
9746 }
9747
9748 if (clk_req_support) {
9749 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
9750 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
9751 if (orig != data)
9752 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
9753
9754 orig = data = RREG32_SMC(THM_CLK_CNTL);
9755 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
9756 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
9757 if (orig != data)
9758 WREG32_SMC(THM_CLK_CNTL, data);
9759
9760 orig = data = RREG32_SMC(MISC_CLK_CTRL);
9761 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
9762 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
9763 if (orig != data)
9764 WREG32_SMC(MISC_CLK_CTRL, data);
9765
9766 orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
9767 data &= ~BCLK_AS_XCLK;
9768 if (orig != data)
9769 WREG32_SMC(CG_CLKPIN_CNTL, data);
9770
9771 orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
9772 data &= ~FORCE_BIF_REFCLK_EN;
9773 if (orig != data)
9774 WREG32_SMC(CG_CLKPIN_CNTL_2, data);
9775
9776 orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
9777 data &= ~MPLL_CLKOUT_SEL_MASK;
9778 data |= MPLL_CLKOUT_SEL(4);
9779 if (orig != data)
9780 WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
9781 }
9782 }
9783 } else {
9784 if (orig != data)
9785 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9786 }
9787
9788 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
9789 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
9790 if (orig != data)
9791 WREG32_PCIE_PORT(PCIE_CNTL2, data);
9792
9793 if (!disable_l0s) {
9794 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9795 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
9796 data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9797 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
9798 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9799 data &= ~LC_L0S_INACTIVITY_MASK;
9800 if (orig != data)
9801 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9802 }
9803 }
9804 }
Christian König87167bb2013-04-09 13:39:21 -04009805}