blob: f1e049b1ab0005bc0126c80891b54ce5437396dc [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 Deucherbc8273f2012-06-29 19:44:04 -04001809 u32 running, blackout = 0;
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 }
1869 /* load the MC ucode */
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001870 for (i = 0; i < ucode_size; i++) {
1871 if (rdev->new_fw)
1872 WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
1873 else
1874 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1875 }
Alex Deucherbc8273f2012-06-29 19:44:04 -04001876
1877 /* put the engine back into the active state */
1878 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1879 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1880 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1881
1882 /* wait for training to complete */
1883 for (i = 0; i < rdev->usec_timeout; i++) {
1884 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1885 break;
1886 udelay(1);
1887 }
1888 for (i = 0; i < rdev->usec_timeout; i++) {
1889 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1890 break;
1891 udelay(1);
1892 }
1893
1894 if (running)
1895 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1896 }
1897
1898 return 0;
1899}
1900
Alex Deucher02c81322012-12-18 21:43:07 -05001901/**
1902 * cik_init_microcode - load ucode images from disk
1903 *
1904 * @rdev: radeon_device pointer
1905 *
1906 * Use the firmware interface to load the ucode images into
1907 * the driver (not loaded into hw).
1908 * Returns 0 on success, error on failure.
1909 */
1910static int cik_init_microcode(struct radeon_device *rdev)
1911{
Alex Deucher02c81322012-12-18 21:43:07 -05001912 const char *chip_name;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001913 const char *new_chip_name;
Alex Deucher02c81322012-12-18 21:43:07 -05001914 size_t pfp_req_size, me_req_size, ce_req_size,
Alex Deucherd4775652013-08-08 16:06:35 -04001915 mec_req_size, rlc_req_size, mc_req_size = 0,
Alex Deucher277babc2014-04-11 11:21:50 -04001916 sdma_req_size, smc_req_size = 0, mc2_req_size = 0;
Alex Deucher02c81322012-12-18 21:43:07 -05001917 char fw_name[30];
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001918 int new_fw = 0;
Alex Deucher02c81322012-12-18 21:43:07 -05001919 int err;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001920 int num_fw;
Alex Deucher02c81322012-12-18 21:43:07 -05001921
1922 DRM_DEBUG("\n");
1923
Alex Deucher02c81322012-12-18 21:43:07 -05001924 switch (rdev->family) {
1925 case CHIP_BONAIRE:
1926 chip_name = "BONAIRE";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001927 new_chip_name = "bonaire";
Alex Deucher02c81322012-12-18 21:43:07 -05001928 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1929 me_req_size = CIK_ME_UCODE_SIZE * 4;
1930 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1931 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1932 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
Alex Deucher277babc2014-04-11 11:21:50 -04001933 mc_req_size = BONAIRE_MC_UCODE_SIZE * 4;
1934 mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001935 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001936 smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001937 num_fw = 8;
Alex Deucher02c81322012-12-18 21:43:07 -05001938 break;
Alex Deucherd4775652013-08-08 16:06:35 -04001939 case CHIP_HAWAII:
1940 chip_name = "HAWAII";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001941 new_chip_name = "hawaii";
Alex Deucherd4775652013-08-08 16:06:35 -04001942 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1943 me_req_size = CIK_ME_UCODE_SIZE * 4;
1944 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1945 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1946 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
1947 mc_req_size = HAWAII_MC_UCODE_SIZE * 4;
Alex Deucher277babc2014-04-11 11:21:50 -04001948 mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4;
Alex Deucherd4775652013-08-08 16:06:35 -04001949 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1950 smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001951 num_fw = 8;
Alex Deucherd4775652013-08-08 16:06:35 -04001952 break;
Alex Deucher02c81322012-12-18 21:43:07 -05001953 case CHIP_KAVERI:
1954 chip_name = "KAVERI";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001955 new_chip_name = "kaveri";
Alex Deucher02c81322012-12-18 21:43:07 -05001956 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1957 me_req_size = CIK_ME_UCODE_SIZE * 4;
1958 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1959 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1960 rlc_req_size = KV_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001961 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001962 num_fw = 7;
Alex Deucher02c81322012-12-18 21:43:07 -05001963 break;
1964 case CHIP_KABINI:
1965 chip_name = "KABINI";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001966 new_chip_name = "kabini";
Alex Deucher02c81322012-12-18 21:43:07 -05001967 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1968 me_req_size = CIK_ME_UCODE_SIZE * 4;
1969 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1970 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1971 rlc_req_size = KB_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001972 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001973 num_fw = 6;
Alex Deucher02c81322012-12-18 21:43:07 -05001974 break;
Samuel Lif73a9e82014-04-30 18:40:49 -04001975 case CHIP_MULLINS:
1976 chip_name = "MULLINS";
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001977 new_chip_name = "mullins";
Samuel Lif73a9e82014-04-30 18:40:49 -04001978 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1979 me_req_size = CIK_ME_UCODE_SIZE * 4;
1980 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1981 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1982 rlc_req_size = ML_RLC_UCODE_SIZE * 4;
1983 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001984 num_fw = 6;
Samuel Lif73a9e82014-04-30 18:40:49 -04001985 break;
Alex Deucher02c81322012-12-18 21:43:07 -05001986 default: BUG();
1987 }
1988
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001989 DRM_INFO("Loading %s Microcode\n", new_chip_name);
Alex Deucher02c81322012-12-18 21:43:07 -05001990
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001991 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001992 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04001993 if (err) {
1994 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
1995 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1996 if (err)
1997 goto out;
1998 if (rdev->pfp_fw->size != pfp_req_size) {
1999 printk(KERN_ERR
2000 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2001 rdev->pfp_fw->size, fw_name);
2002 err = -EINVAL;
2003 goto out;
2004 }
2005 } else {
2006 err = radeon_ucode_validate(rdev->pfp_fw);
2007 if (err) {
2008 printk(KERN_ERR
2009 "cik_fw: validation failed for firmware \"%s\"\n",
2010 fw_name);
2011 goto out;
2012 } else {
2013 new_fw++;
2014 }
Alex Deucher02c81322012-12-18 21:43:07 -05002015 }
2016
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002017 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002018 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002019 if (err) {
2020 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
2021 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
2022 if (err)
2023 goto out;
2024 if (rdev->me_fw->size != me_req_size) {
2025 printk(KERN_ERR
2026 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2027 rdev->me_fw->size, fw_name);
2028 err = -EINVAL;
2029 }
2030 } else {
2031 err = radeon_ucode_validate(rdev->me_fw);
2032 if (err) {
2033 printk(KERN_ERR
2034 "cik_fw: validation failed for firmware \"%s\"\n",
2035 fw_name);
2036 goto out;
2037 } else {
2038 new_fw++;
2039 }
Alex Deucher02c81322012-12-18 21:43:07 -05002040 }
2041
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002042 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002043 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002044 if (err) {
2045 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
2046 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
2047 if (err)
2048 goto out;
2049 if (rdev->ce_fw->size != ce_req_size) {
2050 printk(KERN_ERR
2051 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2052 rdev->ce_fw->size, fw_name);
2053 err = -EINVAL;
2054 }
2055 } else {
2056 err = radeon_ucode_validate(rdev->ce_fw);
2057 if (err) {
2058 printk(KERN_ERR
2059 "cik_fw: validation failed for firmware \"%s\"\n",
2060 fw_name);
2061 goto out;
2062 } else {
2063 new_fw++;
2064 }
Alex Deucher02c81322012-12-18 21:43:07 -05002065 }
2066
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002067 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002068 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002069 if (err) {
2070 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
2071 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
2072 if (err)
2073 goto out;
2074 if (rdev->mec_fw->size != mec_req_size) {
2075 printk(KERN_ERR
2076 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2077 rdev->mec_fw->size, fw_name);
2078 err = -EINVAL;
2079 }
2080 } else {
2081 err = radeon_ucode_validate(rdev->mec_fw);
2082 if (err) {
2083 printk(KERN_ERR
2084 "cik_fw: validation failed for firmware \"%s\"\n",
2085 fw_name);
2086 goto out;
2087 } else {
2088 new_fw++;
2089 }
Alex Deucher02c81322012-12-18 21:43:07 -05002090 }
2091
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002092 if (rdev->family == CHIP_KAVERI) {
2093 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", new_chip_name);
2094 err = request_firmware(&rdev->mec2_fw, fw_name, rdev->dev);
2095 if (err) {
2096 goto out;
2097 } else {
2098 err = radeon_ucode_validate(rdev->mec2_fw);
2099 if (err) {
2100 goto out;
2101 } else {
2102 new_fw++;
2103 }
2104 }
2105 }
2106
2107 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002108 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002109 if (err) {
2110 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
2111 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
2112 if (err)
2113 goto out;
2114 if (rdev->rlc_fw->size != rlc_req_size) {
2115 printk(KERN_ERR
2116 "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
2117 rdev->rlc_fw->size, fw_name);
2118 err = -EINVAL;
2119 }
2120 } else {
2121 err = radeon_ucode_validate(rdev->rlc_fw);
2122 if (err) {
2123 printk(KERN_ERR
2124 "cik_fw: validation failed for firmware \"%s\"\n",
2125 fw_name);
2126 goto out;
2127 } else {
2128 new_fw++;
2129 }
Alex Deucher02c81322012-12-18 21:43:07 -05002130 }
2131
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002132 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002133 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002134 if (err) {
2135 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
2136 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
2137 if (err)
2138 goto out;
2139 if (rdev->sdma_fw->size != sdma_req_size) {
2140 printk(KERN_ERR
2141 "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
2142 rdev->sdma_fw->size, fw_name);
2143 err = -EINVAL;
2144 }
2145 } else {
2146 err = radeon_ucode_validate(rdev->sdma_fw);
2147 if (err) {
2148 printk(KERN_ERR
2149 "cik_fw: validation failed for firmware \"%s\"\n",
2150 fw_name);
2151 goto out;
2152 } else {
2153 new_fw++;
2154 }
Alex Deucher21a93e12013-04-09 12:47:11 -04002155 }
2156
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002157 /* No SMC, MC ucode on APUs */
Alex Deucher02c81322012-12-18 21:43:07 -05002158 if (!(rdev->flags & RADEON_IS_IGP)) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002159 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04002160 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
Alex Deucher277babc2014-04-11 11:21:50 -04002161 if (err) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002162 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
Alex Deucher277babc2014-04-11 11:21:50 -04002163 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002164 if (err) {
2165 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
2166 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
2167 if (err)
2168 goto out;
2169 }
2170 if ((rdev->mc_fw->size != mc_req_size) &&
2171 (rdev->mc_fw->size != mc2_req_size)){
2172 printk(KERN_ERR
2173 "cik_mc: Bogus length %zu in firmware \"%s\"\n",
2174 rdev->mc_fw->size, fw_name);
2175 err = -EINVAL;
2176 }
2177 DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
2178 } else {
2179 err = radeon_ucode_validate(rdev->mc_fw);
2180 if (err) {
2181 printk(KERN_ERR
2182 "cik_fw: validation failed for firmware \"%s\"\n",
2183 fw_name);
Alex Deucher277babc2014-04-11 11:21:50 -04002184 goto out;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002185 } else {
2186 new_fw++;
2187 }
Alex Deucher277babc2014-04-11 11:21:50 -04002188 }
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002189
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002190 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002191 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2192 if (err) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002193 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
2194 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2195 if (err) {
2196 printk(KERN_ERR
2197 "smc: error loading firmware \"%s\"\n",
2198 fw_name);
2199 release_firmware(rdev->smc_fw);
2200 rdev->smc_fw = NULL;
2201 err = 0;
2202 } else if (rdev->smc_fw->size != smc_req_size) {
2203 printk(KERN_ERR
2204 "cik_smc: Bogus length %zu in firmware \"%s\"\n",
2205 rdev->smc_fw->size, fw_name);
2206 err = -EINVAL;
2207 }
2208 } else {
2209 err = radeon_ucode_validate(rdev->smc_fw);
2210 if (err) {
2211 printk(KERN_ERR
2212 "cik_fw: validation failed for firmware \"%s\"\n",
2213 fw_name);
2214 goto out;
2215 } else {
2216 new_fw++;
2217 }
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002218 }
Alex Deucher02c81322012-12-18 21:43:07 -05002219 }
2220
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002221 if (new_fw == 0) {
2222 rdev->new_fw = false;
2223 } else if (new_fw < num_fw) {
2224 printk(KERN_ERR "ci_fw: mixing new and old firmware!\n");
2225 err = -EINVAL;
2226 } else {
2227 rdev->new_fw = true;
2228 }
2229
Alex Deucher02c81322012-12-18 21:43:07 -05002230out:
Alex Deucher02c81322012-12-18 21:43:07 -05002231 if (err) {
2232 if (err != -EINVAL)
2233 printk(KERN_ERR
2234 "cik_cp: Failed to load firmware \"%s\"\n",
2235 fw_name);
2236 release_firmware(rdev->pfp_fw);
2237 rdev->pfp_fw = NULL;
2238 release_firmware(rdev->me_fw);
2239 rdev->me_fw = NULL;
2240 release_firmware(rdev->ce_fw);
2241 rdev->ce_fw = NULL;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002242 release_firmware(rdev->mec_fw);
2243 rdev->mec_fw = NULL;
2244 release_firmware(rdev->mec2_fw);
2245 rdev->mec2_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002246 release_firmware(rdev->rlc_fw);
2247 rdev->rlc_fw = NULL;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04002248 release_firmware(rdev->sdma_fw);
2249 rdev->sdma_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002250 release_firmware(rdev->mc_fw);
2251 rdev->mc_fw = NULL;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04002252 release_firmware(rdev->smc_fw);
2253 rdev->smc_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05002254 }
2255 return err;
2256}
2257
Alex Deucher8cc1a532013-04-09 12:41:24 -04002258/*
2259 * Core functions
2260 */
2261/**
2262 * cik_tiling_mode_table_init - init the hw tiling table
2263 *
2264 * @rdev: radeon_device pointer
2265 *
2266 * Starting with SI, the tiling setup is done globally in a
2267 * set of 32 tiling modes. Rather than selecting each set of
2268 * parameters per surface as on older asics, we just select
2269 * which index in the tiling table we want to use, and the
2270 * surface uses those parameters (CIK).
2271 */
2272static void cik_tiling_mode_table_init(struct radeon_device *rdev)
2273{
2274 const u32 num_tile_mode_states = 32;
2275 const u32 num_secondary_tile_mode_states = 16;
2276 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
2277 u32 num_pipe_configs;
2278 u32 num_rbs = rdev->config.cik.max_backends_per_se *
2279 rdev->config.cik.max_shader_engines;
2280
2281 switch (rdev->config.cik.mem_row_size_in_kb) {
2282 case 1:
2283 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
2284 break;
2285 case 2:
2286 default:
2287 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
2288 break;
2289 case 4:
2290 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
2291 break;
2292 }
2293
2294 num_pipe_configs = rdev->config.cik.max_tile_pipes;
2295 if (num_pipe_configs > 8)
Alex Deucher21e438a2013-08-06 16:58:53 -04002296 num_pipe_configs = 16;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002297
Alex Deucher21e438a2013-08-06 16:58:53 -04002298 if (num_pipe_configs == 16) {
2299 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2300 switch (reg_offset) {
2301 case 0:
2302 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2303 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2304 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2305 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2306 break;
2307 case 1:
2308 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2309 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2310 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2311 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2312 break;
2313 case 2:
2314 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2315 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2316 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2317 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2318 break;
2319 case 3:
2320 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2321 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2322 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2323 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2324 break;
2325 case 4:
2326 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2327 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2328 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2329 TILE_SPLIT(split_equal_to_row_size));
2330 break;
2331 case 5:
2332 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002333 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002334 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2335 break;
2336 case 6:
2337 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2338 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2339 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2340 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2341 break;
2342 case 7:
2343 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2344 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2345 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2346 TILE_SPLIT(split_equal_to_row_size));
2347 break;
2348 case 8:
2349 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2350 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
2351 break;
2352 case 9:
2353 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002354 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002355 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2356 break;
2357 case 10:
2358 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2359 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2360 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2361 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2362 break;
2363 case 11:
2364 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2365 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2366 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2367 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2368 break;
2369 case 12:
2370 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2371 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2372 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2373 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2374 break;
2375 case 13:
2376 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002377 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002378 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2379 break;
2380 case 14:
2381 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2382 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2383 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2384 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2385 break;
2386 case 16:
2387 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2388 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2389 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2390 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2391 break;
2392 case 17:
2393 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2394 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2395 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2396 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2397 break;
2398 case 27:
2399 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002400 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
Alex Deucher21e438a2013-08-06 16:58:53 -04002401 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2402 break;
2403 case 28:
2404 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2405 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2406 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2407 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2408 break;
2409 case 29:
2410 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2411 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2412 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2413 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2414 break;
2415 case 30:
2416 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2417 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2418 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2419 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2420 break;
2421 default:
2422 gb_tile_moden = 0;
2423 break;
2424 }
2425 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
2426 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2427 }
2428 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2429 switch (reg_offset) {
2430 case 0:
2431 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2432 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2433 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2434 NUM_BANKS(ADDR_SURF_16_BANK));
2435 break;
2436 case 1:
2437 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2438 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2439 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2440 NUM_BANKS(ADDR_SURF_16_BANK));
2441 break;
2442 case 2:
2443 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2444 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2445 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2446 NUM_BANKS(ADDR_SURF_16_BANK));
2447 break;
2448 case 3:
2449 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2450 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2451 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2452 NUM_BANKS(ADDR_SURF_16_BANK));
2453 break;
2454 case 4:
2455 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2456 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2457 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2458 NUM_BANKS(ADDR_SURF_8_BANK));
2459 break;
2460 case 5:
2461 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2462 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2463 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2464 NUM_BANKS(ADDR_SURF_4_BANK));
2465 break;
2466 case 6:
2467 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2468 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2469 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2470 NUM_BANKS(ADDR_SURF_2_BANK));
2471 break;
2472 case 8:
2473 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2474 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2475 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2476 NUM_BANKS(ADDR_SURF_16_BANK));
2477 break;
2478 case 9:
2479 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2480 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2481 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2482 NUM_BANKS(ADDR_SURF_16_BANK));
2483 break;
2484 case 10:
2485 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2486 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2487 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2488 NUM_BANKS(ADDR_SURF_16_BANK));
2489 break;
2490 case 11:
2491 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2492 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2493 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2494 NUM_BANKS(ADDR_SURF_8_BANK));
2495 break;
2496 case 12:
2497 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2498 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2499 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2500 NUM_BANKS(ADDR_SURF_4_BANK));
2501 break;
2502 case 13:
2503 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2504 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2505 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2506 NUM_BANKS(ADDR_SURF_2_BANK));
2507 break;
2508 case 14:
2509 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2510 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2511 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2512 NUM_BANKS(ADDR_SURF_2_BANK));
2513 break;
2514 default:
2515 gb_tile_moden = 0;
2516 break;
2517 }
Jerome Glisse1b2c4862014-07-24 16:34:17 -04002518 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher21e438a2013-08-06 16:58:53 -04002519 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2520 }
2521 } else if (num_pipe_configs == 8) {
Alex Deucher8cc1a532013-04-09 12:41:24 -04002522 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2523 switch (reg_offset) {
2524 case 0:
2525 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2526 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2527 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2528 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2529 break;
2530 case 1:
2531 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2532 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2533 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2534 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2535 break;
2536 case 2:
2537 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2538 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2539 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2540 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2541 break;
2542 case 3:
2543 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2544 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2545 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2546 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2547 break;
2548 case 4:
2549 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2550 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2551 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2552 TILE_SPLIT(split_equal_to_row_size));
2553 break;
2554 case 5:
2555 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002556 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002557 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2558 break;
2559 case 6:
2560 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2561 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2562 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2563 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2564 break;
2565 case 7:
2566 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2567 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2568 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2569 TILE_SPLIT(split_equal_to_row_size));
2570 break;
2571 case 8:
2572 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2573 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
2574 break;
2575 case 9:
2576 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002577 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002578 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2579 break;
2580 case 10:
2581 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2582 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2583 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2584 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2585 break;
2586 case 11:
2587 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2588 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2589 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2590 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2591 break;
2592 case 12:
2593 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2594 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2595 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2596 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2597 break;
2598 case 13:
2599 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002600 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002601 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2602 break;
2603 case 14:
2604 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2605 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2606 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2607 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2608 break;
2609 case 16:
2610 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2611 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2612 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2613 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2614 break;
2615 case 17:
2616 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2617 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2618 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2619 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2620 break;
2621 case 27:
2622 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002623 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002624 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2625 break;
2626 case 28:
2627 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2628 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2629 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2630 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2631 break;
2632 case 29:
2633 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2634 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2635 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2636 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2637 break;
2638 case 30:
2639 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2640 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2641 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2642 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2643 break;
2644 default:
2645 gb_tile_moden = 0;
2646 break;
2647 }
Alex Deucher39aee492013-04-10 13:41:25 -04002648 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002649 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2650 }
2651 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2652 switch (reg_offset) {
2653 case 0:
2654 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2655 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2656 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2657 NUM_BANKS(ADDR_SURF_16_BANK));
2658 break;
2659 case 1:
2660 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2661 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2662 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2663 NUM_BANKS(ADDR_SURF_16_BANK));
2664 break;
2665 case 2:
2666 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2667 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2668 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2669 NUM_BANKS(ADDR_SURF_16_BANK));
2670 break;
2671 case 3:
2672 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2673 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2674 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2675 NUM_BANKS(ADDR_SURF_16_BANK));
2676 break;
2677 case 4:
2678 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2679 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2680 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2681 NUM_BANKS(ADDR_SURF_8_BANK));
2682 break;
2683 case 5:
2684 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2685 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2686 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2687 NUM_BANKS(ADDR_SURF_4_BANK));
2688 break;
2689 case 6:
2690 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2691 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2692 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2693 NUM_BANKS(ADDR_SURF_2_BANK));
2694 break;
2695 case 8:
2696 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2697 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2698 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2699 NUM_BANKS(ADDR_SURF_16_BANK));
2700 break;
2701 case 9:
2702 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2703 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2704 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2705 NUM_BANKS(ADDR_SURF_16_BANK));
2706 break;
2707 case 10:
2708 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2709 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2710 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2711 NUM_BANKS(ADDR_SURF_16_BANK));
2712 break;
2713 case 11:
2714 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2715 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2716 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2717 NUM_BANKS(ADDR_SURF_16_BANK));
2718 break;
2719 case 12:
2720 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2721 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2722 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2723 NUM_BANKS(ADDR_SURF_8_BANK));
2724 break;
2725 case 13:
2726 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2727 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2728 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2729 NUM_BANKS(ADDR_SURF_4_BANK));
2730 break;
2731 case 14:
2732 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2733 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2734 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2735 NUM_BANKS(ADDR_SURF_2_BANK));
2736 break;
2737 default:
2738 gb_tile_moden = 0;
2739 break;
2740 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09002741 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002742 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2743 }
2744 } else if (num_pipe_configs == 4) {
2745 if (num_rbs == 4) {
2746 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2747 switch (reg_offset) {
2748 case 0:
2749 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2750 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2751 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2752 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2753 break;
2754 case 1:
2755 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2756 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2757 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2758 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2759 break;
2760 case 2:
2761 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2762 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2763 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2764 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2765 break;
2766 case 3:
2767 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2768 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2769 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2770 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2771 break;
2772 case 4:
2773 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2774 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2775 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2776 TILE_SPLIT(split_equal_to_row_size));
2777 break;
2778 case 5:
2779 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002780 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002781 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2782 break;
2783 case 6:
2784 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2785 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2786 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2787 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2788 break;
2789 case 7:
2790 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2791 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2792 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2793 TILE_SPLIT(split_equal_to_row_size));
2794 break;
2795 case 8:
2796 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2797 PIPE_CONFIG(ADDR_SURF_P4_16x16));
2798 break;
2799 case 9:
2800 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002801 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002802 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2803 break;
2804 case 10:
2805 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2806 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2807 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2808 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2809 break;
2810 case 11:
2811 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2812 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2813 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2814 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2815 break;
2816 case 12:
2817 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2818 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2819 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2820 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2821 break;
2822 case 13:
2823 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002824 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002825 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2826 break;
2827 case 14:
2828 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2829 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2830 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2831 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2832 break;
2833 case 16:
2834 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2835 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2836 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2837 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2838 break;
2839 case 17:
2840 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2841 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2842 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2843 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2844 break;
2845 case 27:
2846 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002847 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002848 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2849 break;
2850 case 28:
2851 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2852 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2853 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2854 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2855 break;
2856 case 29:
2857 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2858 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2859 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2860 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2861 break;
2862 case 30:
2863 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2864 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2865 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2866 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2867 break;
2868 default:
2869 gb_tile_moden = 0;
2870 break;
2871 }
Alex Deucher39aee492013-04-10 13:41:25 -04002872 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002873 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2874 }
2875 } else if (num_rbs < 4) {
2876 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2877 switch (reg_offset) {
2878 case 0:
2879 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2880 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2881 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2882 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2883 break;
2884 case 1:
2885 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2886 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2887 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2888 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2889 break;
2890 case 2:
2891 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2892 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2893 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2894 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2895 break;
2896 case 3:
2897 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2898 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2899 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2900 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2901 break;
2902 case 4:
2903 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2904 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2905 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2906 TILE_SPLIT(split_equal_to_row_size));
2907 break;
2908 case 5:
2909 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002910 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002911 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2912 break;
2913 case 6:
2914 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2915 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2916 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2917 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2918 break;
2919 case 7:
2920 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2921 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2922 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2923 TILE_SPLIT(split_equal_to_row_size));
2924 break;
2925 case 8:
2926 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2927 PIPE_CONFIG(ADDR_SURF_P4_8x16));
2928 break;
2929 case 9:
2930 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002931 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002932 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2933 break;
2934 case 10:
2935 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2936 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2937 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2938 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2939 break;
2940 case 11:
2941 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2942 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2943 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2944 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2945 break;
2946 case 12:
2947 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2948 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2949 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2950 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2951 break;
2952 case 13:
2953 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002954 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002955 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2956 break;
2957 case 14:
2958 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2959 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2960 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2961 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2962 break;
2963 case 16:
2964 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2965 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2966 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2967 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2968 break;
2969 case 17:
2970 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2971 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2972 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2973 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2974 break;
2975 case 27:
2976 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01002977 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04002978 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2979 break;
2980 case 28:
2981 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2982 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2983 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2984 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2985 break;
2986 case 29:
2987 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2988 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2989 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2990 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2991 break;
2992 case 30:
2993 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2994 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2995 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2996 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2997 break;
2998 default:
2999 gb_tile_moden = 0;
3000 break;
3001 }
Alex Deucher39aee492013-04-10 13:41:25 -04003002 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003003 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3004 }
3005 }
3006 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3007 switch (reg_offset) {
3008 case 0:
3009 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3010 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3011 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3012 NUM_BANKS(ADDR_SURF_16_BANK));
3013 break;
3014 case 1:
3015 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3016 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3017 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3018 NUM_BANKS(ADDR_SURF_16_BANK));
3019 break;
3020 case 2:
3021 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3022 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3023 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3024 NUM_BANKS(ADDR_SURF_16_BANK));
3025 break;
3026 case 3:
3027 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3028 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3029 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3030 NUM_BANKS(ADDR_SURF_16_BANK));
3031 break;
3032 case 4:
3033 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3034 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3035 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3036 NUM_BANKS(ADDR_SURF_16_BANK));
3037 break;
3038 case 5:
3039 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3040 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3041 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3042 NUM_BANKS(ADDR_SURF_8_BANK));
3043 break;
3044 case 6:
3045 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3046 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3047 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3048 NUM_BANKS(ADDR_SURF_4_BANK));
3049 break;
3050 case 8:
3051 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3052 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3053 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3054 NUM_BANKS(ADDR_SURF_16_BANK));
3055 break;
3056 case 9:
3057 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3058 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3059 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3060 NUM_BANKS(ADDR_SURF_16_BANK));
3061 break;
3062 case 10:
3063 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3064 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3065 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3066 NUM_BANKS(ADDR_SURF_16_BANK));
3067 break;
3068 case 11:
3069 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3070 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3071 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3072 NUM_BANKS(ADDR_SURF_16_BANK));
3073 break;
3074 case 12:
3075 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3076 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3077 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3078 NUM_BANKS(ADDR_SURF_16_BANK));
3079 break;
3080 case 13:
3081 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3082 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3083 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3084 NUM_BANKS(ADDR_SURF_8_BANK));
3085 break;
3086 case 14:
3087 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3088 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3089 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3090 NUM_BANKS(ADDR_SURF_4_BANK));
3091 break;
3092 default:
3093 gb_tile_moden = 0;
3094 break;
3095 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09003096 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003097 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3098 }
3099 } else if (num_pipe_configs == 2) {
3100 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
3101 switch (reg_offset) {
3102 case 0:
3103 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3104 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3105 PIPE_CONFIG(ADDR_SURF_P2) |
3106 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
3107 break;
3108 case 1:
3109 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3110 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3111 PIPE_CONFIG(ADDR_SURF_P2) |
3112 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
3113 break;
3114 case 2:
3115 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3116 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3117 PIPE_CONFIG(ADDR_SURF_P2) |
3118 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3119 break;
3120 case 3:
3121 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3122 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3123 PIPE_CONFIG(ADDR_SURF_P2) |
3124 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
3125 break;
3126 case 4:
3127 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3128 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3129 PIPE_CONFIG(ADDR_SURF_P2) |
3130 TILE_SPLIT(split_equal_to_row_size));
3131 break;
3132 case 5:
3133 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003134 PIPE_CONFIG(ADDR_SURF_P2) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04003135 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3136 break;
3137 case 6:
3138 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3139 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3140 PIPE_CONFIG(ADDR_SURF_P2) |
3141 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3142 break;
3143 case 7:
3144 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3145 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3146 PIPE_CONFIG(ADDR_SURF_P2) |
3147 TILE_SPLIT(split_equal_to_row_size));
3148 break;
3149 case 8:
Marek Olšák020ff542014-03-22 16:20:43 +01003150 gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3151 PIPE_CONFIG(ADDR_SURF_P2);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003152 break;
3153 case 9:
3154 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003155 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3156 PIPE_CONFIG(ADDR_SURF_P2));
Alex Deucher8cc1a532013-04-09 12:41:24 -04003157 break;
3158 case 10:
3159 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3160 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3161 PIPE_CONFIG(ADDR_SURF_P2) |
3162 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3163 break;
3164 case 11:
3165 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3166 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3167 PIPE_CONFIG(ADDR_SURF_P2) |
3168 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3169 break;
3170 case 12:
3171 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3172 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3173 PIPE_CONFIG(ADDR_SURF_P2) |
3174 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3175 break;
3176 case 13:
3177 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003178 PIPE_CONFIG(ADDR_SURF_P2) |
Alex Deucher8cc1a532013-04-09 12:41:24 -04003179 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
3180 break;
3181 case 14:
3182 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3183 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3184 PIPE_CONFIG(ADDR_SURF_P2) |
3185 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3186 break;
3187 case 16:
3188 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3189 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3190 PIPE_CONFIG(ADDR_SURF_P2) |
3191 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3192 break;
3193 case 17:
3194 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3195 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3196 PIPE_CONFIG(ADDR_SURF_P2) |
3197 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3198 break;
3199 case 27:
3200 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
Marek Olšák020ff542014-03-22 16:20:43 +01003201 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3202 PIPE_CONFIG(ADDR_SURF_P2));
Alex Deucher8cc1a532013-04-09 12:41:24 -04003203 break;
3204 case 28:
3205 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3206 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3207 PIPE_CONFIG(ADDR_SURF_P2) |
3208 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3209 break;
3210 case 29:
3211 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3212 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3213 PIPE_CONFIG(ADDR_SURF_P2) |
3214 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3215 break;
3216 case 30:
3217 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3218 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3219 PIPE_CONFIG(ADDR_SURF_P2) |
3220 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3221 break;
3222 default:
3223 gb_tile_moden = 0;
3224 break;
3225 }
Alex Deucher39aee492013-04-10 13:41:25 -04003226 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003227 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3228 }
3229 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3230 switch (reg_offset) {
3231 case 0:
3232 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3233 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3234 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3235 NUM_BANKS(ADDR_SURF_16_BANK));
3236 break;
3237 case 1:
3238 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3239 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3240 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3241 NUM_BANKS(ADDR_SURF_16_BANK));
3242 break;
3243 case 2:
3244 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3245 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3246 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3247 NUM_BANKS(ADDR_SURF_16_BANK));
3248 break;
3249 case 3:
3250 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3251 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3252 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3253 NUM_BANKS(ADDR_SURF_16_BANK));
3254 break;
3255 case 4:
3256 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3257 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3258 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3259 NUM_BANKS(ADDR_SURF_16_BANK));
3260 break;
3261 case 5:
3262 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3263 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3264 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3265 NUM_BANKS(ADDR_SURF_16_BANK));
3266 break;
3267 case 6:
3268 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3269 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3270 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3271 NUM_BANKS(ADDR_SURF_8_BANK));
3272 break;
3273 case 8:
3274 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3275 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3276 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3277 NUM_BANKS(ADDR_SURF_16_BANK));
3278 break;
3279 case 9:
3280 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3281 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3282 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3283 NUM_BANKS(ADDR_SURF_16_BANK));
3284 break;
3285 case 10:
3286 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3287 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3288 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3289 NUM_BANKS(ADDR_SURF_16_BANK));
3290 break;
3291 case 11:
3292 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3293 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3294 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3295 NUM_BANKS(ADDR_SURF_16_BANK));
3296 break;
3297 case 12:
3298 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3299 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3300 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3301 NUM_BANKS(ADDR_SURF_16_BANK));
3302 break;
3303 case 13:
3304 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3305 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3306 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3307 NUM_BANKS(ADDR_SURF_16_BANK));
3308 break;
3309 case 14:
3310 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3311 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3312 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3313 NUM_BANKS(ADDR_SURF_8_BANK));
3314 break;
3315 default:
3316 gb_tile_moden = 0;
3317 break;
3318 }
Michel Dänzer32f79a82013-11-18 18:26:00 +09003319 rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003320 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3321 }
3322 } else
3323 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
3324}
3325
3326/**
3327 * cik_select_se_sh - select which SE, SH to address
3328 *
3329 * @rdev: radeon_device pointer
3330 * @se_num: shader engine to address
3331 * @sh_num: sh block to address
3332 *
3333 * Select which SE, SH combinations to address. Certain
3334 * registers are instanced per SE or SH. 0xffffffff means
3335 * broadcast to all SEs or SHs (CIK).
3336 */
3337static void cik_select_se_sh(struct radeon_device *rdev,
3338 u32 se_num, u32 sh_num)
3339{
3340 u32 data = INSTANCE_BROADCAST_WRITES;
3341
3342 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
Alex Deucherb0fe3d32013-04-18 16:25:47 -04003343 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003344 else if (se_num == 0xffffffff)
3345 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
3346 else if (sh_num == 0xffffffff)
3347 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
3348 else
3349 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
3350 WREG32(GRBM_GFX_INDEX, data);
3351}
3352
3353/**
3354 * cik_create_bitmask - create a bitmask
3355 *
3356 * @bit_width: length of the mask
3357 *
3358 * create a variable length bit mask (CIK).
3359 * Returns the bitmask.
3360 */
3361static u32 cik_create_bitmask(u32 bit_width)
3362{
3363 u32 i, mask = 0;
3364
3365 for (i = 0; i < bit_width; i++) {
3366 mask <<= 1;
3367 mask |= 1;
3368 }
3369 return mask;
3370}
3371
3372/**
Alex Deucher972c5dd2014-03-04 15:50:29 -05003373 * cik_get_rb_disabled - computes the mask of disabled RBs
Alex Deucher8cc1a532013-04-09 12:41:24 -04003374 *
3375 * @rdev: radeon_device pointer
3376 * @max_rb_num: max RBs (render backends) for the asic
3377 * @se_num: number of SEs (shader engines) for the asic
3378 * @sh_per_se: number of SH blocks per SE for the asic
3379 *
3380 * Calculates the bitmask of disabled RBs (CIK).
3381 * Returns the disabled RB bitmask.
3382 */
3383static u32 cik_get_rb_disabled(struct radeon_device *rdev,
Marek Olšák9fadb352013-12-22 02:18:00 +01003384 u32 max_rb_num_per_se,
Alex Deucher8cc1a532013-04-09 12:41:24 -04003385 u32 sh_per_se)
3386{
3387 u32 data, mask;
3388
3389 data = RREG32(CC_RB_BACKEND_DISABLE);
3390 if (data & 1)
3391 data &= BACKEND_DISABLE_MASK;
3392 else
3393 data = 0;
3394 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
3395
3396 data >>= BACKEND_DISABLE_SHIFT;
3397
Marek Olšák9fadb352013-12-22 02:18:00 +01003398 mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003399
3400 return data & mask;
3401}
3402
3403/**
3404 * cik_setup_rb - setup the RBs on the asic
3405 *
3406 * @rdev: radeon_device pointer
3407 * @se_num: number of SEs (shader engines) for the asic
3408 * @sh_per_se: number of SH blocks per SE for the asic
3409 * @max_rb_num: max RBs (render backends) for the asic
3410 *
3411 * Configures per-SE/SH RB registers (CIK).
3412 */
3413static void cik_setup_rb(struct radeon_device *rdev,
3414 u32 se_num, u32 sh_per_se,
Marek Olšák9fadb352013-12-22 02:18:00 +01003415 u32 max_rb_num_per_se)
Alex Deucher8cc1a532013-04-09 12:41:24 -04003416{
3417 int i, j;
3418 u32 data, mask;
3419 u32 disabled_rbs = 0;
3420 u32 enabled_rbs = 0;
3421
3422 for (i = 0; i < se_num; i++) {
3423 for (j = 0; j < sh_per_se; j++) {
3424 cik_select_se_sh(rdev, i, j);
Marek Olšák9fadb352013-12-22 02:18:00 +01003425 data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
Alex Deucherfc821b72013-08-07 20:14:08 -04003426 if (rdev->family == CHIP_HAWAII)
3427 disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
3428 else
3429 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003430 }
3431 }
3432 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3433
3434 mask = 1;
Marek Olšák9fadb352013-12-22 02:18:00 +01003435 for (i = 0; i < max_rb_num_per_se * se_num; i++) {
Alex Deucher8cc1a532013-04-09 12:41:24 -04003436 if (!(disabled_rbs & mask))
3437 enabled_rbs |= mask;
3438 mask <<= 1;
3439 }
3440
Marek Olšák439a1cf2013-12-22 02:18:01 +01003441 rdev->config.cik.backend_enable_mask = enabled_rbs;
3442
Alex Deucher8cc1a532013-04-09 12:41:24 -04003443 for (i = 0; i < se_num; i++) {
3444 cik_select_se_sh(rdev, i, 0xffffffff);
3445 data = 0;
3446 for (j = 0; j < sh_per_se; j++) {
3447 switch (enabled_rbs & 3) {
Alex Deucherfc821b72013-08-07 20:14:08 -04003448 case 0:
3449 if (j == 0)
3450 data |= PKR_MAP(RASTER_CONFIG_RB_MAP_3);
3451 else
3452 data |= PKR_MAP(RASTER_CONFIG_RB_MAP_0);
3453 break;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003454 case 1:
3455 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
3456 break;
3457 case 2:
3458 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
3459 break;
3460 case 3:
3461 default:
3462 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
3463 break;
3464 }
3465 enabled_rbs >>= 2;
3466 }
3467 WREG32(PA_SC_RASTER_CONFIG, data);
3468 }
3469 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3470}
3471
3472/**
3473 * cik_gpu_init - setup the 3D engine
3474 *
3475 * @rdev: radeon_device pointer
3476 *
3477 * Configures the 3D engine and tiling configuration
3478 * registers so that the 3D engine is usable.
3479 */
3480static void cik_gpu_init(struct radeon_device *rdev)
3481{
3482 u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
3483 u32 mc_shared_chmap, mc_arb_ramcfg;
3484 u32 hdp_host_path_cntl;
3485 u32 tmp;
Alex Deucher65fcf662014-06-02 16:13:21 -04003486 int i, j, k;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003487
3488 switch (rdev->family) {
3489 case CHIP_BONAIRE:
3490 rdev->config.cik.max_shader_engines = 2;
3491 rdev->config.cik.max_tile_pipes = 4;
3492 rdev->config.cik.max_cu_per_sh = 7;
3493 rdev->config.cik.max_sh_per_se = 1;
3494 rdev->config.cik.max_backends_per_se = 2;
3495 rdev->config.cik.max_texture_channel_caches = 4;
3496 rdev->config.cik.max_gprs = 256;
3497 rdev->config.cik.max_gs_threads = 32;
3498 rdev->config.cik.max_hw_contexts = 8;
3499
3500 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3501 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3502 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3503 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3504 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3505 break;
Alex Deucherb4960382013-08-06 15:42:49 -04003506 case CHIP_HAWAII:
3507 rdev->config.cik.max_shader_engines = 4;
3508 rdev->config.cik.max_tile_pipes = 16;
3509 rdev->config.cik.max_cu_per_sh = 11;
3510 rdev->config.cik.max_sh_per_se = 1;
3511 rdev->config.cik.max_backends_per_se = 4;
3512 rdev->config.cik.max_texture_channel_caches = 16;
3513 rdev->config.cik.max_gprs = 256;
3514 rdev->config.cik.max_gs_threads = 32;
3515 rdev->config.cik.max_hw_contexts = 8;
3516
3517 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3518 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3519 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3520 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3521 gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
3522 break;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003523 case CHIP_KAVERI:
Alex Deucherb2e4c702013-06-10 15:18:26 -04003524 rdev->config.cik.max_shader_engines = 1;
3525 rdev->config.cik.max_tile_pipes = 4;
3526 if ((rdev->pdev->device == 0x1304) ||
3527 (rdev->pdev->device == 0x1305) ||
3528 (rdev->pdev->device == 0x130C) ||
3529 (rdev->pdev->device == 0x130F) ||
3530 (rdev->pdev->device == 0x1310) ||
3531 (rdev->pdev->device == 0x1311) ||
3532 (rdev->pdev->device == 0x131C)) {
3533 rdev->config.cik.max_cu_per_sh = 8;
3534 rdev->config.cik.max_backends_per_se = 2;
3535 } else if ((rdev->pdev->device == 0x1309) ||
3536 (rdev->pdev->device == 0x130A) ||
3537 (rdev->pdev->device == 0x130D) ||
Alex Deucher7c4622d2013-09-04 16:46:07 -04003538 (rdev->pdev->device == 0x1313) ||
3539 (rdev->pdev->device == 0x131D)) {
Alex Deucherb2e4c702013-06-10 15:18:26 -04003540 rdev->config.cik.max_cu_per_sh = 6;
3541 rdev->config.cik.max_backends_per_se = 2;
3542 } else if ((rdev->pdev->device == 0x1306) ||
3543 (rdev->pdev->device == 0x1307) ||
3544 (rdev->pdev->device == 0x130B) ||
3545 (rdev->pdev->device == 0x130E) ||
3546 (rdev->pdev->device == 0x1315) ||
3547 (rdev->pdev->device == 0x131B)) {
3548 rdev->config.cik.max_cu_per_sh = 4;
3549 rdev->config.cik.max_backends_per_se = 1;
3550 } else {
3551 rdev->config.cik.max_cu_per_sh = 3;
3552 rdev->config.cik.max_backends_per_se = 1;
3553 }
3554 rdev->config.cik.max_sh_per_se = 1;
3555 rdev->config.cik.max_texture_channel_caches = 4;
3556 rdev->config.cik.max_gprs = 256;
3557 rdev->config.cik.max_gs_threads = 16;
3558 rdev->config.cik.max_hw_contexts = 8;
3559
3560 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3561 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3562 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3563 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3564 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003565 break;
3566 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04003567 case CHIP_MULLINS:
Alex Deucher8cc1a532013-04-09 12:41:24 -04003568 default:
3569 rdev->config.cik.max_shader_engines = 1;
3570 rdev->config.cik.max_tile_pipes = 2;
3571 rdev->config.cik.max_cu_per_sh = 2;
3572 rdev->config.cik.max_sh_per_se = 1;
3573 rdev->config.cik.max_backends_per_se = 1;
3574 rdev->config.cik.max_texture_channel_caches = 2;
3575 rdev->config.cik.max_gprs = 256;
3576 rdev->config.cik.max_gs_threads = 16;
3577 rdev->config.cik.max_hw_contexts = 8;
3578
3579 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3580 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3581 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3582 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3583 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3584 break;
3585 }
3586
3587 /* Initialize HDP */
3588 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3589 WREG32((0x2c14 + j), 0x00000000);
3590 WREG32((0x2c18 + j), 0x00000000);
3591 WREG32((0x2c1c + j), 0x00000000);
3592 WREG32((0x2c20 + j), 0x00000000);
3593 WREG32((0x2c24 + j), 0x00000000);
3594 }
3595
3596 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3597
3598 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
3599
3600 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3601 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3602
3603 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
3604 rdev->config.cik.mem_max_burst_length_bytes = 256;
3605 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3606 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3607 if (rdev->config.cik.mem_row_size_in_kb > 4)
3608 rdev->config.cik.mem_row_size_in_kb = 4;
3609 /* XXX use MC settings? */
3610 rdev->config.cik.shader_engine_tile_size = 32;
3611 rdev->config.cik.num_gpus = 1;
3612 rdev->config.cik.multi_gpu_tile_size = 64;
3613
3614 /* fix up row size */
3615 gb_addr_config &= ~ROW_SIZE_MASK;
3616 switch (rdev->config.cik.mem_row_size_in_kb) {
3617 case 1:
3618 default:
3619 gb_addr_config |= ROW_SIZE(0);
3620 break;
3621 case 2:
3622 gb_addr_config |= ROW_SIZE(1);
3623 break;
3624 case 4:
3625 gb_addr_config |= ROW_SIZE(2);
3626 break;
3627 }
3628
3629 /* setup tiling info dword. gb_addr_config is not adequate since it does
3630 * not have bank info, so create a custom tiling dword.
3631 * bits 3:0 num_pipes
3632 * bits 7:4 num_banks
3633 * bits 11:8 group_size
3634 * bits 15:12 row_size
3635 */
3636 rdev->config.cik.tile_config = 0;
3637 switch (rdev->config.cik.num_tile_pipes) {
3638 case 1:
3639 rdev->config.cik.tile_config |= (0 << 0);
3640 break;
3641 case 2:
3642 rdev->config.cik.tile_config |= (1 << 0);
3643 break;
3644 case 4:
3645 rdev->config.cik.tile_config |= (2 << 0);
3646 break;
3647 case 8:
3648 default:
3649 /* XXX what about 12? */
3650 rdev->config.cik.tile_config |= (3 << 0);
3651 break;
3652 }
Michel Dänzera5373142013-09-18 15:39:41 +02003653 rdev->config.cik.tile_config |=
3654 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003655 rdev->config.cik.tile_config |=
3656 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3657 rdev->config.cik.tile_config |=
3658 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3659
3660 WREG32(GB_ADDR_CONFIG, gb_addr_config);
3661 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3662 WREG32(DMIF_ADDR_CALC, gb_addr_config);
Alex Deucher21a93e12013-04-09 12:47:11 -04003663 WREG32(SDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
3664 WREG32(SDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
Christian König87167bb2013-04-09 13:39:21 -04003665 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3666 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3667 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003668
3669 cik_tiling_mode_table_init(rdev);
3670
3671 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
3672 rdev->config.cik.max_sh_per_se,
3673 rdev->config.cik.max_backends_per_se);
3674
Alex Deucher65fcf662014-06-02 16:13:21 -04003675 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3676 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
3677 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k++) {
3678 rdev->config.cik.active_cus +=
3679 hweight32(cik_get_cu_active_bitmap(rdev, i, j));
3680 }
3681 }
3682 }
3683
Alex Deucher8cc1a532013-04-09 12:41:24 -04003684 /* set HW defaults for 3D engine */
3685 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3686
3687 WREG32(SX_DEBUG_1, 0x20);
3688
3689 WREG32(TA_CNTL_AUX, 0x00010000);
3690
3691 tmp = RREG32(SPI_CONFIG_CNTL);
3692 tmp |= 0x03000000;
3693 WREG32(SPI_CONFIG_CNTL, tmp);
3694
3695 WREG32(SQ_CONFIG, 1);
3696
3697 WREG32(DB_DEBUG, 0);
3698
3699 tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
3700 tmp |= 0x00000400;
3701 WREG32(DB_DEBUG2, tmp);
3702
3703 tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
3704 tmp |= 0x00020200;
3705 WREG32(DB_DEBUG3, tmp);
3706
3707 tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
3708 tmp |= 0x00018208;
3709 WREG32(CB_HW_CONTROL, tmp);
3710
3711 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3712
3713 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
3714 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
3715 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
3716 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
3717
3718 WREG32(VGT_NUM_INSTANCES, 1);
3719
3720 WREG32(CP_PERFMON_CNTL, 0);
3721
3722 WREG32(SQ_CONFIG, 0);
3723
3724 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3725 FORCE_EOV_MAX_REZ_CNT(255)));
3726
3727 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
3728 AUTO_INVLD_EN(ES_AND_GS_AUTO));
3729
3730 WREG32(VGT_GS_VERTEX_REUSE, 16);
3731 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3732
3733 tmp = RREG32(HDP_MISC_CNTL);
3734 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3735 WREG32(HDP_MISC_CNTL, tmp);
3736
3737 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3738 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3739
3740 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3741 WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
3742
3743 udelay(50);
3744}
3745
Alex Deucher841cf442012-12-18 21:47:44 -05003746/*
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003747 * GPU scratch registers helpers function.
3748 */
3749/**
3750 * cik_scratch_init - setup driver info for CP scratch regs
3751 *
3752 * @rdev: radeon_device pointer
3753 *
3754 * Set up the number and offset of the CP scratch registers.
3755 * NOTE: use of CP scratch registers is a legacy inferface and
3756 * is not used by default on newer asics (r6xx+). On newer asics,
3757 * memory buffers are used for fences rather than scratch regs.
3758 */
3759static void cik_scratch_init(struct radeon_device *rdev)
3760{
3761 int i;
3762
3763 rdev->scratch.num_reg = 7;
3764 rdev->scratch.reg_base = SCRATCH_REG0;
3765 for (i = 0; i < rdev->scratch.num_reg; i++) {
3766 rdev->scratch.free[i] = true;
3767 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
3768 }
3769}
3770
3771/**
Alex Deucherfbc832c2012-07-20 14:41:35 -04003772 * cik_ring_test - basic gfx ring test
3773 *
3774 * @rdev: radeon_device pointer
3775 * @ring: radeon_ring structure holding ring information
3776 *
3777 * Allocate a scratch register and write to it using the gfx ring (CIK).
3778 * Provides a basic gfx ring test to verify that the ring is working.
3779 * Used by cik_cp_gfx_resume();
3780 * Returns 0 on success, error on failure.
3781 */
3782int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
3783{
3784 uint32_t scratch;
3785 uint32_t tmp = 0;
3786 unsigned i;
3787 int r;
3788
3789 r = radeon_scratch_get(rdev, &scratch);
3790 if (r) {
3791 DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
3792 return r;
3793 }
3794 WREG32(scratch, 0xCAFEDEAD);
3795 r = radeon_ring_lock(rdev, ring, 3);
3796 if (r) {
3797 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
3798 radeon_scratch_free(rdev, scratch);
3799 return r;
3800 }
3801 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
3802 radeon_ring_write(ring, ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2));
3803 radeon_ring_write(ring, 0xDEADBEEF);
3804 radeon_ring_unlock_commit(rdev, ring);
Alex Deucher963e81f2013-06-26 17:37:11 -04003805
Alex Deucherfbc832c2012-07-20 14:41:35 -04003806 for (i = 0; i < rdev->usec_timeout; i++) {
3807 tmp = RREG32(scratch);
3808 if (tmp == 0xDEADBEEF)
3809 break;
3810 DRM_UDELAY(1);
3811 }
3812 if (i < rdev->usec_timeout) {
3813 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
3814 } else {
3815 DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
3816 ring->idx, scratch, tmp);
3817 r = -EINVAL;
3818 }
3819 radeon_scratch_free(rdev, scratch);
3820 return r;
3821}
3822
3823/**
Alex Deucher780f5dd2014-01-09 16:18:11 -05003824 * cik_hdp_flush_cp_ring_emit - emit an hdp flush on the cp
3825 *
3826 * @rdev: radeon_device pointer
3827 * @ridx: radeon ring index
3828 *
3829 * Emits an hdp flush on the cp.
3830 */
3831static void cik_hdp_flush_cp_ring_emit(struct radeon_device *rdev,
3832 int ridx)
3833{
3834 struct radeon_ring *ring = &rdev->ring[ridx];
Alex Deucher5d259062014-01-09 16:51:56 -05003835 u32 ref_and_mask;
Alex Deucher780f5dd2014-01-09 16:18:11 -05003836
Alex Deucher5d259062014-01-09 16:51:56 -05003837 switch (ring->idx) {
3838 case CAYMAN_RING_TYPE_CP1_INDEX:
3839 case CAYMAN_RING_TYPE_CP2_INDEX:
3840 default:
3841 switch (ring->me) {
3842 case 0:
3843 ref_and_mask = CP2 << ring->pipe;
3844 break;
3845 case 1:
3846 ref_and_mask = CP6 << ring->pipe;
3847 break;
3848 default:
3849 return;
3850 }
3851 break;
3852 case RADEON_RING_TYPE_GFX_INDEX:
3853 ref_and_mask = CP0;
3854 break;
3855 }
3856
3857 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3858 radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
3859 WAIT_REG_MEM_FUNCTION(3) | /* == */
3860 WAIT_REG_MEM_ENGINE(1))); /* pfp */
3861 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ >> 2);
3862 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE >> 2);
3863 radeon_ring_write(ring, ref_and_mask);
3864 radeon_ring_write(ring, ref_and_mask);
3865 radeon_ring_write(ring, 0x20); /* poll interval */
Alex Deucher780f5dd2014-01-09 16:18:11 -05003866}
3867
3868/**
Alex Deucherb07fdd32013-04-11 09:36:17 -04003869 * cik_fence_gfx_ring_emit - emit a fence on the gfx ring
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003870 *
3871 * @rdev: radeon_device pointer
3872 * @fence: radeon fence object
3873 *
3874 * Emits a fence sequnce number on the gfx ring and flushes
3875 * GPU caches.
3876 */
Alex Deucherb07fdd32013-04-11 09:36:17 -04003877void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
3878 struct radeon_fence *fence)
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003879{
3880 struct radeon_ring *ring = &rdev->ring[fence->ring];
3881 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3882
3883 /* EVENT_WRITE_EOP - flush caches, send int */
3884 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3885 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3886 EOP_TC_ACTION_EN |
3887 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3888 EVENT_INDEX(5)));
3889 radeon_ring_write(ring, addr & 0xfffffffc);
3890 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
3891 radeon_ring_write(ring, fence->seq);
3892 radeon_ring_write(ring, 0);
3893 /* HDP flush */
Alex Deucher780f5dd2014-01-09 16:18:11 -05003894 cik_hdp_flush_cp_ring_emit(rdev, fence->ring);
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003895}
3896
Alex Deucherb07fdd32013-04-11 09:36:17 -04003897/**
3898 * cik_fence_compute_ring_emit - emit a fence on the compute ring
3899 *
3900 * @rdev: radeon_device pointer
3901 * @fence: radeon fence object
3902 *
3903 * Emits a fence sequnce number on the compute ring and flushes
3904 * GPU caches.
3905 */
3906void cik_fence_compute_ring_emit(struct radeon_device *rdev,
3907 struct radeon_fence *fence)
3908{
3909 struct radeon_ring *ring = &rdev->ring[fence->ring];
3910 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3911
3912 /* RELEASE_MEM - flush caches, send int */
3913 radeon_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
3914 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3915 EOP_TC_ACTION_EN |
3916 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3917 EVENT_INDEX(5)));
3918 radeon_ring_write(ring, DATA_SEL(1) | INT_SEL(2));
3919 radeon_ring_write(ring, addr & 0xfffffffc);
3920 radeon_ring_write(ring, upper_32_bits(addr));
3921 radeon_ring_write(ring, fence->seq);
3922 radeon_ring_write(ring, 0);
3923 /* HDP flush */
Alex Deucher780f5dd2014-01-09 16:18:11 -05003924 cik_hdp_flush_cp_ring_emit(rdev, fence->ring);
Alex Deucherb07fdd32013-04-11 09:36:17 -04003925}
3926
Christian König1654b812013-11-12 12:58:05 +01003927bool cik_semaphore_ring_emit(struct radeon_device *rdev,
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003928 struct radeon_ring *ring,
3929 struct radeon_semaphore *semaphore,
3930 bool emit_wait)
3931{
3932 uint64_t addr = semaphore->gpu_addr;
3933 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3934
3935 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
Christian König5e167cd2014-06-03 20:51:46 +02003936 radeon_ring_write(ring, lower_32_bits(addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003937 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
Christian König1654b812013-11-12 12:58:05 +01003938
3939 return true;
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003940}
3941
Alex Deucherc9dbd702013-10-01 16:36:51 -04003942/**
3943 * cik_copy_cpdma - copy pages using the CP DMA engine
3944 *
3945 * @rdev: radeon_device pointer
3946 * @src_offset: src GPU address
3947 * @dst_offset: dst GPU address
3948 * @num_gpu_pages: number of GPU pages to xfer
3949 * @fence: radeon fence object
3950 *
3951 * Copy GPU paging using the CP DMA engine (CIK+).
3952 * Used by the radeon ttm implementation to move pages if
3953 * registered as the asic copy callback.
3954 */
3955int cik_copy_cpdma(struct radeon_device *rdev,
3956 uint64_t src_offset, uint64_t dst_offset,
3957 unsigned num_gpu_pages,
3958 struct radeon_fence **fence)
3959{
3960 struct radeon_semaphore *sem = NULL;
3961 int ring_index = rdev->asic->copy.blit_ring_index;
3962 struct radeon_ring *ring = &rdev->ring[ring_index];
3963 u32 size_in_bytes, cur_size_in_bytes, control;
3964 int i, num_loops;
3965 int r = 0;
3966
3967 r = radeon_semaphore_create(rdev, &sem);
3968 if (r) {
3969 DRM_ERROR("radeon: moving bo (%d).\n", r);
3970 return r;
3971 }
3972
3973 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3974 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
3975 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 18);
3976 if (r) {
3977 DRM_ERROR("radeon: moving bo (%d).\n", r);
3978 radeon_semaphore_free(rdev, &sem, NULL);
3979 return r;
3980 }
3981
Christian König1654b812013-11-12 12:58:05 +01003982 radeon_semaphore_sync_to(sem, *fence);
3983 radeon_semaphore_sync_rings(rdev, sem, ring->idx);
Alex Deucherc9dbd702013-10-01 16:36:51 -04003984
3985 for (i = 0; i < num_loops; i++) {
3986 cur_size_in_bytes = size_in_bytes;
3987 if (cur_size_in_bytes > 0x1fffff)
3988 cur_size_in_bytes = 0x1fffff;
3989 size_in_bytes -= cur_size_in_bytes;
3990 control = 0;
3991 if (size_in_bytes == 0)
3992 control |= PACKET3_DMA_DATA_CP_SYNC;
3993 radeon_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
3994 radeon_ring_write(ring, control);
3995 radeon_ring_write(ring, lower_32_bits(src_offset));
3996 radeon_ring_write(ring, upper_32_bits(src_offset));
3997 radeon_ring_write(ring, lower_32_bits(dst_offset));
3998 radeon_ring_write(ring, upper_32_bits(dst_offset));
3999 radeon_ring_write(ring, cur_size_in_bytes);
4000 src_offset += cur_size_in_bytes;
4001 dst_offset += cur_size_in_bytes;
4002 }
4003
4004 r = radeon_fence_emit(rdev, fence, ring->idx);
4005 if (r) {
4006 radeon_ring_unlock_undo(rdev, ring);
Maarten Lankhorstaa4c8b32014-04-24 13:29:14 +02004007 radeon_semaphore_free(rdev, &sem, NULL);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004008 return r;
4009 }
4010
4011 radeon_ring_unlock_commit(rdev, ring);
4012 radeon_semaphore_free(rdev, &sem, *fence);
4013
4014 return r;
4015}
4016
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004017/*
4018 * IB stuff
4019 */
4020/**
4021 * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
4022 *
4023 * @rdev: radeon_device pointer
4024 * @ib: radeon indirect buffer object
4025 *
4026 * Emits an DE (drawing engine) or CE (constant engine) IB
4027 * on the gfx ring. IBs are usually generated by userspace
4028 * acceleration drivers and submitted to the kernel for
4029 * sheduling on the ring. This function schedules the IB
4030 * on the gfx ring for execution by the GPU.
4031 */
4032void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
4033{
4034 struct radeon_ring *ring = &rdev->ring[ib->ring];
4035 u32 header, control = INDIRECT_BUFFER_VALID;
4036
4037 if (ib->is_const_ib) {
4038 /* set switch buffer packet before const IB */
4039 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
4040 radeon_ring_write(ring, 0);
4041
4042 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
4043 } else {
4044 u32 next_rptr;
4045 if (ring->rptr_save_reg) {
4046 next_rptr = ring->wptr + 3 + 4;
4047 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
4048 radeon_ring_write(ring, ((ring->rptr_save_reg -
4049 PACKET3_SET_UCONFIG_REG_START) >> 2));
4050 radeon_ring_write(ring, next_rptr);
4051 } else if (rdev->wb.enabled) {
4052 next_rptr = ring->wptr + 5 + 4;
4053 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4054 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
4055 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
Christian König5e167cd2014-06-03 20:51:46 +02004056 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004057 radeon_ring_write(ring, next_rptr);
4058 }
4059
4060 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
4061 }
4062
4063 control |= ib->length_dw |
4064 (ib->vm ? (ib->vm->id << 24) : 0);
4065
4066 radeon_ring_write(ring, header);
4067 radeon_ring_write(ring,
4068#ifdef __BIG_ENDIAN
4069 (2 << 0) |
4070#endif
4071 (ib->gpu_addr & 0xFFFFFFFC));
4072 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
4073 radeon_ring_write(ring, control);
4074}
4075
Alex Deucherfbc832c2012-07-20 14:41:35 -04004076/**
4077 * cik_ib_test - basic gfx ring IB test
4078 *
4079 * @rdev: radeon_device pointer
4080 * @ring: radeon_ring structure holding ring information
4081 *
4082 * Allocate an IB and execute it on the gfx ring (CIK).
4083 * Provides a basic gfx ring test to verify that IBs are working.
4084 * Returns 0 on success, error on failure.
4085 */
4086int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
4087{
4088 struct radeon_ib ib;
4089 uint32_t scratch;
4090 uint32_t tmp = 0;
4091 unsigned i;
4092 int r;
4093
4094 r = radeon_scratch_get(rdev, &scratch);
4095 if (r) {
4096 DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
4097 return r;
4098 }
4099 WREG32(scratch, 0xCAFEDEAD);
4100 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
4101 if (r) {
4102 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004103 radeon_scratch_free(rdev, scratch);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004104 return r;
4105 }
4106 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
4107 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
4108 ib.ptr[2] = 0xDEADBEEF;
4109 ib.length_dw = 3;
4110 r = radeon_ib_schedule(rdev, &ib, NULL);
4111 if (r) {
4112 radeon_scratch_free(rdev, scratch);
4113 radeon_ib_free(rdev, &ib);
4114 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
4115 return r;
4116 }
4117 r = radeon_fence_wait(ib.fence, false);
4118 if (r) {
4119 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004120 radeon_scratch_free(rdev, scratch);
4121 radeon_ib_free(rdev, &ib);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004122 return r;
4123 }
4124 for (i = 0; i < rdev->usec_timeout; i++) {
4125 tmp = RREG32(scratch);
4126 if (tmp == 0xDEADBEEF)
4127 break;
4128 DRM_UDELAY(1);
4129 }
4130 if (i < rdev->usec_timeout) {
4131 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
4132 } else {
4133 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
4134 scratch, tmp);
4135 r = -EINVAL;
4136 }
4137 radeon_scratch_free(rdev, scratch);
4138 radeon_ib_free(rdev, &ib);
4139 return r;
4140}
4141
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004142/*
Alex Deucher841cf442012-12-18 21:47:44 -05004143 * CP.
4144 * On CIK, gfx and compute now have independant command processors.
4145 *
4146 * GFX
4147 * Gfx consists of a single ring and can process both gfx jobs and
4148 * compute jobs. The gfx CP consists of three microengines (ME):
4149 * PFP - Pre-Fetch Parser
4150 * ME - Micro Engine
4151 * CE - Constant Engine
4152 * The PFP and ME make up what is considered the Drawing Engine (DE).
4153 * The CE is an asynchronous engine used for updating buffer desciptors
4154 * used by the DE so that they can be loaded into cache in parallel
4155 * while the DE is processing state update packets.
4156 *
4157 * Compute
4158 * The compute CP consists of two microengines (ME):
4159 * MEC1 - Compute MicroEngine 1
4160 * MEC2 - Compute MicroEngine 2
4161 * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
4162 * The queues are exposed to userspace and are programmed directly
4163 * by the compute runtime.
4164 */
4165/**
4166 * cik_cp_gfx_enable - enable/disable the gfx CP MEs
4167 *
4168 * @rdev: radeon_device pointer
4169 * @enable: enable or disable the MEs
4170 *
4171 * Halts or unhalts the gfx MEs.
4172 */
4173static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
4174{
4175 if (enable)
4176 WREG32(CP_ME_CNTL, 0);
4177 else {
Alex Deucher50efa512014-01-27 11:26:33 -05004178 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4179 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
Alex Deucher841cf442012-12-18 21:47:44 -05004180 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
4181 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4182 }
4183 udelay(50);
4184}
4185
4186/**
4187 * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
4188 *
4189 * @rdev: radeon_device pointer
4190 *
4191 * Loads the gfx PFP, ME, and CE ucode.
4192 * Returns 0 for success, -EINVAL if the ucode is not available.
4193 */
4194static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
4195{
Alex Deucher841cf442012-12-18 21:47:44 -05004196 int i;
4197
4198 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
4199 return -EINVAL;
4200
4201 cik_cp_gfx_enable(rdev, false);
4202
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004203 if (rdev->new_fw) {
4204 const struct gfx_firmware_header_v1_0 *pfp_hdr =
4205 (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
4206 const struct gfx_firmware_header_v1_0 *ce_hdr =
4207 (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
4208 const struct gfx_firmware_header_v1_0 *me_hdr =
4209 (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
4210 const __le32 *fw_data;
4211 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004212
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004213 radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
4214 radeon_ucode_print_gfx_hdr(&ce_hdr->header);
4215 radeon_ucode_print_gfx_hdr(&me_hdr->header);
Alex Deucher841cf442012-12-18 21:47:44 -05004216
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004217 /* PFP */
4218 fw_data = (const __le32 *)
4219 (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
4220 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
4221 WREG32(CP_PFP_UCODE_ADDR, 0);
4222 for (i = 0; i < fw_size; i++)
4223 WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
4224 WREG32(CP_PFP_UCODE_ADDR, 0);
4225
4226 /* CE */
4227 fw_data = (const __le32 *)
4228 (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
4229 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
4230 WREG32(CP_CE_UCODE_ADDR, 0);
4231 for (i = 0; i < fw_size; i++)
4232 WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
4233 WREG32(CP_CE_UCODE_ADDR, 0);
4234
4235 /* ME */
4236 fw_data = (const __be32 *)
4237 (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
4238 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
4239 WREG32(CP_ME_RAM_WADDR, 0);
4240 for (i = 0; i < fw_size; i++)
4241 WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
4242 WREG32(CP_ME_RAM_WADDR, 0);
4243 } else {
4244 const __be32 *fw_data;
4245
4246 /* PFP */
4247 fw_data = (const __be32 *)rdev->pfp_fw->data;
4248 WREG32(CP_PFP_UCODE_ADDR, 0);
4249 for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
4250 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
4251 WREG32(CP_PFP_UCODE_ADDR, 0);
4252
4253 /* CE */
4254 fw_data = (const __be32 *)rdev->ce_fw->data;
4255 WREG32(CP_CE_UCODE_ADDR, 0);
4256 for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
4257 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
4258 WREG32(CP_CE_UCODE_ADDR, 0);
4259
4260 /* ME */
4261 fw_data = (const __be32 *)rdev->me_fw->data;
4262 WREG32(CP_ME_RAM_WADDR, 0);
4263 for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
4264 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
4265 WREG32(CP_ME_RAM_WADDR, 0);
4266 }
Alex Deucher841cf442012-12-18 21:47:44 -05004267
4268 WREG32(CP_PFP_UCODE_ADDR, 0);
4269 WREG32(CP_CE_UCODE_ADDR, 0);
4270 WREG32(CP_ME_RAM_WADDR, 0);
4271 WREG32(CP_ME_RAM_RADDR, 0);
4272 return 0;
4273}
4274
4275/**
4276 * cik_cp_gfx_start - start the gfx ring
4277 *
4278 * @rdev: radeon_device pointer
4279 *
4280 * Enables the ring and loads the clear state context and other
4281 * packets required to init the ring.
4282 * Returns 0 for success, error for failure.
4283 */
4284static int cik_cp_gfx_start(struct radeon_device *rdev)
4285{
4286 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4287 int r, i;
4288
4289 /* init the CP */
4290 WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
4291 WREG32(CP_ENDIAN_SWAP, 0);
4292 WREG32(CP_DEVICE_ID, 1);
4293
4294 cik_cp_gfx_enable(rdev, true);
4295
4296 r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
4297 if (r) {
4298 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
4299 return r;
4300 }
4301
4302 /* init the CE partitions. CE only used for gfx on CIK */
4303 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
4304 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
4305 radeon_ring_write(ring, 0xc000);
4306 radeon_ring_write(ring, 0xc000);
4307
4308 /* setup clear context state */
4309 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4310 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
4311
4312 radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
4313 radeon_ring_write(ring, 0x80000000);
4314 radeon_ring_write(ring, 0x80000000);
4315
4316 for (i = 0; i < cik_default_size; i++)
4317 radeon_ring_write(ring, cik_default_state[i]);
4318
4319 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4320 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
4321
4322 /* set clear context state */
4323 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
4324 radeon_ring_write(ring, 0);
4325
4326 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
4327 radeon_ring_write(ring, 0x00000316);
4328 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
4329 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
4330
4331 radeon_ring_unlock_commit(rdev, ring);
4332
4333 return 0;
4334}
4335
4336/**
4337 * cik_cp_gfx_fini - stop the gfx ring
4338 *
4339 * @rdev: radeon_device pointer
4340 *
4341 * Stop the gfx ring and tear down the driver ring
4342 * info.
4343 */
4344static void cik_cp_gfx_fini(struct radeon_device *rdev)
4345{
4346 cik_cp_gfx_enable(rdev, false);
4347 radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4348}
4349
4350/**
4351 * cik_cp_gfx_resume - setup the gfx ring buffer registers
4352 *
4353 * @rdev: radeon_device pointer
4354 *
4355 * Program the location and size of the gfx ring buffer
4356 * and test it to make sure it's working.
4357 * Returns 0 for success, error for failure.
4358 */
4359static int cik_cp_gfx_resume(struct radeon_device *rdev)
4360{
4361 struct radeon_ring *ring;
4362 u32 tmp;
4363 u32 rb_bufsz;
4364 u64 rb_addr;
4365 int r;
4366
4367 WREG32(CP_SEM_WAIT_TIMER, 0x0);
Alex Deucher939c0d32013-09-30 18:03:06 -04004368 if (rdev->family != CHIP_HAWAII)
4369 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
Alex Deucher841cf442012-12-18 21:47:44 -05004370
4371 /* Set the write pointer delay */
4372 WREG32(CP_RB_WPTR_DELAY, 0);
4373
4374 /* set the RB to use vmid 0 */
4375 WREG32(CP_RB_VMID, 0);
4376
4377 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
4378
4379 /* ring 0 - compute and gfx */
4380 /* Set ring buffer size */
4381 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
Daniel Vetterb72a8922013-07-10 14:11:59 +02004382 rb_bufsz = order_base_2(ring->ring_size / 8);
4383 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
Alex Deucher841cf442012-12-18 21:47:44 -05004384#ifdef __BIG_ENDIAN
4385 tmp |= BUF_SWAP_32BIT;
4386#endif
4387 WREG32(CP_RB0_CNTL, tmp);
4388
4389 /* Initialize the ring buffer's read and write pointers */
4390 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
4391 ring->wptr = 0;
4392 WREG32(CP_RB0_WPTR, ring->wptr);
4393
4394 /* set the wb address wether it's enabled or not */
4395 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
4396 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
4397
4398 /* scratch register shadowing is no longer supported */
4399 WREG32(SCRATCH_UMSK, 0);
4400
4401 if (!rdev->wb.enabled)
4402 tmp |= RB_NO_UPDATE;
4403
4404 mdelay(1);
4405 WREG32(CP_RB0_CNTL, tmp);
4406
4407 rb_addr = ring->gpu_addr >> 8;
4408 WREG32(CP_RB0_BASE, rb_addr);
4409 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
4410
Alex Deucher841cf442012-12-18 21:47:44 -05004411 /* start the ring */
4412 cik_cp_gfx_start(rdev);
4413 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
4414 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4415 if (r) {
4416 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4417 return r;
4418 }
Alex Deucher50efa512014-01-27 11:26:33 -05004419
4420 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4421 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
4422
Alex Deucher841cf442012-12-18 21:47:44 -05004423 return 0;
4424}
4425
Alex Deucherea31bf62013-12-09 19:44:30 -05004426u32 cik_gfx_get_rptr(struct radeon_device *rdev,
4427 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004428{
4429 u32 rptr;
4430
Alex Deucherea31bf62013-12-09 19:44:30 -05004431 if (rdev->wb.enabled)
4432 rptr = rdev->wb.wb[ring->rptr_offs/4];
4433 else
4434 rptr = RREG32(CP_RB0_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04004435
Alex Deucherea31bf62013-12-09 19:44:30 -05004436 return rptr;
4437}
4438
4439u32 cik_gfx_get_wptr(struct radeon_device *rdev,
4440 struct radeon_ring *ring)
4441{
4442 u32 wptr;
4443
4444 wptr = RREG32(CP_RB0_WPTR);
4445
4446 return wptr;
4447}
4448
4449void cik_gfx_set_wptr(struct radeon_device *rdev,
4450 struct radeon_ring *ring)
4451{
4452 WREG32(CP_RB0_WPTR, ring->wptr);
4453 (void)RREG32(CP_RB0_WPTR);
4454}
4455
4456u32 cik_compute_get_rptr(struct radeon_device *rdev,
4457 struct radeon_ring *ring)
4458{
4459 u32 rptr;
Alex Deucher963e81f2013-06-26 17:37:11 -04004460
4461 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004462 rptr = rdev->wb.wb[ring->rptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004463 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004464 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004465 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4466 rptr = RREG32(CP_HQD_PQ_RPTR);
4467 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004468 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004469 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004470
4471 return rptr;
4472}
4473
Alex Deucherea31bf62013-12-09 19:44:30 -05004474u32 cik_compute_get_wptr(struct radeon_device *rdev,
4475 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004476{
4477 u32 wptr;
4478
4479 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004480 /* XXX check if swapping is necessary on BE */
4481 wptr = rdev->wb.wb[ring->wptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004482 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004483 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004484 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4485 wptr = RREG32(CP_HQD_PQ_WPTR);
4486 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004487 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004488 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004489
4490 return wptr;
4491}
4492
Alex Deucherea31bf62013-12-09 19:44:30 -05004493void cik_compute_set_wptr(struct radeon_device *rdev,
4494 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004495{
Alex Deucherea31bf62013-12-09 19:44:30 -05004496 /* XXX check if swapping is necessary on BE */
4497 rdev->wb.wb[ring->wptr_offs/4] = ring->wptr;
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05004498 WDOORBELL32(ring->doorbell_index, ring->wptr);
Alex Deucher963e81f2013-06-26 17:37:11 -04004499}
4500
Alex Deucher841cf442012-12-18 21:47:44 -05004501/**
4502 * cik_cp_compute_enable - enable/disable the compute CP MEs
4503 *
4504 * @rdev: radeon_device pointer
4505 * @enable: enable or disable the MEs
4506 *
4507 * Halts or unhalts the compute MEs.
4508 */
4509static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
4510{
4511 if (enable)
4512 WREG32(CP_MEC_CNTL, 0);
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004513 else {
Alex Deucher841cf442012-12-18 21:47:44 -05004514 WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004515 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
4516 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
4517 }
Alex Deucher841cf442012-12-18 21:47:44 -05004518 udelay(50);
4519}
4520
4521/**
4522 * cik_cp_compute_load_microcode - load the compute CP ME ucode
4523 *
4524 * @rdev: radeon_device pointer
4525 *
4526 * Loads the compute MEC1&2 ucode.
4527 * Returns 0 for success, -EINVAL if the ucode is not available.
4528 */
4529static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
4530{
Alex Deucher841cf442012-12-18 21:47:44 -05004531 int i;
4532
4533 if (!rdev->mec_fw)
4534 return -EINVAL;
4535
4536 cik_cp_compute_enable(rdev, false);
4537
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004538 if (rdev->new_fw) {
4539 const struct gfx_firmware_header_v1_0 *mec_hdr =
4540 (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
4541 const __le32 *fw_data;
4542 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004543
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004544 radeon_ucode_print_gfx_hdr(&mec_hdr->header);
4545
4546 /* MEC1 */
4547 fw_data = (const __le32 *)
4548 (rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
4549 fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
4550 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4551 for (i = 0; i < fw_size; i++)
4552 WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
4553 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4554
Alex Deucher841cf442012-12-18 21:47:44 -05004555 /* MEC2 */
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004556 if (rdev->family == CHIP_KAVERI) {
4557 const struct gfx_firmware_header_v1_0 *mec2_hdr =
4558 (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
4559
4560 fw_data = (const __le32 *)
4561 (rdev->mec2_fw->data +
4562 le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
4563 fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
4564 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4565 for (i = 0; i < fw_size; i++)
4566 WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
4567 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4568 }
4569 } else {
4570 const __be32 *fw_data;
4571
4572 /* MEC1 */
Alex Deucher841cf442012-12-18 21:47:44 -05004573 fw_data = (const __be32 *)rdev->mec_fw->data;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004574 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
Alex Deucher841cf442012-12-18 21:47:44 -05004575 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004576 WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
4577 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4578
4579 if (rdev->family == CHIP_KAVERI) {
4580 /* MEC2 */
4581 fw_data = (const __be32 *)rdev->mec_fw->data;
4582 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4583 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
4584 WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
4585 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4586 }
Alex Deucher841cf442012-12-18 21:47:44 -05004587 }
4588
4589 return 0;
4590}
4591
4592/**
4593 * cik_cp_compute_start - start the compute queues
4594 *
4595 * @rdev: radeon_device pointer
4596 *
4597 * Enable the compute queues.
4598 * Returns 0 for success, error for failure.
4599 */
4600static int cik_cp_compute_start(struct radeon_device *rdev)
4601{
Alex Deucher963e81f2013-06-26 17:37:11 -04004602 cik_cp_compute_enable(rdev, true);
4603
Alex Deucher841cf442012-12-18 21:47:44 -05004604 return 0;
4605}
4606
4607/**
4608 * cik_cp_compute_fini - stop the compute queues
4609 *
4610 * @rdev: radeon_device pointer
4611 *
4612 * Stop the compute queues and tear down the driver queue
4613 * info.
4614 */
4615static void cik_cp_compute_fini(struct radeon_device *rdev)
4616{
Alex Deucher963e81f2013-06-26 17:37:11 -04004617 int i, idx, r;
4618
Alex Deucher841cf442012-12-18 21:47:44 -05004619 cik_cp_compute_enable(rdev, false);
Alex Deucher963e81f2013-06-26 17:37:11 -04004620
4621 for (i = 0; i < 2; i++) {
4622 if (i == 0)
4623 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4624 else
4625 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4626
4627 if (rdev->ring[idx].mqd_obj) {
4628 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4629 if (unlikely(r != 0))
4630 dev_warn(rdev->dev, "(%d) reserve MQD bo failed\n", r);
4631
4632 radeon_bo_unpin(rdev->ring[idx].mqd_obj);
4633 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
4634
4635 radeon_bo_unref(&rdev->ring[idx].mqd_obj);
4636 rdev->ring[idx].mqd_obj = NULL;
4637 }
4638 }
Alex Deucher841cf442012-12-18 21:47:44 -05004639}
4640
Alex Deucher963e81f2013-06-26 17:37:11 -04004641static void cik_mec_fini(struct radeon_device *rdev)
4642{
4643 int r;
4644
4645 if (rdev->mec.hpd_eop_obj) {
4646 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4647 if (unlikely(r != 0))
4648 dev_warn(rdev->dev, "(%d) reserve HPD EOP bo failed\n", r);
4649 radeon_bo_unpin(rdev->mec.hpd_eop_obj);
4650 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4651
4652 radeon_bo_unref(&rdev->mec.hpd_eop_obj);
4653 rdev->mec.hpd_eop_obj = NULL;
4654 }
4655}
4656
4657#define MEC_HPD_SIZE 2048
4658
4659static int cik_mec_init(struct radeon_device *rdev)
4660{
4661 int r;
4662 u32 *hpd;
4663
4664 /*
4665 * KV: 2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
4666 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
4667 */
4668 if (rdev->family == CHIP_KAVERI)
4669 rdev->mec.num_mec = 2;
4670 else
4671 rdev->mec.num_mec = 1;
4672 rdev->mec.num_pipe = 4;
4673 rdev->mec.num_queue = rdev->mec.num_mec * rdev->mec.num_pipe * 8;
4674
4675 if (rdev->mec.hpd_eop_obj == NULL) {
4676 r = radeon_bo_create(rdev,
4677 rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
4678 PAGE_SIZE, true,
4679 RADEON_GEM_DOMAIN_GTT, NULL,
4680 &rdev->mec.hpd_eop_obj);
4681 if (r) {
4682 dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
4683 return r;
4684 }
4685 }
4686
4687 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4688 if (unlikely(r != 0)) {
4689 cik_mec_fini(rdev);
4690 return r;
4691 }
4692 r = radeon_bo_pin(rdev->mec.hpd_eop_obj, RADEON_GEM_DOMAIN_GTT,
4693 &rdev->mec.hpd_eop_gpu_addr);
4694 if (r) {
4695 dev_warn(rdev->dev, "(%d) pin HDP EOP bo failed\n", r);
4696 cik_mec_fini(rdev);
4697 return r;
4698 }
4699 r = radeon_bo_kmap(rdev->mec.hpd_eop_obj, (void **)&hpd);
4700 if (r) {
4701 dev_warn(rdev->dev, "(%d) map HDP EOP bo failed\n", r);
4702 cik_mec_fini(rdev);
4703 return r;
4704 }
4705
4706 /* clear memory. Not sure if this is required or not */
4707 memset(hpd, 0, rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2);
4708
4709 radeon_bo_kunmap(rdev->mec.hpd_eop_obj);
4710 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4711
4712 return 0;
4713}
4714
4715struct hqd_registers
4716{
4717 u32 cp_mqd_base_addr;
4718 u32 cp_mqd_base_addr_hi;
4719 u32 cp_hqd_active;
4720 u32 cp_hqd_vmid;
4721 u32 cp_hqd_persistent_state;
4722 u32 cp_hqd_pipe_priority;
4723 u32 cp_hqd_queue_priority;
4724 u32 cp_hqd_quantum;
4725 u32 cp_hqd_pq_base;
4726 u32 cp_hqd_pq_base_hi;
4727 u32 cp_hqd_pq_rptr;
4728 u32 cp_hqd_pq_rptr_report_addr;
4729 u32 cp_hqd_pq_rptr_report_addr_hi;
4730 u32 cp_hqd_pq_wptr_poll_addr;
4731 u32 cp_hqd_pq_wptr_poll_addr_hi;
4732 u32 cp_hqd_pq_doorbell_control;
4733 u32 cp_hqd_pq_wptr;
4734 u32 cp_hqd_pq_control;
4735 u32 cp_hqd_ib_base_addr;
4736 u32 cp_hqd_ib_base_addr_hi;
4737 u32 cp_hqd_ib_rptr;
4738 u32 cp_hqd_ib_control;
4739 u32 cp_hqd_iq_timer;
4740 u32 cp_hqd_iq_rptr;
4741 u32 cp_hqd_dequeue_request;
4742 u32 cp_hqd_dma_offload;
4743 u32 cp_hqd_sema_cmd;
4744 u32 cp_hqd_msg_type;
4745 u32 cp_hqd_atomic0_preop_lo;
4746 u32 cp_hqd_atomic0_preop_hi;
4747 u32 cp_hqd_atomic1_preop_lo;
4748 u32 cp_hqd_atomic1_preop_hi;
4749 u32 cp_hqd_hq_scheduler0;
4750 u32 cp_hqd_hq_scheduler1;
4751 u32 cp_mqd_control;
4752};
4753
4754struct bonaire_mqd
4755{
4756 u32 header;
4757 u32 dispatch_initiator;
4758 u32 dimensions[3];
4759 u32 start_idx[3];
4760 u32 num_threads[3];
4761 u32 pipeline_stat_enable;
4762 u32 perf_counter_enable;
4763 u32 pgm[2];
4764 u32 tba[2];
4765 u32 tma[2];
4766 u32 pgm_rsrc[2];
4767 u32 vmid;
4768 u32 resource_limits;
4769 u32 static_thread_mgmt01[2];
4770 u32 tmp_ring_size;
4771 u32 static_thread_mgmt23[2];
4772 u32 restart[3];
4773 u32 thread_trace_enable;
4774 u32 reserved1;
4775 u32 user_data[16];
4776 u32 vgtcs_invoke_count[2];
4777 struct hqd_registers queue_state;
4778 u32 dequeue_cntr;
4779 u32 interrupt_queue[64];
4780};
4781
Alex Deucher841cf442012-12-18 21:47:44 -05004782/**
4783 * cik_cp_compute_resume - setup the compute queue registers
4784 *
4785 * @rdev: radeon_device pointer
4786 *
4787 * Program the compute queues and test them to make sure they
4788 * are working.
4789 * Returns 0 for success, error for failure.
4790 */
4791static int cik_cp_compute_resume(struct radeon_device *rdev)
4792{
Alex Deucher963e81f2013-06-26 17:37:11 -04004793 int r, i, idx;
4794 u32 tmp;
4795 bool use_doorbell = true;
4796 u64 hqd_gpu_addr;
4797 u64 mqd_gpu_addr;
4798 u64 eop_gpu_addr;
4799 u64 wb_gpu_addr;
4800 u32 *buf;
4801 struct bonaire_mqd *mqd;
Alex Deucher841cf442012-12-18 21:47:44 -05004802
Alex Deucher841cf442012-12-18 21:47:44 -05004803 r = cik_cp_compute_start(rdev);
4804 if (r)
4805 return r;
Alex Deucher963e81f2013-06-26 17:37:11 -04004806
4807 /* fix up chicken bits */
4808 tmp = RREG32(CP_CPF_DEBUG);
4809 tmp |= (1 << 23);
4810 WREG32(CP_CPF_DEBUG, tmp);
4811
4812 /* init the pipes */
Alex Deucherf61d5b462013-08-06 12:40:16 -04004813 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004814 for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
4815 int me = (i < 4) ? 1 : 2;
4816 int pipe = (i < 4) ? i : (i - 4);
4817
4818 eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE * 2);
4819
4820 cik_srbm_select(rdev, me, pipe, 0, 0);
4821
4822 /* write the EOP addr */
4823 WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
4824 WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
4825
4826 /* set the VMID assigned */
4827 WREG32(CP_HPD_EOP_VMID, 0);
4828
4829 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4830 tmp = RREG32(CP_HPD_EOP_CONTROL);
4831 tmp &= ~EOP_SIZE_MASK;
Daniel Vetterb72a8922013-07-10 14:11:59 +02004832 tmp |= order_base_2(MEC_HPD_SIZE / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004833 WREG32(CP_HPD_EOP_CONTROL, tmp);
4834 }
4835 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004836 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004837
4838 /* init the queues. Just two for now. */
4839 for (i = 0; i < 2; i++) {
4840 if (i == 0)
4841 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4842 else
4843 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4844
4845 if (rdev->ring[idx].mqd_obj == NULL) {
4846 r = radeon_bo_create(rdev,
4847 sizeof(struct bonaire_mqd),
4848 PAGE_SIZE, true,
4849 RADEON_GEM_DOMAIN_GTT, NULL,
4850 &rdev->ring[idx].mqd_obj);
4851 if (r) {
4852 dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
4853 return r;
4854 }
4855 }
4856
4857 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4858 if (unlikely(r != 0)) {
4859 cik_cp_compute_fini(rdev);
4860 return r;
4861 }
4862 r = radeon_bo_pin(rdev->ring[idx].mqd_obj, RADEON_GEM_DOMAIN_GTT,
4863 &mqd_gpu_addr);
4864 if (r) {
4865 dev_warn(rdev->dev, "(%d) pin MQD bo failed\n", r);
4866 cik_cp_compute_fini(rdev);
4867 return r;
4868 }
4869 r = radeon_bo_kmap(rdev->ring[idx].mqd_obj, (void **)&buf);
4870 if (r) {
4871 dev_warn(rdev->dev, "(%d) map MQD bo failed\n", r);
4872 cik_cp_compute_fini(rdev);
4873 return r;
4874 }
4875
Alex Deucher963e81f2013-06-26 17:37:11 -04004876 /* init the mqd struct */
4877 memset(buf, 0, sizeof(struct bonaire_mqd));
4878
4879 mqd = (struct bonaire_mqd *)buf;
4880 mqd->header = 0xC0310800;
4881 mqd->static_thread_mgmt01[0] = 0xffffffff;
4882 mqd->static_thread_mgmt01[1] = 0xffffffff;
4883 mqd->static_thread_mgmt23[0] = 0xffffffff;
4884 mqd->static_thread_mgmt23[1] = 0xffffffff;
4885
Alex Deucherf61d5b462013-08-06 12:40:16 -04004886 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004887 cik_srbm_select(rdev, rdev->ring[idx].me,
4888 rdev->ring[idx].pipe,
4889 rdev->ring[idx].queue, 0);
4890
4891 /* disable wptr polling */
4892 tmp = RREG32(CP_PQ_WPTR_POLL_CNTL);
4893 tmp &= ~WPTR_POLL_EN;
4894 WREG32(CP_PQ_WPTR_POLL_CNTL, tmp);
4895
4896 /* enable doorbell? */
4897 mqd->queue_state.cp_hqd_pq_doorbell_control =
4898 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4899 if (use_doorbell)
4900 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4901 else
4902 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_EN;
4903 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4904 mqd->queue_state.cp_hqd_pq_doorbell_control);
4905
4906 /* disable the queue if it's active */
4907 mqd->queue_state.cp_hqd_dequeue_request = 0;
4908 mqd->queue_state.cp_hqd_pq_rptr = 0;
4909 mqd->queue_state.cp_hqd_pq_wptr= 0;
4910 if (RREG32(CP_HQD_ACTIVE) & 1) {
4911 WREG32(CP_HQD_DEQUEUE_REQUEST, 1);
4912 for (i = 0; i < rdev->usec_timeout; i++) {
4913 if (!(RREG32(CP_HQD_ACTIVE) & 1))
4914 break;
4915 udelay(1);
4916 }
4917 WREG32(CP_HQD_DEQUEUE_REQUEST, mqd->queue_state.cp_hqd_dequeue_request);
4918 WREG32(CP_HQD_PQ_RPTR, mqd->queue_state.cp_hqd_pq_rptr);
4919 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4920 }
4921
4922 /* set the pointer to the MQD */
4923 mqd->queue_state.cp_mqd_base_addr = mqd_gpu_addr & 0xfffffffc;
4924 mqd->queue_state.cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
4925 WREG32(CP_MQD_BASE_ADDR, mqd->queue_state.cp_mqd_base_addr);
4926 WREG32(CP_MQD_BASE_ADDR_HI, mqd->queue_state.cp_mqd_base_addr_hi);
4927 /* set MQD vmid to 0 */
4928 mqd->queue_state.cp_mqd_control = RREG32(CP_MQD_CONTROL);
4929 mqd->queue_state.cp_mqd_control &= ~MQD_VMID_MASK;
4930 WREG32(CP_MQD_CONTROL, mqd->queue_state.cp_mqd_control);
4931
4932 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4933 hqd_gpu_addr = rdev->ring[idx].gpu_addr >> 8;
4934 mqd->queue_state.cp_hqd_pq_base = hqd_gpu_addr;
4935 mqd->queue_state.cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
4936 WREG32(CP_HQD_PQ_BASE, mqd->queue_state.cp_hqd_pq_base);
4937 WREG32(CP_HQD_PQ_BASE_HI, mqd->queue_state.cp_hqd_pq_base_hi);
4938
4939 /* set up the HQD, this is similar to CP_RB0_CNTL */
4940 mqd->queue_state.cp_hqd_pq_control = RREG32(CP_HQD_PQ_CONTROL);
4941 mqd->queue_state.cp_hqd_pq_control &=
4942 ~(QUEUE_SIZE_MASK | RPTR_BLOCK_SIZE_MASK);
4943
4944 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004945 order_base_2(rdev->ring[idx].ring_size / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004946 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004947 (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004948#ifdef __BIG_ENDIAN
4949 mqd->queue_state.cp_hqd_pq_control |= BUF_SWAP_32BIT;
4950#endif
4951 mqd->queue_state.cp_hqd_pq_control &=
4952 ~(UNORD_DISPATCH | ROQ_PQ_IB_FLIP | PQ_VOLATILE);
4953 mqd->queue_state.cp_hqd_pq_control |=
4954 PRIV_STATE | KMD_QUEUE; /* assuming kernel queue control */
4955 WREG32(CP_HQD_PQ_CONTROL, mqd->queue_state.cp_hqd_pq_control);
4956
4957 /* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4958 if (i == 0)
4959 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP1_WPTR_OFFSET;
4960 else
4961 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP2_WPTR_OFFSET;
4962 mqd->queue_state.cp_hqd_pq_wptr_poll_addr = wb_gpu_addr & 0xfffffffc;
4963 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4964 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR, mqd->queue_state.cp_hqd_pq_wptr_poll_addr);
4965 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI,
4966 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi);
4967
4968 /* set the wb address wether it's enabled or not */
4969 if (i == 0)
4970 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET;
4971 else
4972 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET;
4973 mqd->queue_state.cp_hqd_pq_rptr_report_addr = wb_gpu_addr & 0xfffffffc;
4974 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi =
4975 upper_32_bits(wb_gpu_addr) & 0xffff;
4976 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR,
4977 mqd->queue_state.cp_hqd_pq_rptr_report_addr);
4978 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI,
4979 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi);
4980
4981 /* enable the doorbell if requested */
4982 if (use_doorbell) {
4983 mqd->queue_state.cp_hqd_pq_doorbell_control =
4984 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4985 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_OFFSET_MASK;
4986 mqd->queue_state.cp_hqd_pq_doorbell_control |=
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05004987 DOORBELL_OFFSET(rdev->ring[idx].doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04004988 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4989 mqd->queue_state.cp_hqd_pq_doorbell_control &=
4990 ~(DOORBELL_SOURCE | DOORBELL_HIT);
4991
4992 } else {
4993 mqd->queue_state.cp_hqd_pq_doorbell_control = 0;
4994 }
4995 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4996 mqd->queue_state.cp_hqd_pq_doorbell_control);
4997
4998 /* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
4999 rdev->ring[idx].wptr = 0;
5000 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
5001 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
Christian Königff212f22014-02-18 14:52:33 +01005002 mqd->queue_state.cp_hqd_pq_rptr = RREG32(CP_HQD_PQ_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04005003
5004 /* set the vmid for the queue */
5005 mqd->queue_state.cp_hqd_vmid = 0;
5006 WREG32(CP_HQD_VMID, mqd->queue_state.cp_hqd_vmid);
5007
5008 /* activate the queue */
5009 mqd->queue_state.cp_hqd_active = 1;
5010 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
5011
5012 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005013 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04005014
5015 radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
5016 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
5017
5018 rdev->ring[idx].ready = true;
5019 r = radeon_ring_test(rdev, idx, &rdev->ring[idx]);
5020 if (r)
5021 rdev->ring[idx].ready = false;
5022 }
5023
Alex Deucher841cf442012-12-18 21:47:44 -05005024 return 0;
5025}
5026
Alex Deucher841cf442012-12-18 21:47:44 -05005027static void cik_cp_enable(struct radeon_device *rdev, bool enable)
5028{
5029 cik_cp_gfx_enable(rdev, enable);
5030 cik_cp_compute_enable(rdev, enable);
5031}
5032
Alex Deucher841cf442012-12-18 21:47:44 -05005033static int cik_cp_load_microcode(struct radeon_device *rdev)
5034{
5035 int r;
5036
5037 r = cik_cp_gfx_load_microcode(rdev);
5038 if (r)
5039 return r;
5040 r = cik_cp_compute_load_microcode(rdev);
5041 if (r)
5042 return r;
5043
5044 return 0;
5045}
5046
Alex Deucher841cf442012-12-18 21:47:44 -05005047static void cik_cp_fini(struct radeon_device *rdev)
5048{
5049 cik_cp_gfx_fini(rdev);
5050 cik_cp_compute_fini(rdev);
5051}
5052
Alex Deucher841cf442012-12-18 21:47:44 -05005053static int cik_cp_resume(struct radeon_device *rdev)
5054{
5055 int r;
5056
Alex Deucher4214faf2013-09-03 10:17:13 -04005057 cik_enable_gui_idle_interrupt(rdev, false);
5058
Alex Deucher841cf442012-12-18 21:47:44 -05005059 r = cik_cp_load_microcode(rdev);
5060 if (r)
5061 return r;
5062
5063 r = cik_cp_gfx_resume(rdev);
5064 if (r)
5065 return r;
5066 r = cik_cp_compute_resume(rdev);
5067 if (r)
5068 return r;
5069
Alex Deucher4214faf2013-09-03 10:17:13 -04005070 cik_enable_gui_idle_interrupt(rdev, true);
5071
Alex Deucher841cf442012-12-18 21:47:44 -05005072 return 0;
5073}
5074
Alex Deuchercc066712013-04-09 12:59:51 -04005075static void cik_print_gpu_status_regs(struct radeon_device *rdev)
5076{
5077 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
5078 RREG32(GRBM_STATUS));
5079 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
5080 RREG32(GRBM_STATUS2));
5081 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
5082 RREG32(GRBM_STATUS_SE0));
5083 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
5084 RREG32(GRBM_STATUS_SE1));
5085 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
5086 RREG32(GRBM_STATUS_SE2));
5087 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
5088 RREG32(GRBM_STATUS_SE3));
5089 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
5090 RREG32(SRBM_STATUS));
5091 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
5092 RREG32(SRBM_STATUS2));
5093 dev_info(rdev->dev, " SDMA0_STATUS_REG = 0x%08X\n",
5094 RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
5095 dev_info(rdev->dev, " SDMA1_STATUS_REG = 0x%08X\n",
5096 RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
Alex Deucher963e81f2013-06-26 17:37:11 -04005097 dev_info(rdev->dev, " CP_STAT = 0x%08x\n", RREG32(CP_STAT));
5098 dev_info(rdev->dev, " CP_STALLED_STAT1 = 0x%08x\n",
5099 RREG32(CP_STALLED_STAT1));
5100 dev_info(rdev->dev, " CP_STALLED_STAT2 = 0x%08x\n",
5101 RREG32(CP_STALLED_STAT2));
5102 dev_info(rdev->dev, " CP_STALLED_STAT3 = 0x%08x\n",
5103 RREG32(CP_STALLED_STAT3));
5104 dev_info(rdev->dev, " CP_CPF_BUSY_STAT = 0x%08x\n",
5105 RREG32(CP_CPF_BUSY_STAT));
5106 dev_info(rdev->dev, " CP_CPF_STALLED_STAT1 = 0x%08x\n",
5107 RREG32(CP_CPF_STALLED_STAT1));
5108 dev_info(rdev->dev, " CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS));
5109 dev_info(rdev->dev, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT));
5110 dev_info(rdev->dev, " CP_CPC_STALLED_STAT1 = 0x%08x\n",
5111 RREG32(CP_CPC_STALLED_STAT1));
5112 dev_info(rdev->dev, " CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS));
Alex Deuchercc066712013-04-09 12:59:51 -04005113}
5114
Alex Deucher6f2043c2013-04-09 12:43:41 -04005115/**
Alex Deuchercc066712013-04-09 12:59:51 -04005116 * cik_gpu_check_soft_reset - check which blocks are busy
5117 *
5118 * @rdev: radeon_device pointer
5119 *
5120 * Check which blocks are busy and return the relevant reset
5121 * mask to be used by cik_gpu_soft_reset().
5122 * Returns a mask of the blocks to be reset.
5123 */
Christian König2483b4e2013-08-13 11:56:54 +02005124u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
Alex Deuchercc066712013-04-09 12:59:51 -04005125{
5126 u32 reset_mask = 0;
5127 u32 tmp;
5128
5129 /* GRBM_STATUS */
5130 tmp = RREG32(GRBM_STATUS);
5131 if (tmp & (PA_BUSY | SC_BUSY |
5132 BCI_BUSY | SX_BUSY |
5133 TA_BUSY | VGT_BUSY |
5134 DB_BUSY | CB_BUSY |
5135 GDS_BUSY | SPI_BUSY |
5136 IA_BUSY | IA_BUSY_NO_DMA))
5137 reset_mask |= RADEON_RESET_GFX;
5138
5139 if (tmp & (CP_BUSY | CP_COHERENCY_BUSY))
5140 reset_mask |= RADEON_RESET_CP;
5141
5142 /* GRBM_STATUS2 */
5143 tmp = RREG32(GRBM_STATUS2);
5144 if (tmp & RLC_BUSY)
5145 reset_mask |= RADEON_RESET_RLC;
5146
5147 /* SDMA0_STATUS_REG */
5148 tmp = RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET);
5149 if (!(tmp & SDMA_IDLE))
5150 reset_mask |= RADEON_RESET_DMA;
5151
5152 /* SDMA1_STATUS_REG */
5153 tmp = RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
5154 if (!(tmp & SDMA_IDLE))
5155 reset_mask |= RADEON_RESET_DMA1;
5156
5157 /* SRBM_STATUS2 */
5158 tmp = RREG32(SRBM_STATUS2);
5159 if (tmp & SDMA_BUSY)
5160 reset_mask |= RADEON_RESET_DMA;
5161
5162 if (tmp & SDMA1_BUSY)
5163 reset_mask |= RADEON_RESET_DMA1;
5164
5165 /* SRBM_STATUS */
5166 tmp = RREG32(SRBM_STATUS);
5167
5168 if (tmp & IH_BUSY)
5169 reset_mask |= RADEON_RESET_IH;
5170
5171 if (tmp & SEM_BUSY)
5172 reset_mask |= RADEON_RESET_SEM;
5173
5174 if (tmp & GRBM_RQ_PENDING)
5175 reset_mask |= RADEON_RESET_GRBM;
5176
5177 if (tmp & VMC_BUSY)
5178 reset_mask |= RADEON_RESET_VMC;
5179
5180 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
5181 MCC_BUSY | MCD_BUSY))
5182 reset_mask |= RADEON_RESET_MC;
5183
5184 if (evergreen_is_display_hung(rdev))
5185 reset_mask |= RADEON_RESET_DISPLAY;
5186
5187 /* Skip MC reset as it's mostly likely not hung, just busy */
5188 if (reset_mask & RADEON_RESET_MC) {
5189 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
5190 reset_mask &= ~RADEON_RESET_MC;
5191 }
5192
5193 return reset_mask;
5194}
5195
5196/**
5197 * cik_gpu_soft_reset - soft reset GPU
5198 *
5199 * @rdev: radeon_device pointer
5200 * @reset_mask: mask of which blocks to reset
5201 *
5202 * Soft reset the blocks specified in @reset_mask.
5203 */
5204static void cik_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
5205{
5206 struct evergreen_mc_save save;
5207 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5208 u32 tmp;
5209
5210 if (reset_mask == 0)
5211 return;
5212
5213 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
5214
5215 cik_print_gpu_status_regs(rdev);
5216 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
5217 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
5218 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5219 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
5220
Alex Deucherfb2c7f42013-10-02 14:54:44 -04005221 /* disable CG/PG */
5222 cik_fini_pg(rdev);
5223 cik_fini_cg(rdev);
5224
Alex Deuchercc066712013-04-09 12:59:51 -04005225 /* stop the rlc */
5226 cik_rlc_stop(rdev);
5227
5228 /* Disable GFX parsing/prefetching */
5229 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5230
5231 /* Disable MEC parsing/prefetching */
5232 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5233
5234 if (reset_mask & RADEON_RESET_DMA) {
5235 /* sdma0 */
5236 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5237 tmp |= SDMA_HALT;
5238 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5239 }
5240 if (reset_mask & RADEON_RESET_DMA1) {
5241 /* sdma1 */
5242 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5243 tmp |= SDMA_HALT;
5244 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5245 }
5246
5247 evergreen_mc_stop(rdev, &save);
5248 if (evergreen_mc_wait_for_idle(rdev)) {
5249 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5250 }
5251
5252 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP))
5253 grbm_soft_reset = SOFT_RESET_CP | SOFT_RESET_GFX;
5254
5255 if (reset_mask & RADEON_RESET_CP) {
5256 grbm_soft_reset |= SOFT_RESET_CP;
5257
5258 srbm_soft_reset |= SOFT_RESET_GRBM;
5259 }
5260
5261 if (reset_mask & RADEON_RESET_DMA)
5262 srbm_soft_reset |= SOFT_RESET_SDMA;
5263
5264 if (reset_mask & RADEON_RESET_DMA1)
5265 srbm_soft_reset |= SOFT_RESET_SDMA1;
5266
5267 if (reset_mask & RADEON_RESET_DISPLAY)
5268 srbm_soft_reset |= SOFT_RESET_DC;
5269
5270 if (reset_mask & RADEON_RESET_RLC)
5271 grbm_soft_reset |= SOFT_RESET_RLC;
5272
5273 if (reset_mask & RADEON_RESET_SEM)
5274 srbm_soft_reset |= SOFT_RESET_SEM;
5275
5276 if (reset_mask & RADEON_RESET_IH)
5277 srbm_soft_reset |= SOFT_RESET_IH;
5278
5279 if (reset_mask & RADEON_RESET_GRBM)
5280 srbm_soft_reset |= SOFT_RESET_GRBM;
5281
5282 if (reset_mask & RADEON_RESET_VMC)
5283 srbm_soft_reset |= SOFT_RESET_VMC;
5284
5285 if (!(rdev->flags & RADEON_IS_IGP)) {
5286 if (reset_mask & RADEON_RESET_MC)
5287 srbm_soft_reset |= SOFT_RESET_MC;
5288 }
5289
5290 if (grbm_soft_reset) {
5291 tmp = RREG32(GRBM_SOFT_RESET);
5292 tmp |= grbm_soft_reset;
5293 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5294 WREG32(GRBM_SOFT_RESET, tmp);
5295 tmp = RREG32(GRBM_SOFT_RESET);
5296
5297 udelay(50);
5298
5299 tmp &= ~grbm_soft_reset;
5300 WREG32(GRBM_SOFT_RESET, tmp);
5301 tmp = RREG32(GRBM_SOFT_RESET);
5302 }
5303
5304 if (srbm_soft_reset) {
5305 tmp = RREG32(SRBM_SOFT_RESET);
5306 tmp |= srbm_soft_reset;
5307 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5308 WREG32(SRBM_SOFT_RESET, tmp);
5309 tmp = RREG32(SRBM_SOFT_RESET);
5310
5311 udelay(50);
5312
5313 tmp &= ~srbm_soft_reset;
5314 WREG32(SRBM_SOFT_RESET, tmp);
5315 tmp = RREG32(SRBM_SOFT_RESET);
5316 }
5317
5318 /* Wait a little for things to settle down */
5319 udelay(50);
5320
5321 evergreen_mc_resume(rdev, &save);
5322 udelay(50);
5323
5324 cik_print_gpu_status_regs(rdev);
5325}
5326
Alex Deucher0279ed12013-10-02 15:18:14 -04005327struct kv_reset_save_regs {
5328 u32 gmcon_reng_execute;
5329 u32 gmcon_misc;
5330 u32 gmcon_misc3;
5331};
5332
5333static void kv_save_regs_for_reset(struct radeon_device *rdev,
5334 struct kv_reset_save_regs *save)
5335{
5336 save->gmcon_reng_execute = RREG32(GMCON_RENG_EXECUTE);
5337 save->gmcon_misc = RREG32(GMCON_MISC);
5338 save->gmcon_misc3 = RREG32(GMCON_MISC3);
5339
5340 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute & ~RENG_EXECUTE_ON_PWR_UP);
5341 WREG32(GMCON_MISC, save->gmcon_misc & ~(RENG_EXECUTE_ON_REG_UPDATE |
5342 STCTRL_STUTTER_EN));
5343}
5344
5345static void kv_restore_regs_for_reset(struct radeon_device *rdev,
5346 struct kv_reset_save_regs *save)
5347{
5348 int i;
5349
5350 WREG32(GMCON_PGFSM_WRITE, 0);
5351 WREG32(GMCON_PGFSM_CONFIG, 0x200010ff);
5352
5353 for (i = 0; i < 5; i++)
5354 WREG32(GMCON_PGFSM_WRITE, 0);
5355
5356 WREG32(GMCON_PGFSM_WRITE, 0);
5357 WREG32(GMCON_PGFSM_CONFIG, 0x300010ff);
5358
5359 for (i = 0; i < 5; i++)
5360 WREG32(GMCON_PGFSM_WRITE, 0);
5361
5362 WREG32(GMCON_PGFSM_WRITE, 0x210000);
5363 WREG32(GMCON_PGFSM_CONFIG, 0xa00010ff);
5364
5365 for (i = 0; i < 5; i++)
5366 WREG32(GMCON_PGFSM_WRITE, 0);
5367
5368 WREG32(GMCON_PGFSM_WRITE, 0x21003);
5369 WREG32(GMCON_PGFSM_CONFIG, 0xb00010ff);
5370
5371 for (i = 0; i < 5; i++)
5372 WREG32(GMCON_PGFSM_WRITE, 0);
5373
5374 WREG32(GMCON_PGFSM_WRITE, 0x2b00);
5375 WREG32(GMCON_PGFSM_CONFIG, 0xc00010ff);
5376
5377 for (i = 0; i < 5; i++)
5378 WREG32(GMCON_PGFSM_WRITE, 0);
5379
5380 WREG32(GMCON_PGFSM_WRITE, 0);
5381 WREG32(GMCON_PGFSM_CONFIG, 0xd00010ff);
5382
5383 for (i = 0; i < 5; i++)
5384 WREG32(GMCON_PGFSM_WRITE, 0);
5385
5386 WREG32(GMCON_PGFSM_WRITE, 0x420000);
5387 WREG32(GMCON_PGFSM_CONFIG, 0x100010ff);
5388
5389 for (i = 0; i < 5; i++)
5390 WREG32(GMCON_PGFSM_WRITE, 0);
5391
5392 WREG32(GMCON_PGFSM_WRITE, 0x120202);
5393 WREG32(GMCON_PGFSM_CONFIG, 0x500010ff);
5394
5395 for (i = 0; i < 5; i++)
5396 WREG32(GMCON_PGFSM_WRITE, 0);
5397
5398 WREG32(GMCON_PGFSM_WRITE, 0x3e3e36);
5399 WREG32(GMCON_PGFSM_CONFIG, 0x600010ff);
5400
5401 for (i = 0; i < 5; i++)
5402 WREG32(GMCON_PGFSM_WRITE, 0);
5403
5404 WREG32(GMCON_PGFSM_WRITE, 0x373f3e);
5405 WREG32(GMCON_PGFSM_CONFIG, 0x700010ff);
5406
5407 for (i = 0; i < 5; i++)
5408 WREG32(GMCON_PGFSM_WRITE, 0);
5409
5410 WREG32(GMCON_PGFSM_WRITE, 0x3e1332);
5411 WREG32(GMCON_PGFSM_CONFIG, 0xe00010ff);
5412
5413 WREG32(GMCON_MISC3, save->gmcon_misc3);
5414 WREG32(GMCON_MISC, save->gmcon_misc);
5415 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute);
5416}
5417
5418static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
5419{
5420 struct evergreen_mc_save save;
5421 struct kv_reset_save_regs kv_save = { 0 };
5422 u32 tmp, i;
5423
5424 dev_info(rdev->dev, "GPU pci config reset\n");
5425
5426 /* disable dpm? */
5427
5428 /* disable cg/pg */
5429 cik_fini_pg(rdev);
5430 cik_fini_cg(rdev);
5431
5432 /* Disable GFX parsing/prefetching */
5433 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5434
5435 /* Disable MEC parsing/prefetching */
5436 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5437
5438 /* sdma0 */
5439 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5440 tmp |= SDMA_HALT;
5441 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5442 /* sdma1 */
5443 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5444 tmp |= SDMA_HALT;
5445 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5446 /* XXX other engines? */
5447
5448 /* halt the rlc, disable cp internal ints */
5449 cik_rlc_stop(rdev);
5450
5451 udelay(50);
5452
5453 /* disable mem access */
5454 evergreen_mc_stop(rdev, &save);
5455 if (evergreen_mc_wait_for_idle(rdev)) {
5456 dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
5457 }
5458
5459 if (rdev->flags & RADEON_IS_IGP)
5460 kv_save_regs_for_reset(rdev, &kv_save);
5461
5462 /* disable BM */
5463 pci_clear_master(rdev->pdev);
5464 /* reset */
5465 radeon_pci_config_reset(rdev);
5466
5467 udelay(100);
5468
5469 /* wait for asic to come out of reset */
5470 for (i = 0; i < rdev->usec_timeout; i++) {
5471 if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
5472 break;
5473 udelay(1);
5474 }
5475
5476 /* does asic init need to be run first??? */
5477 if (rdev->flags & RADEON_IS_IGP)
5478 kv_restore_regs_for_reset(rdev, &kv_save);
5479}
5480
Alex Deuchercc066712013-04-09 12:59:51 -04005481/**
5482 * cik_asic_reset - soft reset GPU
5483 *
5484 * @rdev: radeon_device pointer
5485 *
5486 * Look up which blocks are hung and attempt
5487 * to reset them.
5488 * Returns 0 for success.
5489 */
5490int cik_asic_reset(struct radeon_device *rdev)
5491{
5492 u32 reset_mask;
5493
5494 reset_mask = cik_gpu_check_soft_reset(rdev);
5495
5496 if (reset_mask)
5497 r600_set_bios_scratch_engine_hung(rdev, true);
5498
Alex Deucher0279ed12013-10-02 15:18:14 -04005499 /* try soft reset */
Alex Deuchercc066712013-04-09 12:59:51 -04005500 cik_gpu_soft_reset(rdev, reset_mask);
5501
5502 reset_mask = cik_gpu_check_soft_reset(rdev);
5503
Alex Deucher0279ed12013-10-02 15:18:14 -04005504 /* try pci config reset */
5505 if (reset_mask && radeon_hard_reset)
5506 cik_gpu_pci_config_reset(rdev);
5507
5508 reset_mask = cik_gpu_check_soft_reset(rdev);
5509
Alex Deuchercc066712013-04-09 12:59:51 -04005510 if (!reset_mask)
5511 r600_set_bios_scratch_engine_hung(rdev, false);
5512
5513 return 0;
5514}
5515
5516/**
5517 * cik_gfx_is_lockup - check if the 3D engine is locked up
Alex Deucher6f2043c2013-04-09 12:43:41 -04005518 *
5519 * @rdev: radeon_device pointer
5520 * @ring: radeon_ring structure holding ring information
5521 *
5522 * Check if the 3D engine is locked up (CIK).
5523 * Returns true if the engine is locked, false if not.
5524 */
Alex Deuchercc066712013-04-09 12:59:51 -04005525bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
Alex Deucher6f2043c2013-04-09 12:43:41 -04005526{
Alex Deuchercc066712013-04-09 12:59:51 -04005527 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005528
Alex Deuchercc066712013-04-09 12:59:51 -04005529 if (!(reset_mask & (RADEON_RESET_GFX |
5530 RADEON_RESET_COMPUTE |
5531 RADEON_RESET_CP))) {
Christian Königff212f22014-02-18 14:52:33 +01005532 radeon_ring_lockup_update(rdev, ring);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005533 return false;
5534 }
Alex Deucher6f2043c2013-04-09 12:43:41 -04005535 return radeon_ring_test_lockup(rdev, ring);
5536}
5537
Alex Deucher1c491652013-04-09 12:45:26 -04005538/* MC */
5539/**
5540 * cik_mc_program - program the GPU memory controller
5541 *
5542 * @rdev: radeon_device pointer
5543 *
5544 * Set the location of vram, gart, and AGP in the GPU's
5545 * physical address space (CIK).
5546 */
5547static void cik_mc_program(struct radeon_device *rdev)
5548{
5549 struct evergreen_mc_save save;
5550 u32 tmp;
5551 int i, j;
5552
5553 /* Initialize HDP */
5554 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
5555 WREG32((0x2c14 + j), 0x00000000);
5556 WREG32((0x2c18 + j), 0x00000000);
5557 WREG32((0x2c1c + j), 0x00000000);
5558 WREG32((0x2c20 + j), 0x00000000);
5559 WREG32((0x2c24 + j), 0x00000000);
5560 }
5561 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
5562
5563 evergreen_mc_stop(rdev, &save);
5564 if (radeon_mc_wait_for_idle(rdev)) {
5565 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5566 }
5567 /* Lockout access through VGA aperture*/
5568 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
5569 /* Update configuration */
5570 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
5571 rdev->mc.vram_start >> 12);
5572 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
5573 rdev->mc.vram_end >> 12);
5574 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
5575 rdev->vram_scratch.gpu_addr >> 12);
5576 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
5577 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
5578 WREG32(MC_VM_FB_LOCATION, tmp);
5579 /* XXX double check these! */
5580 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
5581 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
5582 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
5583 WREG32(MC_VM_AGP_BASE, 0);
5584 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
5585 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
5586 if (radeon_mc_wait_for_idle(rdev)) {
5587 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5588 }
5589 evergreen_mc_resume(rdev, &save);
5590 /* we need to own VRAM, so turn off the VGA renderer here
5591 * to stop it overwriting our objects */
5592 rv515_vga_render_disable(rdev);
5593}
5594
5595/**
5596 * cik_mc_init - initialize the memory controller driver params
5597 *
5598 * @rdev: radeon_device pointer
5599 *
5600 * Look up the amount of vram, vram width, and decide how to place
5601 * vram and gart within the GPU's physical address space (CIK).
5602 * Returns 0 for success.
5603 */
5604static int cik_mc_init(struct radeon_device *rdev)
5605{
5606 u32 tmp;
5607 int chansize, numchan;
5608
5609 /* Get VRAM informations */
5610 rdev->mc.vram_is_ddr = true;
5611 tmp = RREG32(MC_ARB_RAMCFG);
5612 if (tmp & CHANSIZE_MASK) {
5613 chansize = 64;
5614 } else {
5615 chansize = 32;
5616 }
5617 tmp = RREG32(MC_SHARED_CHMAP);
5618 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
5619 case 0:
5620 default:
5621 numchan = 1;
5622 break;
5623 case 1:
5624 numchan = 2;
5625 break;
5626 case 2:
5627 numchan = 4;
5628 break;
5629 case 3:
5630 numchan = 8;
5631 break;
5632 case 4:
5633 numchan = 3;
5634 break;
5635 case 5:
5636 numchan = 6;
5637 break;
5638 case 6:
5639 numchan = 10;
5640 break;
5641 case 7:
5642 numchan = 12;
5643 break;
5644 case 8:
5645 numchan = 16;
5646 break;
5647 }
5648 rdev->mc.vram_width = numchan * chansize;
5649 /* Could aper size report 0 ? */
5650 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
5651 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
5652 /* size in MB on si */
Alex Deucher13c5bfd2013-09-24 10:56:55 -04005653 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
5654 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
Alex Deucher1c491652013-04-09 12:45:26 -04005655 rdev->mc.visible_vram_size = rdev->mc.aper_size;
5656 si_vram_gtt_location(rdev, &rdev->mc);
5657 radeon_update_bandwidth_info(rdev);
5658
5659 return 0;
5660}
5661
5662/*
5663 * GART
5664 * VMID 0 is the physical GPU addresses as used by the kernel.
5665 * VMIDs 1-15 are used for userspace clients and are handled
5666 * by the radeon vm/hsa code.
5667 */
5668/**
5669 * cik_pcie_gart_tlb_flush - gart tlb flush callback
5670 *
5671 * @rdev: radeon_device pointer
5672 *
5673 * Flush the TLB for the VMID 0 page table (CIK).
5674 */
5675void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
5676{
5677 /* flush hdp cache */
5678 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
5679
5680 /* bits 0-15 are the VM contexts0-15 */
5681 WREG32(VM_INVALIDATE_REQUEST, 0x1);
5682}
5683
5684/**
5685 * cik_pcie_gart_enable - gart enable
5686 *
5687 * @rdev: radeon_device pointer
5688 *
5689 * This sets up the TLBs, programs the page tables for VMID0,
5690 * sets up the hw for VMIDs 1-15 which are allocated on
5691 * demand, and sets up the global locations for the LDS, GDS,
5692 * and GPUVM for FSA64 clients (CIK).
5693 * Returns 0 for success, errors for failure.
5694 */
5695static int cik_pcie_gart_enable(struct radeon_device *rdev)
5696{
5697 int r, i;
5698
5699 if (rdev->gart.robj == NULL) {
5700 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
5701 return -EINVAL;
5702 }
5703 r = radeon_gart_table_vram_pin(rdev);
5704 if (r)
5705 return r;
5706 radeon_gart_restore(rdev);
5707 /* Setup TLB control */
5708 WREG32(MC_VM_MX_L1_TLB_CNTL,
5709 (0xA << 7) |
5710 ENABLE_L1_TLB |
Christian Königec3dbbc2014-05-10 12:17:55 +02005711 ENABLE_L1_FRAGMENT_PROCESSING |
Alex Deucher1c491652013-04-09 12:45:26 -04005712 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5713 ENABLE_ADVANCED_DRIVER_MODEL |
5714 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5715 /* Setup L2 cache */
5716 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
5717 ENABLE_L2_FRAGMENT_PROCESSING |
5718 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5719 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5720 EFFECTIVE_L2_QUEUE_SIZE(7) |
5721 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5722 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
5723 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
Christian Königec3dbbc2014-05-10 12:17:55 +02005724 BANK_SELECT(4) |
5725 L2_CACHE_BIGK_FRAGMENT_SIZE(4));
Alex Deucher1c491652013-04-09 12:45:26 -04005726 /* setup context0 */
5727 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
5728 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
5729 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
5730 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
5731 (u32)(rdev->dummy_page.addr >> 12));
5732 WREG32(VM_CONTEXT0_CNTL2, 0);
5733 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
5734 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
5735
5736 WREG32(0x15D4, 0);
5737 WREG32(0x15D8, 0);
5738 WREG32(0x15DC, 0);
5739
5740 /* empty context1-15 */
5741 /* FIXME start with 4G, once using 2 level pt switch to full
5742 * vm size space
5743 */
5744 /* set vm size, must be a multiple of 4 */
5745 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
5746 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
5747 for (i = 1; i < 16; i++) {
5748 if (i < 8)
5749 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
5750 rdev->gart.table_addr >> 12);
5751 else
5752 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
5753 rdev->gart.table_addr >> 12);
5754 }
5755
5756 /* enable context1-15 */
5757 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
5758 (u32)(rdev->dummy_page.addr >> 12));
Alex Deuchera00024b2012-09-18 16:06:01 -04005759 WREG32(VM_CONTEXT1_CNTL2, 4);
Alex Deucher1c491652013-04-09 12:45:26 -04005760 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
Christian König4510fb92014-06-05 23:56:50 -04005761 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
Alex Deuchera00024b2012-09-18 16:06:01 -04005762 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5763 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5764 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5765 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5766 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
5767 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
5768 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
5769 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
5770 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
5771 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
5772 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5773 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
Alex Deucher1c491652013-04-09 12:45:26 -04005774
Alex Deucher1c491652013-04-09 12:45:26 -04005775 if (rdev->family == CHIP_KAVERI) {
5776 u32 tmp = RREG32(CHUB_CONTROL);
5777 tmp &= ~BYPASS_VM;
5778 WREG32(CHUB_CONTROL, tmp);
5779 }
5780
5781 /* XXX SH_MEM regs */
5782 /* where to put LDS, scratch, GPUVM in FSA64 space */
Alex Deucherf61d5b462013-08-06 12:40:16 -04005783 mutex_lock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005784 for (i = 0; i < 16; i++) {
Alex Deucherb556b122013-01-29 10:44:22 -05005785 cik_srbm_select(rdev, 0, 0, 0, i);
Alex Deucher21a93e12013-04-09 12:47:11 -04005786 /* CP and shaders */
Alex Deucher1c491652013-04-09 12:45:26 -04005787 WREG32(SH_MEM_CONFIG, 0);
5788 WREG32(SH_MEM_APE1_BASE, 1);
5789 WREG32(SH_MEM_APE1_LIMIT, 0);
5790 WREG32(SH_MEM_BASES, 0);
Alex Deucher21a93e12013-04-09 12:47:11 -04005791 /* SDMA GFX */
5792 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA0_REGISTER_OFFSET, 0);
5793 WREG32(SDMA0_GFX_APE1_CNTL + SDMA0_REGISTER_OFFSET, 0);
5794 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA1_REGISTER_OFFSET, 0);
5795 WREG32(SDMA0_GFX_APE1_CNTL + SDMA1_REGISTER_OFFSET, 0);
5796 /* XXX SDMA RLC - todo */
Alex Deucher1c491652013-04-09 12:45:26 -04005797 }
Alex Deucherb556b122013-01-29 10:44:22 -05005798 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005799 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005800
5801 cik_pcie_gart_tlb_flush(rdev);
5802 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
5803 (unsigned)(rdev->mc.gtt_size >> 20),
5804 (unsigned long long)rdev->gart.table_addr);
5805 rdev->gart.ready = true;
5806 return 0;
5807}
5808
5809/**
5810 * cik_pcie_gart_disable - gart disable
5811 *
5812 * @rdev: radeon_device pointer
5813 *
5814 * This disables all VM page table (CIK).
5815 */
5816static void cik_pcie_gart_disable(struct radeon_device *rdev)
5817{
5818 /* Disable all tables */
5819 WREG32(VM_CONTEXT0_CNTL, 0);
5820 WREG32(VM_CONTEXT1_CNTL, 0);
5821 /* Setup TLB control */
5822 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5823 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5824 /* Setup L2 cache */
5825 WREG32(VM_L2_CNTL,
5826 ENABLE_L2_FRAGMENT_PROCESSING |
5827 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5828 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5829 EFFECTIVE_L2_QUEUE_SIZE(7) |
5830 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5831 WREG32(VM_L2_CNTL2, 0);
5832 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
5833 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
5834 radeon_gart_table_vram_unpin(rdev);
5835}
5836
5837/**
5838 * cik_pcie_gart_fini - vm fini callback
5839 *
5840 * @rdev: radeon_device pointer
5841 *
5842 * Tears down the driver GART/VM setup (CIK).
5843 */
5844static void cik_pcie_gart_fini(struct radeon_device *rdev)
5845{
5846 cik_pcie_gart_disable(rdev);
5847 radeon_gart_table_vram_free(rdev);
5848 radeon_gart_fini(rdev);
5849}
5850
5851/* vm parser */
5852/**
5853 * cik_ib_parse - vm ib_parse callback
5854 *
5855 * @rdev: radeon_device pointer
5856 * @ib: indirect buffer pointer
5857 *
5858 * CIK uses hw IB checking so this is a nop (CIK).
5859 */
5860int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
5861{
5862 return 0;
5863}
5864
5865/*
5866 * vm
5867 * VMID 0 is the physical GPU addresses as used by the kernel.
5868 * VMIDs 1-15 are used for userspace clients and are handled
5869 * by the radeon vm/hsa code.
5870 */
5871/**
5872 * cik_vm_init - cik vm init callback
5873 *
5874 * @rdev: radeon_device pointer
5875 *
5876 * Inits cik specific vm parameters (number of VMs, base of vram for
5877 * VMIDs 1-15) (CIK).
5878 * Returns 0 for success.
5879 */
5880int cik_vm_init(struct radeon_device *rdev)
5881{
5882 /* number of VMs */
5883 rdev->vm_manager.nvm = 16;
5884 /* base offset of vram pages */
5885 if (rdev->flags & RADEON_IS_IGP) {
5886 u64 tmp = RREG32(MC_VM_FB_OFFSET);
5887 tmp <<= 22;
5888 rdev->vm_manager.vram_base_offset = tmp;
5889 } else
5890 rdev->vm_manager.vram_base_offset = 0;
5891
5892 return 0;
5893}
5894
5895/**
5896 * cik_vm_fini - cik vm fini callback
5897 *
5898 * @rdev: radeon_device pointer
5899 *
5900 * Tear down any asic specific VM setup (CIK).
5901 */
5902void cik_vm_fini(struct radeon_device *rdev)
5903{
5904}
5905
Alex Deucherf96ab482012-08-31 10:37:47 -04005906/**
Alex Deucher3ec7d112013-06-14 10:42:22 -04005907 * cik_vm_decode_fault - print human readable fault info
5908 *
5909 * @rdev: radeon_device pointer
5910 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
5911 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
5912 *
5913 * Print human readable fault information (CIK).
5914 */
5915static void cik_vm_decode_fault(struct radeon_device *rdev,
5916 u32 status, u32 addr, u32 mc_client)
5917{
Alex Deucher939c0d32013-09-30 18:03:06 -04005918 u32 mc_id;
Alex Deucher3ec7d112013-06-14 10:42:22 -04005919 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
5920 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005921 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
5922 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
Alex Deucher3ec7d112013-06-14 10:42:22 -04005923
Alex Deucher939c0d32013-09-30 18:03:06 -04005924 if (rdev->family == CHIP_HAWAII)
5925 mc_id = (status & HAWAII_MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5926 else
5927 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5928
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005929 printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04005930 protections, vmid, addr,
5931 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005932 block, mc_client, mc_id);
Alex Deucher3ec7d112013-06-14 10:42:22 -04005933}
5934
5935/**
Alex Deucherf96ab482012-08-31 10:37:47 -04005936 * cik_vm_flush - cik vm flush using the CP
5937 *
5938 * @rdev: radeon_device pointer
5939 *
5940 * Update the page table base and flush the VM TLB
5941 * using the CP (CIK).
5942 */
5943void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
5944{
5945 struct radeon_ring *ring = &rdev->ring[ridx];
5946
5947 if (vm == NULL)
5948 return;
5949
5950 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5951 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5952 WRITE_DATA_DST_SEL(0)));
5953 if (vm->id < 8) {
5954 radeon_ring_write(ring,
5955 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
5956 } else {
5957 radeon_ring_write(ring,
5958 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
5959 }
5960 radeon_ring_write(ring, 0);
5961 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
5962
5963 /* update SH_MEM_* regs */
5964 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5965 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5966 WRITE_DATA_DST_SEL(0)));
5967 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
5968 radeon_ring_write(ring, 0);
5969 radeon_ring_write(ring, VMID(vm->id));
5970
5971 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
5972 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5973 WRITE_DATA_DST_SEL(0)));
5974 radeon_ring_write(ring, SH_MEM_BASES >> 2);
5975 radeon_ring_write(ring, 0);
5976
5977 radeon_ring_write(ring, 0); /* SH_MEM_BASES */
5978 radeon_ring_write(ring, 0); /* SH_MEM_CONFIG */
5979 radeon_ring_write(ring, 1); /* SH_MEM_APE1_BASE */
5980 radeon_ring_write(ring, 0); /* SH_MEM_APE1_LIMIT */
5981
5982 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5983 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5984 WRITE_DATA_DST_SEL(0)));
5985 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
5986 radeon_ring_write(ring, 0);
5987 radeon_ring_write(ring, VMID(0));
5988
5989 /* HDP flush */
Alex Deucher780f5dd2014-01-09 16:18:11 -05005990 cik_hdp_flush_cp_ring_emit(rdev, ridx);
Alex Deucherf96ab482012-08-31 10:37:47 -04005991
5992 /* bits 0-15 are the VM contexts0-15 */
5993 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5994 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5995 WRITE_DATA_DST_SEL(0)));
5996 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5997 radeon_ring_write(ring, 0);
5998 radeon_ring_write(ring, 1 << vm->id);
5999
Alex Deucherb07fdd32013-04-11 09:36:17 -04006000 /* compute doesn't have PFP */
6001 if (ridx == RADEON_RING_TYPE_GFX_INDEX) {
6002 /* sync PFP to ME, otherwise we might get invalid PFP reads */
6003 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6004 radeon_ring_write(ring, 0x0);
6005 }
Alex Deucherf96ab482012-08-31 10:37:47 -04006006}
6007
Alex Deucherf6796ca2012-11-09 10:44:08 -05006008/*
6009 * RLC
6010 * The RLC is a multi-purpose microengine that handles a
6011 * variety of functions, the most important of which is
6012 * the interrupt controller.
6013 */
Alex Deucher866d83d2013-04-15 17:13:29 -04006014static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
6015 bool enable)
Alex Deucherf6796ca2012-11-09 10:44:08 -05006016{
Alex Deucher866d83d2013-04-15 17:13:29 -04006017 u32 tmp = RREG32(CP_INT_CNTL_RING0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006018
Alex Deucher866d83d2013-04-15 17:13:29 -04006019 if (enable)
6020 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6021 else
6022 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006023 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher866d83d2013-04-15 17:13:29 -04006024}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006025
Alex Deucher866d83d2013-04-15 17:13:29 -04006026static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
6027{
6028 u32 tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006029
Alex Deucher866d83d2013-04-15 17:13:29 -04006030 tmp = RREG32(RLC_LB_CNTL);
6031 if (enable)
6032 tmp |= LOAD_BALANCE_ENABLE;
6033 else
6034 tmp &= ~LOAD_BALANCE_ENABLE;
6035 WREG32(RLC_LB_CNTL, tmp);
6036}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006037
Alex Deucher866d83d2013-04-15 17:13:29 -04006038static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
6039{
6040 u32 i, j, k;
6041 u32 mask;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006042
6043 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6044 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6045 cik_select_se_sh(rdev, i, j);
6046 for (k = 0; k < rdev->usec_timeout; k++) {
6047 if (RREG32(RLC_SERDES_CU_MASTER_BUSY) == 0)
6048 break;
6049 udelay(1);
6050 }
6051 }
6052 }
6053 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6054
6055 mask = SE_MASTER_BUSY_MASK | GC_MASTER_BUSY | TC0_MASTER_BUSY | TC1_MASTER_BUSY;
6056 for (k = 0; k < rdev->usec_timeout; k++) {
6057 if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
6058 break;
6059 udelay(1);
6060 }
6061}
6062
Alex Deucher22c775c2013-07-23 09:41:05 -04006063static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
6064{
6065 u32 tmp;
6066
6067 tmp = RREG32(RLC_CNTL);
6068 if (tmp != rlc)
6069 WREG32(RLC_CNTL, rlc);
6070}
6071
6072static u32 cik_halt_rlc(struct radeon_device *rdev)
6073{
6074 u32 data, orig;
6075
6076 orig = data = RREG32(RLC_CNTL);
6077
6078 if (data & RLC_ENABLE) {
6079 u32 i;
6080
6081 data &= ~RLC_ENABLE;
6082 WREG32(RLC_CNTL, data);
6083
6084 for (i = 0; i < rdev->usec_timeout; i++) {
6085 if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
6086 break;
6087 udelay(1);
6088 }
6089
6090 cik_wait_for_rlc_serdes(rdev);
6091 }
6092
6093 return orig;
6094}
6095
Alex Deuchera412fce2013-04-22 20:23:31 -04006096void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
6097{
6098 u32 tmp, i, mask;
6099
6100 tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
6101 WREG32(RLC_GPR_REG2, tmp);
6102
6103 mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
6104 for (i = 0; i < rdev->usec_timeout; i++) {
6105 if ((RREG32(RLC_GPM_STAT) & mask) == mask)
6106 break;
6107 udelay(1);
6108 }
6109
6110 for (i = 0; i < rdev->usec_timeout; i++) {
6111 if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
6112 break;
6113 udelay(1);
6114 }
6115}
6116
6117void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
6118{
6119 u32 tmp;
6120
6121 tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
6122 WREG32(RLC_GPR_REG2, tmp);
6123}
6124
Alex Deucherf6796ca2012-11-09 10:44:08 -05006125/**
Alex Deucher866d83d2013-04-15 17:13:29 -04006126 * cik_rlc_stop - stop the RLC ME
6127 *
6128 * @rdev: radeon_device pointer
6129 *
6130 * Halt the RLC ME (MicroEngine) (CIK).
6131 */
6132static void cik_rlc_stop(struct radeon_device *rdev)
6133{
Alex Deucher22c775c2013-07-23 09:41:05 -04006134 WREG32(RLC_CNTL, 0);
Alex Deucher866d83d2013-04-15 17:13:29 -04006135
6136 cik_enable_gui_idle_interrupt(rdev, false);
6137
Alex Deucher866d83d2013-04-15 17:13:29 -04006138 cik_wait_for_rlc_serdes(rdev);
6139}
6140
Alex Deucherf6796ca2012-11-09 10:44:08 -05006141/**
6142 * cik_rlc_start - start the RLC ME
6143 *
6144 * @rdev: radeon_device pointer
6145 *
6146 * Unhalt the RLC ME (MicroEngine) (CIK).
6147 */
6148static void cik_rlc_start(struct radeon_device *rdev)
6149{
Alex Deucherf6796ca2012-11-09 10:44:08 -05006150 WREG32(RLC_CNTL, RLC_ENABLE);
6151
Alex Deucher866d83d2013-04-15 17:13:29 -04006152 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006153
6154 udelay(50);
6155}
6156
6157/**
6158 * cik_rlc_resume - setup the RLC hw
6159 *
6160 * @rdev: radeon_device pointer
6161 *
6162 * Initialize the RLC registers, load the ucode,
6163 * and start the RLC (CIK).
6164 * Returns 0 for success, -EINVAL if the ucode is not available.
6165 */
6166static int cik_rlc_resume(struct radeon_device *rdev)
6167{
Alex Deucher22c775c2013-07-23 09:41:05 -04006168 u32 i, size, tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006169
6170 if (!rdev->rlc_fw)
6171 return -EINVAL;
6172
Alex Deucherf6796ca2012-11-09 10:44:08 -05006173 cik_rlc_stop(rdev);
6174
Alex Deucher22c775c2013-07-23 09:41:05 -04006175 /* disable CG */
6176 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
6177 WREG32(RLC_CGCG_CGLS_CTRL, tmp);
6178
Alex Deucher866d83d2013-04-15 17:13:29 -04006179 si_rlc_reset(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006180
Alex Deucher22c775c2013-07-23 09:41:05 -04006181 cik_init_pg(rdev);
6182
6183 cik_init_cg(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006184
6185 WREG32(RLC_LB_CNTR_INIT, 0);
6186 WREG32(RLC_LB_CNTR_MAX, 0x00008000);
6187
6188 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6189 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
6190 WREG32(RLC_LB_PARAMS, 0x00600408);
6191 WREG32(RLC_LB_CNTL, 0x80000004);
6192
6193 WREG32(RLC_MC_CNTL, 0);
6194 WREG32(RLC_UCODE_CNTL, 0);
6195
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006196 if (rdev->new_fw) {
6197 const struct rlc_firmware_header_v1_0 *hdr =
6198 (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
6199 const __le32 *fw_data = (const __le32 *)
6200 (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6201
6202 radeon_ucode_print_rlc_hdr(&hdr->header);
6203
6204 size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006205 WREG32(RLC_GPM_UCODE_ADDR, 0);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006206 for (i = 0; i < size; i++)
6207 WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
6208 WREG32(RLC_GPM_UCODE_ADDR, 0);
6209 } else {
6210 const __be32 *fw_data;
6211
6212 switch (rdev->family) {
6213 case CHIP_BONAIRE:
6214 case CHIP_HAWAII:
6215 default:
6216 size = BONAIRE_RLC_UCODE_SIZE;
6217 break;
6218 case CHIP_KAVERI:
6219 size = KV_RLC_UCODE_SIZE;
6220 break;
6221 case CHIP_KABINI:
6222 size = KB_RLC_UCODE_SIZE;
6223 break;
6224 case CHIP_MULLINS:
6225 size = ML_RLC_UCODE_SIZE;
6226 break;
6227 }
6228
6229 fw_data = (const __be32 *)rdev->rlc_fw->data;
6230 WREG32(RLC_GPM_UCODE_ADDR, 0);
6231 for (i = 0; i < size; i++)
6232 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
6233 WREG32(RLC_GPM_UCODE_ADDR, 0);
6234 }
Alex Deucherf6796ca2012-11-09 10:44:08 -05006235
Alex Deucher866d83d2013-04-15 17:13:29 -04006236 /* XXX - find out what chips support lbpw */
6237 cik_enable_lbpw(rdev, false);
6238
Alex Deucher22c775c2013-07-23 09:41:05 -04006239 if (rdev->family == CHIP_BONAIRE)
6240 WREG32(RLC_DRIVER_DMA_STATUS, 0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006241
6242 cik_rlc_start(rdev);
6243
6244 return 0;
6245}
Alex Deuchera59781b2012-11-09 10:45:57 -05006246
Alex Deucher22c775c2013-07-23 09:41:05 -04006247static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
6248{
6249 u32 data, orig, tmp, tmp2;
6250
6251 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
6252
Alex Deucher473359b2013-08-09 11:18:39 -04006253 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006254 cik_enable_gui_idle_interrupt(rdev, true);
6255
Alex Deucher22c775c2013-07-23 09:41:05 -04006256 tmp = cik_halt_rlc(rdev);
6257
6258 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6259 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6260 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6261 tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
6262 WREG32(RLC_SERDES_WR_CTRL, tmp2);
6263
6264 cik_update_rlc(rdev, tmp);
6265
6266 data |= CGCG_EN | CGLS_EN;
6267 } else {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006268 cik_enable_gui_idle_interrupt(rdev, false);
6269
Alex Deucher22c775c2013-07-23 09:41:05 -04006270 RREG32(CB_CGTT_SCLK_CTRL);
6271 RREG32(CB_CGTT_SCLK_CTRL);
6272 RREG32(CB_CGTT_SCLK_CTRL);
6273 RREG32(CB_CGTT_SCLK_CTRL);
6274
6275 data &= ~(CGCG_EN | CGLS_EN);
6276 }
6277
6278 if (orig != data)
6279 WREG32(RLC_CGCG_CGLS_CTRL, data);
6280
6281}
6282
6283static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
6284{
6285 u32 data, orig, tmp = 0;
6286
Alex Deucher473359b2013-08-09 11:18:39 -04006287 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
6288 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
6289 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
6290 orig = data = RREG32(CP_MEM_SLP_CNTL);
6291 data |= CP_MEM_LS_EN;
6292 if (orig != data)
6293 WREG32(CP_MEM_SLP_CNTL, data);
6294 }
6295 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006296
6297 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6298 data &= 0xfffffffd;
6299 if (orig != data)
6300 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6301
6302 tmp = cik_halt_rlc(rdev);
6303
6304 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6305 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6306 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6307 data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
6308 WREG32(RLC_SERDES_WR_CTRL, data);
6309
6310 cik_update_rlc(rdev, tmp);
6311
Alex Deucher473359b2013-08-09 11:18:39 -04006312 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
6313 orig = data = RREG32(CGTS_SM_CTRL_REG);
6314 data &= ~SM_MODE_MASK;
6315 data |= SM_MODE(0x2);
6316 data |= SM_MODE_ENABLE;
6317 data &= ~CGTS_OVERRIDE;
6318 if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
6319 (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
6320 data &= ~CGTS_LS_OVERRIDE;
6321 data &= ~ON_MONITOR_ADD_MASK;
6322 data |= ON_MONITOR_ADD_EN;
6323 data |= ON_MONITOR_ADD(0x96);
6324 if (orig != data)
6325 WREG32(CGTS_SM_CTRL_REG, data);
6326 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006327 } else {
6328 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6329 data |= 0x00000002;
6330 if (orig != data)
6331 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6332
6333 data = RREG32(RLC_MEM_SLP_CNTL);
6334 if (data & RLC_MEM_LS_EN) {
6335 data &= ~RLC_MEM_LS_EN;
6336 WREG32(RLC_MEM_SLP_CNTL, data);
6337 }
6338
6339 data = RREG32(CP_MEM_SLP_CNTL);
6340 if (data & CP_MEM_LS_EN) {
6341 data &= ~CP_MEM_LS_EN;
6342 WREG32(CP_MEM_SLP_CNTL, data);
6343 }
6344
6345 orig = data = RREG32(CGTS_SM_CTRL_REG);
6346 data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
6347 if (orig != data)
6348 WREG32(CGTS_SM_CTRL_REG, data);
6349
6350 tmp = cik_halt_rlc(rdev);
6351
6352 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6353 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6354 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6355 data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
6356 WREG32(RLC_SERDES_WR_CTRL, data);
6357
6358 cik_update_rlc(rdev, tmp);
6359 }
6360}
6361
6362static const u32 mc_cg_registers[] =
6363{
6364 MC_HUB_MISC_HUB_CG,
6365 MC_HUB_MISC_SIP_CG,
6366 MC_HUB_MISC_VM_CG,
6367 MC_XPB_CLK_GAT,
6368 ATC_MISC_CG,
6369 MC_CITF_MISC_WR_CG,
6370 MC_CITF_MISC_RD_CG,
6371 MC_CITF_MISC_VM_CG,
6372 VM_L2_CG,
6373};
6374
6375static void cik_enable_mc_ls(struct radeon_device *rdev,
6376 bool enable)
6377{
6378 int i;
6379 u32 orig, data;
6380
6381 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6382 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006383 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006384 data |= MC_LS_ENABLE;
6385 else
6386 data &= ~MC_LS_ENABLE;
6387 if (data != orig)
6388 WREG32(mc_cg_registers[i], data);
6389 }
6390}
6391
6392static void cik_enable_mc_mgcg(struct radeon_device *rdev,
6393 bool enable)
6394{
6395 int i;
6396 u32 orig, data;
6397
6398 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6399 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006400 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006401 data |= MC_CG_ENABLE;
6402 else
6403 data &= ~MC_CG_ENABLE;
6404 if (data != orig)
6405 WREG32(mc_cg_registers[i], data);
6406 }
6407}
6408
6409static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
6410 bool enable)
6411{
6412 u32 orig, data;
6413
Alex Deucher473359b2013-08-09 11:18:39 -04006414 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006415 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
6416 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
6417 } else {
6418 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
6419 data |= 0xff000000;
6420 if (data != orig)
6421 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
6422
6423 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
6424 data |= 0xff000000;
6425 if (data != orig)
6426 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
6427 }
6428}
6429
6430static void cik_enable_sdma_mgls(struct radeon_device *rdev,
6431 bool enable)
6432{
6433 u32 orig, data;
6434
Alex Deucher473359b2013-08-09 11:18:39 -04006435 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006436 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6437 data |= 0x100;
6438 if (orig != data)
6439 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6440
6441 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6442 data |= 0x100;
6443 if (orig != data)
6444 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6445 } else {
6446 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6447 data &= ~0x100;
6448 if (orig != data)
6449 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6450
6451 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6452 data &= ~0x100;
6453 if (orig != data)
6454 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6455 }
6456}
6457
6458static void cik_enable_uvd_mgcg(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_UVD_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006464 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6465 data = 0xfff;
6466 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6467
6468 orig = data = RREG32(UVD_CGC_CTRL);
6469 data |= DCM;
6470 if (orig != data)
6471 WREG32(UVD_CGC_CTRL, data);
6472 } else {
6473 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6474 data &= ~0xfff;
6475 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6476
6477 orig = data = RREG32(UVD_CGC_CTRL);
6478 data &= ~DCM;
6479 if (orig != data)
6480 WREG32(UVD_CGC_CTRL, data);
6481 }
6482}
6483
Alex Deucher473359b2013-08-09 11:18:39 -04006484static void cik_enable_bif_mgls(struct radeon_device *rdev,
6485 bool enable)
6486{
6487 u32 orig, data;
6488
6489 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
6490
6491 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
6492 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
6493 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
6494 else
6495 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
6496 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
6497
6498 if (orig != data)
6499 WREG32_PCIE_PORT(PCIE_CNTL2, data);
6500}
6501
Alex Deucher22c775c2013-07-23 09:41:05 -04006502static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
6503 bool enable)
6504{
6505 u32 orig, data;
6506
6507 orig = data = RREG32(HDP_HOST_PATH_CNTL);
6508
Alex Deucher473359b2013-08-09 11:18:39 -04006509 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006510 data &= ~CLOCK_GATING_DIS;
6511 else
6512 data |= CLOCK_GATING_DIS;
6513
6514 if (orig != data)
6515 WREG32(HDP_HOST_PATH_CNTL, data);
6516}
6517
6518static void cik_enable_hdp_ls(struct radeon_device *rdev,
6519 bool enable)
6520{
6521 u32 orig, data;
6522
6523 orig = data = RREG32(HDP_MEM_POWER_LS);
6524
Alex Deucher473359b2013-08-09 11:18:39 -04006525 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006526 data |= HDP_LS_ENABLE;
6527 else
6528 data &= ~HDP_LS_ENABLE;
6529
6530 if (orig != data)
6531 WREG32(HDP_MEM_POWER_LS, data);
6532}
6533
6534void cik_update_cg(struct radeon_device *rdev,
6535 u32 block, bool enable)
6536{
Alex Deucher4214faf2013-09-03 10:17:13 -04006537
Alex Deucher22c775c2013-07-23 09:41:05 -04006538 if (block & RADEON_CG_BLOCK_GFX) {
Alex Deucher4214faf2013-09-03 10:17:13 -04006539 cik_enable_gui_idle_interrupt(rdev, false);
Alex Deucher22c775c2013-07-23 09:41:05 -04006540 /* order matters! */
6541 if (enable) {
6542 cik_enable_mgcg(rdev, true);
6543 cik_enable_cgcg(rdev, true);
6544 } else {
6545 cik_enable_cgcg(rdev, false);
6546 cik_enable_mgcg(rdev, false);
6547 }
Alex Deucher4214faf2013-09-03 10:17:13 -04006548 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006549 }
6550
6551 if (block & RADEON_CG_BLOCK_MC) {
6552 if (!(rdev->flags & RADEON_IS_IGP)) {
6553 cik_enable_mc_mgcg(rdev, enable);
6554 cik_enable_mc_ls(rdev, enable);
6555 }
6556 }
6557
6558 if (block & RADEON_CG_BLOCK_SDMA) {
6559 cik_enable_sdma_mgcg(rdev, enable);
6560 cik_enable_sdma_mgls(rdev, enable);
6561 }
6562
Alex Deucher473359b2013-08-09 11:18:39 -04006563 if (block & RADEON_CG_BLOCK_BIF) {
6564 cik_enable_bif_mgls(rdev, enable);
6565 }
6566
Alex Deucher22c775c2013-07-23 09:41:05 -04006567 if (block & RADEON_CG_BLOCK_UVD) {
6568 if (rdev->has_uvd)
6569 cik_enable_uvd_mgcg(rdev, enable);
6570 }
6571
6572 if (block & RADEON_CG_BLOCK_HDP) {
6573 cik_enable_hdp_mgcg(rdev, enable);
6574 cik_enable_hdp_ls(rdev, enable);
6575 }
Alex Deuchera1d6f972013-09-06 12:33:04 -04006576
6577 if (block & RADEON_CG_BLOCK_VCE) {
6578 vce_v2_0_enable_mgcg(rdev, enable);
6579 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006580}
6581
6582static void cik_init_cg(struct radeon_device *rdev)
6583{
6584
Alex Deucherddc76ff2013-08-12 17:25:26 -04006585 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006586
6587 if (rdev->has_uvd)
6588 si_init_uvd_internal_cg(rdev);
6589
6590 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6591 RADEON_CG_BLOCK_SDMA |
Alex Deucher473359b2013-08-09 11:18:39 -04006592 RADEON_CG_BLOCK_BIF |
Alex Deucher22c775c2013-07-23 09:41:05 -04006593 RADEON_CG_BLOCK_UVD |
6594 RADEON_CG_BLOCK_HDP), true);
6595}
6596
Alex Deucher473359b2013-08-09 11:18:39 -04006597static void cik_fini_cg(struct radeon_device *rdev)
6598{
6599 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6600 RADEON_CG_BLOCK_SDMA |
6601 RADEON_CG_BLOCK_BIF |
6602 RADEON_CG_BLOCK_UVD |
6603 RADEON_CG_BLOCK_HDP), false);
6604
6605 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
6606}
6607
Alex Deucher22c775c2013-07-23 09:41:05 -04006608static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
6609 bool enable)
6610{
6611 u32 data, orig;
6612
6613 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006614 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006615 data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6616 else
6617 data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6618 if (orig != data)
6619 WREG32(RLC_PG_CNTL, data);
6620}
6621
6622static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
6623 bool enable)
6624{
6625 u32 data, orig;
6626
6627 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006628 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006629 data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6630 else
6631 data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6632 if (orig != data)
6633 WREG32(RLC_PG_CNTL, data);
6634}
6635
6636static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
6637{
6638 u32 data, orig;
6639
6640 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006641 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
Alex Deucher22c775c2013-07-23 09:41:05 -04006642 data &= ~DISABLE_CP_PG;
6643 else
6644 data |= DISABLE_CP_PG;
6645 if (orig != data)
6646 WREG32(RLC_PG_CNTL, data);
6647}
6648
6649static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
6650{
6651 u32 data, orig;
6652
6653 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006654 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006655 data &= ~DISABLE_GDS_PG;
6656 else
6657 data |= DISABLE_GDS_PG;
6658 if (orig != data)
6659 WREG32(RLC_PG_CNTL, data);
6660}
6661
6662#define CP_ME_TABLE_SIZE 96
6663#define CP_ME_TABLE_OFFSET 2048
6664#define CP_MEC_TABLE_OFFSET 4096
6665
6666void cik_init_cp_pg_table(struct radeon_device *rdev)
6667{
Alex Deucher22c775c2013-07-23 09:41:05 -04006668 volatile u32 *dst_ptr;
6669 int me, i, max_me = 4;
6670 u32 bo_offset = 0;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006671 u32 table_offset, table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006672
6673 if (rdev->family == CHIP_KAVERI)
6674 max_me = 5;
6675
6676 if (rdev->rlc.cp_table_ptr == NULL)
6677 return;
6678
6679 /* write the cp table buffer */
6680 dst_ptr = rdev->rlc.cp_table_ptr;
6681 for (me = 0; me < max_me; me++) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006682 if (rdev->new_fw) {
6683 const __le32 *fw_data;
6684 const struct gfx_firmware_header_v1_0 *hdr;
Alex Deucher22c775c2013-07-23 09:41:05 -04006685
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006686 if (me == 0) {
6687 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
6688 fw_data = (const __le32 *)
6689 (rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6690 table_offset = le32_to_cpu(hdr->jt_offset);
6691 table_size = le32_to_cpu(hdr->jt_size);
6692 } else if (me == 1) {
6693 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
6694 fw_data = (const __le32 *)
6695 (rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6696 table_offset = le32_to_cpu(hdr->jt_offset);
6697 table_size = le32_to_cpu(hdr->jt_size);
6698 } else if (me == 2) {
6699 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
6700 fw_data = (const __le32 *)
6701 (rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6702 table_offset = le32_to_cpu(hdr->jt_offset);
6703 table_size = le32_to_cpu(hdr->jt_size);
6704 } else if (me == 3) {
6705 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
6706 fw_data = (const __le32 *)
6707 (rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6708 table_offset = le32_to_cpu(hdr->jt_offset);
6709 table_size = le32_to_cpu(hdr->jt_size);
6710 } else {
6711 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
6712 fw_data = (const __le32 *)
6713 (rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6714 table_offset = le32_to_cpu(hdr->jt_offset);
6715 table_size = le32_to_cpu(hdr->jt_size);
6716 }
6717
6718 for (i = 0; i < table_size; i ++) {
6719 dst_ptr[bo_offset + i] =
6720 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
6721 }
6722 bo_offset += table_size;
6723 } else {
6724 const __be32 *fw_data;
6725 table_size = CP_ME_TABLE_SIZE;
6726
6727 if (me == 0) {
6728 fw_data = (const __be32 *)rdev->ce_fw->data;
6729 table_offset = CP_ME_TABLE_OFFSET;
6730 } else if (me == 1) {
6731 fw_data = (const __be32 *)rdev->pfp_fw->data;
6732 table_offset = CP_ME_TABLE_OFFSET;
6733 } else if (me == 2) {
6734 fw_data = (const __be32 *)rdev->me_fw->data;
6735 table_offset = CP_ME_TABLE_OFFSET;
6736 } else {
6737 fw_data = (const __be32 *)rdev->mec_fw->data;
6738 table_offset = CP_MEC_TABLE_OFFSET;
6739 }
6740
6741 for (i = 0; i < table_size; i ++) {
6742 dst_ptr[bo_offset + i] =
6743 cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
6744 }
6745 bo_offset += table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006746 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006747 }
6748}
6749
6750static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
6751 bool enable)
6752{
6753 u32 data, orig;
6754
Alex Deucher2b19d172013-09-04 16:58:29 -04006755 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006756 orig = data = RREG32(RLC_PG_CNTL);
6757 data |= GFX_PG_ENABLE;
6758 if (orig != data)
6759 WREG32(RLC_PG_CNTL, data);
6760
6761 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6762 data |= AUTO_PG_EN;
6763 if (orig != data)
6764 WREG32(RLC_AUTO_PG_CTRL, data);
6765 } else {
6766 orig = data = RREG32(RLC_PG_CNTL);
6767 data &= ~GFX_PG_ENABLE;
6768 if (orig != data)
6769 WREG32(RLC_PG_CNTL, data);
6770
6771 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6772 data &= ~AUTO_PG_EN;
6773 if (orig != data)
6774 WREG32(RLC_AUTO_PG_CTRL, data);
6775
6776 data = RREG32(DB_RENDER_CONTROL);
6777 }
6778}
6779
6780static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
6781{
6782 u32 mask = 0, tmp, tmp1;
6783 int i;
6784
6785 cik_select_se_sh(rdev, se, sh);
6786 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
6787 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
6788 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6789
6790 tmp &= 0xffff0000;
6791
6792 tmp |= tmp1;
6793 tmp >>= 16;
6794
6795 for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
6796 mask <<= 1;
6797 mask |= 1;
6798 }
6799
6800 return (~tmp) & mask;
6801}
6802
6803static void cik_init_ao_cu_mask(struct radeon_device *rdev)
6804{
6805 u32 i, j, k, active_cu_number = 0;
6806 u32 mask, counter, cu_bitmap;
6807 u32 tmp = 0;
6808
6809 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6810 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6811 mask = 1;
6812 cu_bitmap = 0;
6813 counter = 0;
6814 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
6815 if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
6816 if (counter < 2)
6817 cu_bitmap |= mask;
6818 counter ++;
6819 }
6820 mask <<= 1;
6821 }
6822
6823 active_cu_number += counter;
6824 tmp |= (cu_bitmap << (i * 16 + j * 8));
6825 }
6826 }
6827
6828 WREG32(RLC_PG_AO_CU_MASK, tmp);
6829
6830 tmp = RREG32(RLC_MAX_PG_CU);
6831 tmp &= ~MAX_PU_CU_MASK;
6832 tmp |= MAX_PU_CU(active_cu_number);
6833 WREG32(RLC_MAX_PG_CU, tmp);
6834}
6835
6836static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
6837 bool enable)
6838{
6839 u32 data, orig;
6840
6841 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006842 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006843 data |= STATIC_PER_CU_PG_ENABLE;
6844 else
6845 data &= ~STATIC_PER_CU_PG_ENABLE;
6846 if (orig != data)
6847 WREG32(RLC_PG_CNTL, data);
6848}
6849
6850static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
6851 bool enable)
6852{
6853 u32 data, orig;
6854
6855 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006856 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006857 data |= DYN_PER_CU_PG_ENABLE;
6858 else
6859 data &= ~DYN_PER_CU_PG_ENABLE;
6860 if (orig != data)
6861 WREG32(RLC_PG_CNTL, data);
6862}
6863
6864#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
6865#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
6866
6867static void cik_init_gfx_cgpg(struct radeon_device *rdev)
6868{
6869 u32 data, orig;
6870 u32 i;
6871
6872 if (rdev->rlc.cs_data) {
6873 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6874 WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deuchera0f38602013-08-22 11:57:46 -04006875 WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deucher22c775c2013-07-23 09:41:05 -04006876 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
6877 } else {
6878 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6879 for (i = 0; i < 3; i++)
6880 WREG32(RLC_GPM_SCRATCH_DATA, 0);
6881 }
6882 if (rdev->rlc.reg_list) {
6883 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
6884 for (i = 0; i < rdev->rlc.reg_list_size; i++)
6885 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
6886 }
6887
6888 orig = data = RREG32(RLC_PG_CNTL);
6889 data |= GFX_PG_SRC;
6890 if (orig != data)
6891 WREG32(RLC_PG_CNTL, data);
6892
6893 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
6894 WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
6895
6896 data = RREG32(CP_RB_WPTR_POLL_CNTL);
6897 data &= ~IDLE_POLL_COUNT_MASK;
6898 data |= IDLE_POLL_COUNT(0x60);
6899 WREG32(CP_RB_WPTR_POLL_CNTL, data);
6900
6901 data = 0x10101010;
6902 WREG32(RLC_PG_DELAY, data);
6903
6904 data = RREG32(RLC_PG_DELAY_2);
6905 data &= ~0xff;
6906 data |= 0x3;
6907 WREG32(RLC_PG_DELAY_2, data);
6908
6909 data = RREG32(RLC_AUTO_PG_CTRL);
6910 data &= ~GRBM_REG_SGIT_MASK;
6911 data |= GRBM_REG_SGIT(0x700);
6912 WREG32(RLC_AUTO_PG_CTRL, data);
6913
6914}
6915
6916static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
6917{
Alex Deucher473359b2013-08-09 11:18:39 -04006918 cik_enable_gfx_cgpg(rdev, enable);
6919 cik_enable_gfx_static_mgpg(rdev, enable);
6920 cik_enable_gfx_dynamic_mgpg(rdev, enable);
Alex Deucher22c775c2013-07-23 09:41:05 -04006921}
6922
Alex Deuchera0f38602013-08-22 11:57:46 -04006923u32 cik_get_csb_size(struct radeon_device *rdev)
6924{
6925 u32 count = 0;
6926 const struct cs_section_def *sect = NULL;
6927 const struct cs_extent_def *ext = NULL;
6928
6929 if (rdev->rlc.cs_data == NULL)
6930 return 0;
6931
6932 /* begin clear state */
6933 count += 2;
6934 /* context control state */
6935 count += 3;
6936
6937 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6938 for (ext = sect->section; ext->extent != NULL; ++ext) {
6939 if (sect->id == SECT_CONTEXT)
6940 count += 2 + ext->reg_count;
6941 else
6942 return 0;
6943 }
6944 }
6945 /* pa_sc_raster_config/pa_sc_raster_config1 */
6946 count += 4;
6947 /* end clear state */
6948 count += 2;
6949 /* clear state */
6950 count += 2;
6951
6952 return count;
6953}
6954
6955void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
6956{
6957 u32 count = 0, i;
6958 const struct cs_section_def *sect = NULL;
6959 const struct cs_extent_def *ext = NULL;
6960
6961 if (rdev->rlc.cs_data == NULL)
6962 return;
6963 if (buffer == NULL)
6964 return;
6965
Alex Deucher6ba81e52013-10-23 18:27:10 -04006966 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
6967 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04006968
Alex Deucher6ba81e52013-10-23 18:27:10 -04006969 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
6970 buffer[count++] = cpu_to_le32(0x80000000);
6971 buffer[count++] = cpu_to_le32(0x80000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04006972
6973 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6974 for (ext = sect->section; ext->extent != NULL; ++ext) {
6975 if (sect->id == SECT_CONTEXT) {
Alex Deucher6ba81e52013-10-23 18:27:10 -04006976 buffer[count++] =
6977 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
6978 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
Alex Deuchera0f38602013-08-22 11:57:46 -04006979 for (i = 0; i < ext->reg_count; i++)
Alex Deucher6ba81e52013-10-23 18:27:10 -04006980 buffer[count++] = cpu_to_le32(ext->extent[i]);
Alex Deuchera0f38602013-08-22 11:57:46 -04006981 } else {
6982 return;
6983 }
6984 }
6985 }
6986
Alex Deucher6ba81e52013-10-23 18:27:10 -04006987 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
6988 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
Alex Deuchera0f38602013-08-22 11:57:46 -04006989 switch (rdev->family) {
6990 case CHIP_BONAIRE:
Alex Deucher6ba81e52013-10-23 18:27:10 -04006991 buffer[count++] = cpu_to_le32(0x16000012);
6992 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04006993 break;
6994 case CHIP_KAVERI:
Alex Deucher6ba81e52013-10-23 18:27:10 -04006995 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
6996 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04006997 break;
6998 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04006999 case CHIP_MULLINS:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007000 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7001 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007002 break;
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007003 case CHIP_HAWAII:
Alex Deuchera8947f52014-04-02 08:42:48 -04007004 buffer[count++] = cpu_to_le32(0x3a00161a);
7005 buffer[count++] = cpu_to_le32(0x0000002e);
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007006 break;
Alex Deuchera0f38602013-08-22 11:57:46 -04007007 default:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007008 buffer[count++] = cpu_to_le32(0x00000000);
7009 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007010 break;
7011 }
7012
Alex Deucher6ba81e52013-10-23 18:27:10 -04007013 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
7014 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04007015
Alex Deucher6ba81e52013-10-23 18:27:10 -04007016 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
7017 buffer[count++] = cpu_to_le32(0);
Alex Deuchera0f38602013-08-22 11:57:46 -04007018}
7019
Alex Deucher473359b2013-08-09 11:18:39 -04007020static void cik_init_pg(struct radeon_device *rdev)
Alex Deucher22c775c2013-07-23 09:41:05 -04007021{
Alex Deucher473359b2013-08-09 11:18:39 -04007022 if (rdev->pg_flags) {
Alex Deucher22c775c2013-07-23 09:41:05 -04007023 cik_enable_sck_slowdown_on_pu(rdev, true);
7024 cik_enable_sck_slowdown_on_pd(rdev, true);
Alex Deucher2b19d172013-09-04 16:58:29 -04007025 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007026 cik_init_gfx_cgpg(rdev);
7027 cik_enable_cp_pg(rdev, true);
7028 cik_enable_gds_pg(rdev, true);
7029 }
Alex Deucher22c775c2013-07-23 09:41:05 -04007030 cik_init_ao_cu_mask(rdev);
7031 cik_update_gfx_pg(rdev, true);
7032 }
7033}
7034
Alex Deucher473359b2013-08-09 11:18:39 -04007035static void cik_fini_pg(struct radeon_device *rdev)
7036{
7037 if (rdev->pg_flags) {
7038 cik_update_gfx_pg(rdev, false);
Alex Deucher2b19d172013-09-04 16:58:29 -04007039 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007040 cik_enable_cp_pg(rdev, false);
7041 cik_enable_gds_pg(rdev, false);
7042 }
7043 }
7044}
7045
Alex Deuchera59781b2012-11-09 10:45:57 -05007046/*
7047 * Interrupts
7048 * Starting with r6xx, interrupts are handled via a ring buffer.
7049 * Ring buffers are areas of GPU accessible memory that the GPU
7050 * writes interrupt vectors into and the host reads vectors out of.
7051 * There is a rptr (read pointer) that determines where the
7052 * host is currently reading, and a wptr (write pointer)
7053 * which determines where the GPU has written. When the
7054 * pointers are equal, the ring is idle. When the GPU
7055 * writes vectors to the ring buffer, it increments the
7056 * wptr. When there is an interrupt, the host then starts
7057 * fetching commands and processing them until the pointers are
7058 * equal again at which point it updates the rptr.
7059 */
7060
7061/**
7062 * cik_enable_interrupts - Enable the interrupt ring buffer
7063 *
7064 * @rdev: radeon_device pointer
7065 *
7066 * Enable the interrupt ring buffer (CIK).
7067 */
7068static void cik_enable_interrupts(struct radeon_device *rdev)
7069{
7070 u32 ih_cntl = RREG32(IH_CNTL);
7071 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7072
7073 ih_cntl |= ENABLE_INTR;
7074 ih_rb_cntl |= IH_RB_ENABLE;
7075 WREG32(IH_CNTL, ih_cntl);
7076 WREG32(IH_RB_CNTL, ih_rb_cntl);
7077 rdev->ih.enabled = true;
7078}
7079
7080/**
7081 * cik_disable_interrupts - Disable the interrupt ring buffer
7082 *
7083 * @rdev: radeon_device pointer
7084 *
7085 * Disable the interrupt ring buffer (CIK).
7086 */
7087static void cik_disable_interrupts(struct radeon_device *rdev)
7088{
7089 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7090 u32 ih_cntl = RREG32(IH_CNTL);
7091
7092 ih_rb_cntl &= ~IH_RB_ENABLE;
7093 ih_cntl &= ~ENABLE_INTR;
7094 WREG32(IH_RB_CNTL, ih_rb_cntl);
7095 WREG32(IH_CNTL, ih_cntl);
7096 /* set rptr, wptr to 0 */
7097 WREG32(IH_RB_RPTR, 0);
7098 WREG32(IH_RB_WPTR, 0);
7099 rdev->ih.enabled = false;
7100 rdev->ih.rptr = 0;
7101}
7102
7103/**
7104 * cik_disable_interrupt_state - Disable all interrupt sources
7105 *
7106 * @rdev: radeon_device pointer
7107 *
7108 * Clear all interrupt enable bits used by the driver (CIK).
7109 */
7110static void cik_disable_interrupt_state(struct radeon_device *rdev)
7111{
7112 u32 tmp;
7113
7114 /* gfx ring */
Alex Deucher4214faf2013-09-03 10:17:13 -04007115 tmp = RREG32(CP_INT_CNTL_RING0) &
7116 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7117 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher21a93e12013-04-09 12:47:11 -04007118 /* sdma */
7119 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7120 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
7121 tmp = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7122 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, tmp);
Alex Deuchera59781b2012-11-09 10:45:57 -05007123 /* compute queues */
7124 WREG32(CP_ME1_PIPE0_INT_CNTL, 0);
7125 WREG32(CP_ME1_PIPE1_INT_CNTL, 0);
7126 WREG32(CP_ME1_PIPE2_INT_CNTL, 0);
7127 WREG32(CP_ME1_PIPE3_INT_CNTL, 0);
7128 WREG32(CP_ME2_PIPE0_INT_CNTL, 0);
7129 WREG32(CP_ME2_PIPE1_INT_CNTL, 0);
7130 WREG32(CP_ME2_PIPE2_INT_CNTL, 0);
7131 WREG32(CP_ME2_PIPE3_INT_CNTL, 0);
7132 /* grbm */
7133 WREG32(GRBM_INT_CNTL, 0);
7134 /* vline/vblank, etc. */
7135 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7136 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7137 if (rdev->num_crtc >= 4) {
7138 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7139 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7140 }
7141 if (rdev->num_crtc >= 6) {
7142 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7143 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7144 }
Christian Königf5d636d2014-04-23 20:46:06 +02007145 /* pflip */
7146 if (rdev->num_crtc >= 2) {
7147 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7148 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7149 }
7150 if (rdev->num_crtc >= 4) {
7151 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7152 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7153 }
7154 if (rdev->num_crtc >= 6) {
7155 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7156 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7157 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007158
7159 /* dac hotplug */
7160 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
7161
7162 /* digital hotplug */
7163 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7164 WREG32(DC_HPD1_INT_CONTROL, tmp);
7165 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7166 WREG32(DC_HPD2_INT_CONTROL, tmp);
7167 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7168 WREG32(DC_HPD3_INT_CONTROL, tmp);
7169 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7170 WREG32(DC_HPD4_INT_CONTROL, tmp);
7171 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7172 WREG32(DC_HPD5_INT_CONTROL, tmp);
7173 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7174 WREG32(DC_HPD6_INT_CONTROL, tmp);
7175
7176}
7177
7178/**
7179 * cik_irq_init - init and enable the interrupt ring
7180 *
7181 * @rdev: radeon_device pointer
7182 *
7183 * Allocate a ring buffer for the interrupt controller,
7184 * enable the RLC, disable interrupts, enable the IH
7185 * ring buffer and enable it (CIK).
7186 * Called at device load and reume.
7187 * Returns 0 for success, errors for failure.
7188 */
7189static int cik_irq_init(struct radeon_device *rdev)
7190{
7191 int ret = 0;
7192 int rb_bufsz;
7193 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
7194
7195 /* allocate ring */
7196 ret = r600_ih_ring_alloc(rdev);
7197 if (ret)
7198 return ret;
7199
7200 /* disable irqs */
7201 cik_disable_interrupts(rdev);
7202
7203 /* init rlc */
7204 ret = cik_rlc_resume(rdev);
7205 if (ret) {
7206 r600_ih_ring_fini(rdev);
7207 return ret;
7208 }
7209
7210 /* setup interrupt control */
7211 /* XXX this should actually be a bus address, not an MC address. same on older asics */
7212 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
7213 interrupt_cntl = RREG32(INTERRUPT_CNTL);
7214 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
7215 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
7216 */
7217 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
7218 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
7219 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
7220 WREG32(INTERRUPT_CNTL, interrupt_cntl);
7221
7222 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
Daniel Vetterb72a8922013-07-10 14:11:59 +02007223 rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007224
7225 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
7226 IH_WPTR_OVERFLOW_CLEAR |
7227 (rb_bufsz << 1));
7228
7229 if (rdev->wb.enabled)
7230 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
7231
7232 /* set the writeback address whether it's enabled or not */
7233 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
7234 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
7235
7236 WREG32(IH_RB_CNTL, ih_rb_cntl);
7237
7238 /* set rptr, wptr to 0 */
7239 WREG32(IH_RB_RPTR, 0);
7240 WREG32(IH_RB_WPTR, 0);
7241
7242 /* Default settings for IH_CNTL (disabled at first) */
7243 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
7244 /* RPTR_REARM only works if msi's are enabled */
7245 if (rdev->msi_enabled)
7246 ih_cntl |= RPTR_REARM;
7247 WREG32(IH_CNTL, ih_cntl);
7248
7249 /* force the active interrupt state to all disabled */
7250 cik_disable_interrupt_state(rdev);
7251
7252 pci_set_master(rdev->pdev);
7253
7254 /* enable irqs */
7255 cik_enable_interrupts(rdev);
7256
7257 return ret;
7258}
7259
7260/**
7261 * cik_irq_set - enable/disable interrupt sources
7262 *
7263 * @rdev: radeon_device pointer
7264 *
7265 * Enable interrupt sources on the GPU (vblanks, hpd,
7266 * etc.) (CIK).
7267 * Returns 0 for success, errors for failure.
7268 */
7269int cik_irq_set(struct radeon_device *rdev)
7270{
Alex Deucher4214faf2013-09-03 10:17:13 -04007271 u32 cp_int_cntl;
Alex Deucher2b0781a2013-04-09 14:26:16 -04007272 u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
7273 u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
Alex Deuchera59781b2012-11-09 10:45:57 -05007274 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
7275 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7276 u32 grbm_int_cntl = 0;
Alex Deucher21a93e12013-04-09 12:47:11 -04007277 u32 dma_cntl, dma_cntl1;
Alex Deucher41a524a2013-08-14 01:01:40 -04007278 u32 thermal_int;
Alex Deuchera59781b2012-11-09 10:45:57 -05007279
7280 if (!rdev->irq.installed) {
7281 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
7282 return -EINVAL;
7283 }
7284 /* don't enable anything if the ih is disabled */
7285 if (!rdev->ih.enabled) {
7286 cik_disable_interrupts(rdev);
7287 /* force the active interrupt state to all disabled */
7288 cik_disable_interrupt_state(rdev);
7289 return 0;
7290 }
7291
Alex Deucher4214faf2013-09-03 10:17:13 -04007292 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
7293 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7294 cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
7295
Alex Deuchera59781b2012-11-09 10:45:57 -05007296 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
7297 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
7298 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
7299 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
7300 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
7301 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
7302
Alex Deucher21a93e12013-04-09 12:47:11 -04007303 dma_cntl = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7304 dma_cntl1 = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7305
Alex Deucher2b0781a2013-04-09 14:26:16 -04007306 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7307 cp_m1p1 = RREG32(CP_ME1_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7308 cp_m1p2 = RREG32(CP_ME1_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7309 cp_m1p3 = RREG32(CP_ME1_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7310 cp_m2p0 = RREG32(CP_ME2_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7311 cp_m2p1 = RREG32(CP_ME2_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7312 cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7313 cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7314
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007315 if (rdev->flags & RADEON_IS_IGP)
7316 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7317 ~(THERM_INTH_MASK | THERM_INTL_MASK);
7318 else
7319 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7320 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
Alex Deucher41a524a2013-08-14 01:01:40 -04007321
Alex Deuchera59781b2012-11-09 10:45:57 -05007322 /* enable CP interrupts on all rings */
7323 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
7324 DRM_DEBUG("cik_irq_set: sw int gfx\n");
7325 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
7326 }
Alex Deucher2b0781a2013-04-09 14:26:16 -04007327 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
7328 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7329 DRM_DEBUG("si_irq_set: sw int cp1\n");
7330 if (ring->me == 1) {
7331 switch (ring->pipe) {
7332 case 0:
7333 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7334 break;
7335 case 1:
7336 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7337 break;
7338 case 2:
7339 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7340 break;
7341 case 3:
7342 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7343 break;
7344 default:
7345 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7346 break;
7347 }
7348 } else if (ring->me == 2) {
7349 switch (ring->pipe) {
7350 case 0:
7351 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7352 break;
7353 case 1:
7354 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7355 break;
7356 case 2:
7357 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7358 break;
7359 case 3:
7360 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7361 break;
7362 default:
7363 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7364 break;
7365 }
7366 } else {
7367 DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring->me);
7368 }
7369 }
7370 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
7371 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7372 DRM_DEBUG("si_irq_set: sw int cp2\n");
7373 if (ring->me == 1) {
7374 switch (ring->pipe) {
7375 case 0:
7376 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7377 break;
7378 case 1:
7379 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7380 break;
7381 case 2:
7382 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7383 break;
7384 case 3:
7385 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7386 break;
7387 default:
7388 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7389 break;
7390 }
7391 } else if (ring->me == 2) {
7392 switch (ring->pipe) {
7393 case 0:
7394 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7395 break;
7396 case 1:
7397 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7398 break;
7399 case 2:
7400 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7401 break;
7402 case 3:
7403 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7404 break;
7405 default:
7406 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7407 break;
7408 }
7409 } else {
7410 DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring->me);
7411 }
7412 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007413
Alex Deucher21a93e12013-04-09 12:47:11 -04007414 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
7415 DRM_DEBUG("cik_irq_set: sw int dma\n");
7416 dma_cntl |= TRAP_ENABLE;
7417 }
7418
7419 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
7420 DRM_DEBUG("cik_irq_set: sw int dma1\n");
7421 dma_cntl1 |= TRAP_ENABLE;
7422 }
7423
Alex Deuchera59781b2012-11-09 10:45:57 -05007424 if (rdev->irq.crtc_vblank_int[0] ||
7425 atomic_read(&rdev->irq.pflip[0])) {
7426 DRM_DEBUG("cik_irq_set: vblank 0\n");
7427 crtc1 |= VBLANK_INTERRUPT_MASK;
7428 }
7429 if (rdev->irq.crtc_vblank_int[1] ||
7430 atomic_read(&rdev->irq.pflip[1])) {
7431 DRM_DEBUG("cik_irq_set: vblank 1\n");
7432 crtc2 |= VBLANK_INTERRUPT_MASK;
7433 }
7434 if (rdev->irq.crtc_vblank_int[2] ||
7435 atomic_read(&rdev->irq.pflip[2])) {
7436 DRM_DEBUG("cik_irq_set: vblank 2\n");
7437 crtc3 |= VBLANK_INTERRUPT_MASK;
7438 }
7439 if (rdev->irq.crtc_vblank_int[3] ||
7440 atomic_read(&rdev->irq.pflip[3])) {
7441 DRM_DEBUG("cik_irq_set: vblank 3\n");
7442 crtc4 |= VBLANK_INTERRUPT_MASK;
7443 }
7444 if (rdev->irq.crtc_vblank_int[4] ||
7445 atomic_read(&rdev->irq.pflip[4])) {
7446 DRM_DEBUG("cik_irq_set: vblank 4\n");
7447 crtc5 |= VBLANK_INTERRUPT_MASK;
7448 }
7449 if (rdev->irq.crtc_vblank_int[5] ||
7450 atomic_read(&rdev->irq.pflip[5])) {
7451 DRM_DEBUG("cik_irq_set: vblank 5\n");
7452 crtc6 |= VBLANK_INTERRUPT_MASK;
7453 }
7454 if (rdev->irq.hpd[0]) {
7455 DRM_DEBUG("cik_irq_set: hpd 1\n");
7456 hpd1 |= DC_HPDx_INT_EN;
7457 }
7458 if (rdev->irq.hpd[1]) {
7459 DRM_DEBUG("cik_irq_set: hpd 2\n");
7460 hpd2 |= DC_HPDx_INT_EN;
7461 }
7462 if (rdev->irq.hpd[2]) {
7463 DRM_DEBUG("cik_irq_set: hpd 3\n");
7464 hpd3 |= DC_HPDx_INT_EN;
7465 }
7466 if (rdev->irq.hpd[3]) {
7467 DRM_DEBUG("cik_irq_set: hpd 4\n");
7468 hpd4 |= DC_HPDx_INT_EN;
7469 }
7470 if (rdev->irq.hpd[4]) {
7471 DRM_DEBUG("cik_irq_set: hpd 5\n");
7472 hpd5 |= DC_HPDx_INT_EN;
7473 }
7474 if (rdev->irq.hpd[5]) {
7475 DRM_DEBUG("cik_irq_set: hpd 6\n");
7476 hpd6 |= DC_HPDx_INT_EN;
7477 }
7478
Alex Deucher41a524a2013-08-14 01:01:40 -04007479 if (rdev->irq.dpm_thermal) {
7480 DRM_DEBUG("dpm thermal\n");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007481 if (rdev->flags & RADEON_IS_IGP)
7482 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7483 else
7484 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
Alex Deucher41a524a2013-08-14 01:01:40 -04007485 }
7486
Alex Deuchera59781b2012-11-09 10:45:57 -05007487 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7488
Alex Deucher21a93e12013-04-09 12:47:11 -04007489 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
7490 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, dma_cntl1);
7491
Alex Deucher2b0781a2013-04-09 14:26:16 -04007492 WREG32(CP_ME1_PIPE0_INT_CNTL, cp_m1p0);
7493 WREG32(CP_ME1_PIPE1_INT_CNTL, cp_m1p1);
7494 WREG32(CP_ME1_PIPE2_INT_CNTL, cp_m1p2);
7495 WREG32(CP_ME1_PIPE3_INT_CNTL, cp_m1p3);
7496 WREG32(CP_ME2_PIPE0_INT_CNTL, cp_m2p0);
7497 WREG32(CP_ME2_PIPE1_INT_CNTL, cp_m2p1);
7498 WREG32(CP_ME2_PIPE2_INT_CNTL, cp_m2p2);
7499 WREG32(CP_ME2_PIPE3_INT_CNTL, cp_m2p3);
7500
Alex Deuchera59781b2012-11-09 10:45:57 -05007501 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
7502
7503 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
7504 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
7505 if (rdev->num_crtc >= 4) {
7506 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
7507 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
7508 }
7509 if (rdev->num_crtc >= 6) {
7510 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
7511 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
7512 }
7513
Christian Königf5d636d2014-04-23 20:46:06 +02007514 if (rdev->num_crtc >= 2) {
7515 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
7516 GRPH_PFLIP_INT_MASK);
7517 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
7518 GRPH_PFLIP_INT_MASK);
7519 }
7520 if (rdev->num_crtc >= 4) {
7521 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
7522 GRPH_PFLIP_INT_MASK);
7523 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
7524 GRPH_PFLIP_INT_MASK);
7525 }
7526 if (rdev->num_crtc >= 6) {
7527 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
7528 GRPH_PFLIP_INT_MASK);
7529 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
7530 GRPH_PFLIP_INT_MASK);
7531 }
7532
Alex Deuchera59781b2012-11-09 10:45:57 -05007533 WREG32(DC_HPD1_INT_CONTROL, hpd1);
7534 WREG32(DC_HPD2_INT_CONTROL, hpd2);
7535 WREG32(DC_HPD3_INT_CONTROL, hpd3);
7536 WREG32(DC_HPD4_INT_CONTROL, hpd4);
7537 WREG32(DC_HPD5_INT_CONTROL, hpd5);
7538 WREG32(DC_HPD6_INT_CONTROL, hpd6);
7539
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007540 if (rdev->flags & RADEON_IS_IGP)
7541 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7542 else
7543 WREG32_SMC(CG_THERMAL_INT, thermal_int);
Alex Deucher41a524a2013-08-14 01:01:40 -04007544
Alex Deuchera59781b2012-11-09 10:45:57 -05007545 return 0;
7546}
7547
7548/**
7549 * cik_irq_ack - ack interrupt sources
7550 *
7551 * @rdev: radeon_device pointer
7552 *
7553 * Ack interrupt sources on the GPU (vblanks, hpd,
7554 * etc.) (CIK). Certain interrupts sources are sw
7555 * generated and do not require an explicit ack.
7556 */
7557static inline void cik_irq_ack(struct radeon_device *rdev)
7558{
7559 u32 tmp;
7560
7561 rdev->irq.stat_regs.cik.disp_int = RREG32(DISP_INTERRUPT_STATUS);
7562 rdev->irq.stat_regs.cik.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
7563 rdev->irq.stat_regs.cik.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
7564 rdev->irq.stat_regs.cik.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
7565 rdev->irq.stat_regs.cik.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
7566 rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
7567 rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
7568
Christian Königf5d636d2014-04-23 20:46:06 +02007569 rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
7570 EVERGREEN_CRTC0_REGISTER_OFFSET);
7571 rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
7572 EVERGREEN_CRTC1_REGISTER_OFFSET);
7573 if (rdev->num_crtc >= 4) {
7574 rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
7575 EVERGREEN_CRTC2_REGISTER_OFFSET);
7576 rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
7577 EVERGREEN_CRTC3_REGISTER_OFFSET);
7578 }
7579 if (rdev->num_crtc >= 6) {
7580 rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
7581 EVERGREEN_CRTC4_REGISTER_OFFSET);
7582 rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
7583 EVERGREEN_CRTC5_REGISTER_OFFSET);
7584 }
7585
7586 if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
7587 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
7588 GRPH_PFLIP_INT_CLEAR);
7589 if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
7590 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
7591 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007592 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
7593 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
7594 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
7595 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
7596 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
7597 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
7598 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)
7599 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
7600
7601 if (rdev->num_crtc >= 4) {
Christian Königf5d636d2014-04-23 20:46:06 +02007602 if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
7603 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
7604 GRPH_PFLIP_INT_CLEAR);
7605 if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
7606 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
7607 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007608 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
7609 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
7610 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
7611 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
7612 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
7613 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
7614 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
7615 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
7616 }
7617
7618 if (rdev->num_crtc >= 6) {
Christian Königf5d636d2014-04-23 20:46:06 +02007619 if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
7620 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
7621 GRPH_PFLIP_INT_CLEAR);
7622 if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
7623 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
7624 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007625 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
7626 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
7627 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
7628 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
7629 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
7630 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
7631 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
7632 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
7633 }
7634
7635 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7636 tmp = RREG32(DC_HPD1_INT_CONTROL);
7637 tmp |= DC_HPDx_INT_ACK;
7638 WREG32(DC_HPD1_INT_CONTROL, tmp);
7639 }
7640 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7641 tmp = RREG32(DC_HPD2_INT_CONTROL);
7642 tmp |= DC_HPDx_INT_ACK;
7643 WREG32(DC_HPD2_INT_CONTROL, tmp);
7644 }
7645 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
7646 tmp = RREG32(DC_HPD3_INT_CONTROL);
7647 tmp |= DC_HPDx_INT_ACK;
7648 WREG32(DC_HPD3_INT_CONTROL, tmp);
7649 }
7650 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
7651 tmp = RREG32(DC_HPD4_INT_CONTROL);
7652 tmp |= DC_HPDx_INT_ACK;
7653 WREG32(DC_HPD4_INT_CONTROL, tmp);
7654 }
7655 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
7656 tmp = RREG32(DC_HPD5_INT_CONTROL);
7657 tmp |= DC_HPDx_INT_ACK;
7658 WREG32(DC_HPD5_INT_CONTROL, tmp);
7659 }
7660 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
7661 tmp = RREG32(DC_HPD5_INT_CONTROL);
7662 tmp |= DC_HPDx_INT_ACK;
7663 WREG32(DC_HPD6_INT_CONTROL, tmp);
7664 }
7665}
7666
7667/**
7668 * cik_irq_disable - disable interrupts
7669 *
7670 * @rdev: radeon_device pointer
7671 *
7672 * Disable interrupts on the hw (CIK).
7673 */
7674static void cik_irq_disable(struct radeon_device *rdev)
7675{
7676 cik_disable_interrupts(rdev);
7677 /* Wait and acknowledge irq */
7678 mdelay(1);
7679 cik_irq_ack(rdev);
7680 cik_disable_interrupt_state(rdev);
7681}
7682
7683/**
7684 * cik_irq_disable - disable interrupts for suspend
7685 *
7686 * @rdev: radeon_device pointer
7687 *
7688 * Disable interrupts and stop the RLC (CIK).
7689 * Used for suspend.
7690 */
7691static void cik_irq_suspend(struct radeon_device *rdev)
7692{
7693 cik_irq_disable(rdev);
7694 cik_rlc_stop(rdev);
7695}
7696
7697/**
7698 * cik_irq_fini - tear down interrupt support
7699 *
7700 * @rdev: radeon_device pointer
7701 *
7702 * Disable interrupts on the hw and free the IH ring
7703 * buffer (CIK).
7704 * Used for driver unload.
7705 */
7706static void cik_irq_fini(struct radeon_device *rdev)
7707{
7708 cik_irq_suspend(rdev);
7709 r600_ih_ring_fini(rdev);
7710}
7711
7712/**
7713 * cik_get_ih_wptr - get the IH ring buffer wptr
7714 *
7715 * @rdev: radeon_device pointer
7716 *
7717 * Get the IH ring buffer wptr from either the register
7718 * or the writeback memory buffer (CIK). Also check for
7719 * ring buffer overflow and deal with it.
7720 * Used by cik_irq_process().
7721 * Returns the value of the wptr.
7722 */
7723static inline u32 cik_get_ih_wptr(struct radeon_device *rdev)
7724{
7725 u32 wptr, tmp;
7726
7727 if (rdev->wb.enabled)
7728 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
7729 else
7730 wptr = RREG32(IH_RB_WPTR);
7731
7732 if (wptr & RB_OVERFLOW) {
7733 /* When a ring buffer overflow happen start parsing interrupt
7734 * from the last not overwritten vector (wptr + 16). Hopefully
7735 * this should allow us to catchup.
7736 */
7737 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n",
7738 wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
7739 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
7740 tmp = RREG32(IH_RB_CNTL);
7741 tmp |= IH_WPTR_OVERFLOW_CLEAR;
7742 WREG32(IH_RB_CNTL, tmp);
Christian Könige8c214d2014-07-23 09:47:58 +02007743 wptr &= ~RB_OVERFLOW;
Alex Deuchera59781b2012-11-09 10:45:57 -05007744 }
7745 return (wptr & rdev->ih.ptr_mask);
7746}
7747
7748/* CIK IV Ring
7749 * Each IV ring entry is 128 bits:
7750 * [7:0] - interrupt source id
7751 * [31:8] - reserved
7752 * [59:32] - interrupt source data
7753 * [63:60] - reserved
Alex Deucher21a93e12013-04-09 12:47:11 -04007754 * [71:64] - RINGID
7755 * CP:
7756 * ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
Alex Deuchera59781b2012-11-09 10:45:57 -05007757 * QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
7758 * - for gfx, hw shader state (0=PS...5=LS, 6=CS)
7759 * ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
7760 * PIPE_ID - ME0 0=3D
7761 * - ME1&2 compute dispatcher (4 pipes each)
Alex Deucher21a93e12013-04-09 12:47:11 -04007762 * SDMA:
7763 * INSTANCE_ID [1:0], QUEUE_ID[1:0]
7764 * INSTANCE_ID - 0 = sdma0, 1 = sdma1
7765 * QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
Alex Deuchera59781b2012-11-09 10:45:57 -05007766 * [79:72] - VMID
7767 * [95:80] - PASID
7768 * [127:96] - reserved
7769 */
7770/**
7771 * cik_irq_process - interrupt handler
7772 *
7773 * @rdev: radeon_device pointer
7774 *
7775 * Interrupt hander (CIK). Walk the IH ring,
7776 * ack interrupts and schedule work to handle
7777 * interrupt events.
7778 * Returns irq process return code.
7779 */
7780int cik_irq_process(struct radeon_device *rdev)
7781{
Alex Deucher2b0781a2013-04-09 14:26:16 -04007782 struct radeon_ring *cp1_ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7783 struct radeon_ring *cp2_ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
Alex Deuchera59781b2012-11-09 10:45:57 -05007784 u32 wptr;
7785 u32 rptr;
7786 u32 src_id, src_data, ring_id;
7787 u8 me_id, pipe_id, queue_id;
7788 u32 ring_index;
7789 bool queue_hotplug = false;
7790 bool queue_reset = false;
Alex Deucher3ec7d112013-06-14 10:42:22 -04007791 u32 addr, status, mc_client;
Alex Deucher41a524a2013-08-14 01:01:40 -04007792 bool queue_thermal = false;
Alex Deuchera59781b2012-11-09 10:45:57 -05007793
7794 if (!rdev->ih.enabled || rdev->shutdown)
7795 return IRQ_NONE;
7796
7797 wptr = cik_get_ih_wptr(rdev);
7798
7799restart_ih:
7800 /* is somebody else already processing irqs? */
7801 if (atomic_xchg(&rdev->ih.lock, 1))
7802 return IRQ_NONE;
7803
7804 rptr = rdev->ih.rptr;
7805 DRM_DEBUG("cik_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
7806
7807 /* Order reading of wptr vs. reading of IH ring data */
7808 rmb();
7809
7810 /* display interrupts */
7811 cik_irq_ack(rdev);
7812
7813 while (rptr != wptr) {
7814 /* wptr/rptr are in bytes! */
7815 ring_index = rptr / 4;
7816 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
7817 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
7818 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
Alex Deuchera59781b2012-11-09 10:45:57 -05007819
7820 switch (src_id) {
7821 case 1: /* D1 vblank/vline */
7822 switch (src_data) {
7823 case 0: /* D1 vblank */
7824 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) {
7825 if (rdev->irq.crtc_vblank_int[0]) {
7826 drm_handle_vblank(rdev->ddev, 0);
7827 rdev->pm.vblank_sync = true;
7828 wake_up(&rdev->irq.vblank_queue);
7829 }
7830 if (atomic_read(&rdev->irq.pflip[0]))
Christian König1a0e7912014-05-27 16:49:21 +02007831 radeon_crtc_handle_vblank(rdev, 0);
Alex Deuchera59781b2012-11-09 10:45:57 -05007832 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
7833 DRM_DEBUG("IH: D1 vblank\n");
7834 }
7835 break;
7836 case 1: /* D1 vline */
7837 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) {
7838 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT;
7839 DRM_DEBUG("IH: D1 vline\n");
7840 }
7841 break;
7842 default:
7843 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7844 break;
7845 }
7846 break;
7847 case 2: /* D2 vblank/vline */
7848 switch (src_data) {
7849 case 0: /* D2 vblank */
7850 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
7851 if (rdev->irq.crtc_vblank_int[1]) {
7852 drm_handle_vblank(rdev->ddev, 1);
7853 rdev->pm.vblank_sync = true;
7854 wake_up(&rdev->irq.vblank_queue);
7855 }
7856 if (atomic_read(&rdev->irq.pflip[1]))
Christian König1a0e7912014-05-27 16:49:21 +02007857 radeon_crtc_handle_vblank(rdev, 1);
Alex Deuchera59781b2012-11-09 10:45:57 -05007858 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
7859 DRM_DEBUG("IH: D2 vblank\n");
7860 }
7861 break;
7862 case 1: /* D2 vline */
7863 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
7864 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
7865 DRM_DEBUG("IH: D2 vline\n");
7866 }
7867 break;
7868 default:
7869 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7870 break;
7871 }
7872 break;
7873 case 3: /* D3 vblank/vline */
7874 switch (src_data) {
7875 case 0: /* D3 vblank */
7876 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
7877 if (rdev->irq.crtc_vblank_int[2]) {
7878 drm_handle_vblank(rdev->ddev, 2);
7879 rdev->pm.vblank_sync = true;
7880 wake_up(&rdev->irq.vblank_queue);
7881 }
7882 if (atomic_read(&rdev->irq.pflip[2]))
Christian König1a0e7912014-05-27 16:49:21 +02007883 radeon_crtc_handle_vblank(rdev, 2);
Alex Deuchera59781b2012-11-09 10:45:57 -05007884 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
7885 DRM_DEBUG("IH: D3 vblank\n");
7886 }
7887 break;
7888 case 1: /* D3 vline */
7889 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
7890 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
7891 DRM_DEBUG("IH: D3 vline\n");
7892 }
7893 break;
7894 default:
7895 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7896 break;
7897 }
7898 break;
7899 case 4: /* D4 vblank/vline */
7900 switch (src_data) {
7901 case 0: /* D4 vblank */
7902 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
7903 if (rdev->irq.crtc_vblank_int[3]) {
7904 drm_handle_vblank(rdev->ddev, 3);
7905 rdev->pm.vblank_sync = true;
7906 wake_up(&rdev->irq.vblank_queue);
7907 }
7908 if (atomic_read(&rdev->irq.pflip[3]))
Christian König1a0e7912014-05-27 16:49:21 +02007909 radeon_crtc_handle_vblank(rdev, 3);
Alex Deuchera59781b2012-11-09 10:45:57 -05007910 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
7911 DRM_DEBUG("IH: D4 vblank\n");
7912 }
7913 break;
7914 case 1: /* D4 vline */
7915 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
7916 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
7917 DRM_DEBUG("IH: D4 vline\n");
7918 }
7919 break;
7920 default:
7921 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7922 break;
7923 }
7924 break;
7925 case 5: /* D5 vblank/vline */
7926 switch (src_data) {
7927 case 0: /* D5 vblank */
7928 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
7929 if (rdev->irq.crtc_vblank_int[4]) {
7930 drm_handle_vblank(rdev->ddev, 4);
7931 rdev->pm.vblank_sync = true;
7932 wake_up(&rdev->irq.vblank_queue);
7933 }
7934 if (atomic_read(&rdev->irq.pflip[4]))
Christian König1a0e7912014-05-27 16:49:21 +02007935 radeon_crtc_handle_vblank(rdev, 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007936 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
7937 DRM_DEBUG("IH: D5 vblank\n");
7938 }
7939 break;
7940 case 1: /* D5 vline */
7941 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
7942 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
7943 DRM_DEBUG("IH: D5 vline\n");
7944 }
7945 break;
7946 default:
7947 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7948 break;
7949 }
7950 break;
7951 case 6: /* D6 vblank/vline */
7952 switch (src_data) {
7953 case 0: /* D6 vblank */
7954 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
7955 if (rdev->irq.crtc_vblank_int[5]) {
7956 drm_handle_vblank(rdev->ddev, 5);
7957 rdev->pm.vblank_sync = true;
7958 wake_up(&rdev->irq.vblank_queue);
7959 }
7960 if (atomic_read(&rdev->irq.pflip[5]))
Christian König1a0e7912014-05-27 16:49:21 +02007961 radeon_crtc_handle_vblank(rdev, 5);
Alex Deuchera59781b2012-11-09 10:45:57 -05007962 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
7963 DRM_DEBUG("IH: D6 vblank\n");
7964 }
7965 break;
7966 case 1: /* D6 vline */
7967 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
7968 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
7969 DRM_DEBUG("IH: D6 vline\n");
7970 }
7971 break;
7972 default:
7973 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7974 break;
7975 }
7976 break;
Christian Königf5d636d2014-04-23 20:46:06 +02007977 case 8: /* D1 page flip */
7978 case 10: /* D2 page flip */
7979 case 12: /* D3 page flip */
7980 case 14: /* D4 page flip */
7981 case 16: /* D5 page flip */
7982 case 18: /* D6 page flip */
7983 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
7984 radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
7985 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05007986 case 42: /* HPD hotplug */
7987 switch (src_data) {
7988 case 0:
7989 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7990 rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT;
7991 queue_hotplug = true;
7992 DRM_DEBUG("IH: HPD1\n");
7993 }
7994 break;
7995 case 1:
7996 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7997 rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT;
7998 queue_hotplug = true;
7999 DRM_DEBUG("IH: HPD2\n");
8000 }
8001 break;
8002 case 2:
8003 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
8004 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
8005 queue_hotplug = true;
8006 DRM_DEBUG("IH: HPD3\n");
8007 }
8008 break;
8009 case 3:
8010 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
8011 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
8012 queue_hotplug = true;
8013 DRM_DEBUG("IH: HPD4\n");
8014 }
8015 break;
8016 case 4:
8017 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
8018 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
8019 queue_hotplug = true;
8020 DRM_DEBUG("IH: HPD5\n");
8021 }
8022 break;
8023 case 5:
8024 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
8025 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
8026 queue_hotplug = true;
8027 DRM_DEBUG("IH: HPD6\n");
8028 }
8029 break;
8030 default:
8031 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8032 break;
8033 }
8034 break;
Christian König6a3808b2013-08-30 11:10:33 +02008035 case 124: /* UVD */
8036 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
8037 radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
8038 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04008039 case 146:
8040 case 147:
Alex Deucher3ec7d112013-06-14 10:42:22 -04008041 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
8042 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
8043 mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
Christian König9b7d7862014-07-07 11:16:29 +02008044 /* reset addr and status */
8045 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
8046 if (addr == 0x0 && status == 0x0)
8047 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04008048 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
8049 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008050 addr);
Alex Deucher9d97c992012-09-06 14:24:48 -04008051 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008052 status);
8053 cik_vm_decode_fault(rdev, status, addr, mc_client);
Alex Deucher9d97c992012-09-06 14:24:48 -04008054 break;
Christian Königd93f7932013-05-23 12:10:04 +02008055 case 167: /* VCE */
8056 DRM_DEBUG("IH: VCE int: 0x%08x\n", src_data);
8057 switch (src_data) {
8058 case 0:
8059 radeon_fence_process(rdev, TN_RING_TYPE_VCE1_INDEX);
8060 break;
8061 case 1:
8062 radeon_fence_process(rdev, TN_RING_TYPE_VCE2_INDEX);
8063 break;
8064 default:
8065 DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
8066 break;
8067 }
8068 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008069 case 176: /* GFX RB CP_INT */
8070 case 177: /* GFX IB CP_INT */
8071 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8072 break;
8073 case 181: /* CP EOP event */
8074 DRM_DEBUG("IH: CP EOP\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008075 /* XXX check the bitfield order! */
8076 me_id = (ring_id & 0x60) >> 5;
8077 pipe_id = (ring_id & 0x18) >> 3;
8078 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008079 switch (me_id) {
8080 case 0:
8081 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8082 break;
8083 case 1:
Alex Deuchera59781b2012-11-09 10:45:57 -05008084 case 2:
Alex Deucher2b0781a2013-04-09 14:26:16 -04008085 if ((cp1_ring->me == me_id) & (cp1_ring->pipe == pipe_id))
8086 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8087 if ((cp2_ring->me == me_id) & (cp2_ring->pipe == pipe_id))
8088 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
Alex Deuchera59781b2012-11-09 10:45:57 -05008089 break;
8090 }
8091 break;
8092 case 184: /* CP Privileged reg access */
8093 DRM_ERROR("Illegal register access in command stream\n");
8094 /* XXX check the bitfield order! */
8095 me_id = (ring_id & 0x60) >> 5;
8096 pipe_id = (ring_id & 0x18) >> 3;
8097 queue_id = (ring_id & 0x7) >> 0;
8098 switch (me_id) {
8099 case 0:
8100 /* This results in a full GPU reset, but all we need to do is soft
8101 * reset the CP for gfx
8102 */
8103 queue_reset = true;
8104 break;
8105 case 1:
8106 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008107 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008108 break;
8109 case 2:
8110 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008111 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008112 break;
8113 }
8114 break;
8115 case 185: /* CP Privileged inst */
8116 DRM_ERROR("Illegal instruction in command stream\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008117 /* XXX check the bitfield order! */
8118 me_id = (ring_id & 0x60) >> 5;
8119 pipe_id = (ring_id & 0x18) >> 3;
8120 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008121 switch (me_id) {
8122 case 0:
8123 /* This results in a full GPU reset, but all we need to do is soft
8124 * reset the CP for gfx
8125 */
8126 queue_reset = true;
8127 break;
8128 case 1:
8129 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008130 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008131 break;
8132 case 2:
8133 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008134 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008135 break;
8136 }
8137 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008138 case 224: /* SDMA trap event */
8139 /* XXX check the bitfield order! */
8140 me_id = (ring_id & 0x3) >> 0;
8141 queue_id = (ring_id & 0xc) >> 2;
8142 DRM_DEBUG("IH: SDMA trap\n");
8143 switch (me_id) {
8144 case 0:
8145 switch (queue_id) {
8146 case 0:
8147 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
8148 break;
8149 case 1:
8150 /* XXX compute */
8151 break;
8152 case 2:
8153 /* XXX compute */
8154 break;
8155 }
8156 break;
8157 case 1:
8158 switch (queue_id) {
8159 case 0:
8160 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8161 break;
8162 case 1:
8163 /* XXX compute */
8164 break;
8165 case 2:
8166 /* XXX compute */
8167 break;
8168 }
8169 break;
8170 }
8171 break;
Alex Deucher41a524a2013-08-14 01:01:40 -04008172 case 230: /* thermal low to high */
8173 DRM_DEBUG("IH: thermal low to high\n");
8174 rdev->pm.dpm.thermal.high_to_low = false;
8175 queue_thermal = true;
8176 break;
8177 case 231: /* thermal high to low */
8178 DRM_DEBUG("IH: thermal high to low\n");
8179 rdev->pm.dpm.thermal.high_to_low = true;
8180 queue_thermal = true;
8181 break;
8182 case 233: /* GUI IDLE */
8183 DRM_DEBUG("IH: GUI idle\n");
8184 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008185 case 241: /* SDMA Privileged inst */
8186 case 247: /* SDMA Privileged inst */
8187 DRM_ERROR("Illegal instruction in SDMA command stream\n");
8188 /* XXX check the bitfield order! */
8189 me_id = (ring_id & 0x3) >> 0;
8190 queue_id = (ring_id & 0xc) >> 2;
8191 switch (me_id) {
8192 case 0:
8193 switch (queue_id) {
8194 case 0:
8195 queue_reset = true;
8196 break;
8197 case 1:
8198 /* XXX compute */
8199 queue_reset = true;
8200 break;
8201 case 2:
8202 /* XXX compute */
8203 queue_reset = true;
8204 break;
8205 }
8206 break;
8207 case 1:
8208 switch (queue_id) {
8209 case 0:
8210 queue_reset = true;
8211 break;
8212 case 1:
8213 /* XXX compute */
8214 queue_reset = true;
8215 break;
8216 case 2:
8217 /* XXX compute */
8218 queue_reset = true;
8219 break;
8220 }
8221 break;
8222 }
8223 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008224 default:
8225 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8226 break;
8227 }
8228
8229 /* wptr/rptr are in bytes! */
8230 rptr += 16;
8231 rptr &= rdev->ih.ptr_mask;
8232 }
8233 if (queue_hotplug)
8234 schedule_work(&rdev->hotplug_work);
8235 if (queue_reset)
8236 schedule_work(&rdev->reset_work);
Alex Deucher41a524a2013-08-14 01:01:40 -04008237 if (queue_thermal)
8238 schedule_work(&rdev->pm.dpm.thermal.work);
Alex Deuchera59781b2012-11-09 10:45:57 -05008239 rdev->ih.rptr = rptr;
8240 WREG32(IH_RB_RPTR, rdev->ih.rptr);
8241 atomic_set(&rdev->ih.lock, 0);
8242
8243 /* make sure wptr hasn't changed while processing */
8244 wptr = cik_get_ih_wptr(rdev);
8245 if (wptr != rptr)
8246 goto restart_ih;
8247
8248 return IRQ_HANDLED;
8249}
Alex Deucher7bf94a22012-08-17 11:48:29 -04008250
8251/*
8252 * startup/shutdown callbacks
8253 */
8254/**
8255 * cik_startup - program the asic to a functional state
8256 *
8257 * @rdev: radeon_device pointer
8258 *
8259 * Programs the asic to a functional state (CIK).
8260 * Called by cik_init() and cik_resume().
8261 * Returns 0 for success, error for failure.
8262 */
8263static int cik_startup(struct radeon_device *rdev)
8264{
8265 struct radeon_ring *ring;
8266 int r;
8267
Alex Deucher8a7cd272013-08-06 11:29:39 -04008268 /* enable pcie gen2/3 link */
8269 cik_pcie_gen3_enable(rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -04008270 /* enable aspm */
8271 cik_program_aspm(rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -04008272
Alex Deuchere5903d32013-08-30 08:58:20 -04008273 /* scratch needs to be initialized before MC */
8274 r = r600_vram_scratch_init(rdev);
8275 if (r)
8276 return r;
8277
Alex Deucher6fab3feb2013-08-04 12:13:17 -04008278 cik_mc_program(rdev);
8279
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008280 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
Alex Deucher7bf94a22012-08-17 11:48:29 -04008281 r = ci_mc_load_microcode(rdev);
8282 if (r) {
8283 DRM_ERROR("Failed to load MC firmware!\n");
8284 return r;
8285 }
8286 }
8287
Alex Deucher7bf94a22012-08-17 11:48:29 -04008288 r = cik_pcie_gart_enable(rdev);
8289 if (r)
8290 return r;
8291 cik_gpu_init(rdev);
8292
8293 /* allocate rlc buffers */
Alex Deucher22c775c2013-07-23 09:41:05 -04008294 if (rdev->flags & RADEON_IS_IGP) {
8295 if (rdev->family == CHIP_KAVERI) {
8296 rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
8297 rdev->rlc.reg_list_size =
8298 (u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
8299 } else {
8300 rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
8301 rdev->rlc.reg_list_size =
8302 (u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
8303 }
8304 }
8305 rdev->rlc.cs_data = ci_cs_data;
8306 rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
Alex Deucher1fd11772013-04-17 17:53:50 -04008307 r = sumo_rlc_init(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008308 if (r) {
8309 DRM_ERROR("Failed to init rlc BOs!\n");
8310 return r;
8311 }
8312
8313 /* allocate wb buffer */
8314 r = radeon_wb_init(rdev);
8315 if (r)
8316 return r;
8317
Alex Deucher963e81f2013-06-26 17:37:11 -04008318 /* allocate mec buffers */
8319 r = cik_mec_init(rdev);
8320 if (r) {
8321 DRM_ERROR("Failed to init MEC BOs!\n");
8322 return r;
8323 }
8324
Alex Deucher7bf94a22012-08-17 11:48:29 -04008325 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
8326 if (r) {
8327 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8328 return r;
8329 }
8330
Alex Deucher963e81f2013-06-26 17:37:11 -04008331 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8332 if (r) {
8333 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8334 return r;
8335 }
8336
8337 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
8338 if (r) {
8339 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8340 return r;
8341 }
8342
Alex Deucher7bf94a22012-08-17 11:48:29 -04008343 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
8344 if (r) {
8345 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8346 return r;
8347 }
8348
8349 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8350 if (r) {
8351 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8352 return r;
8353 }
8354
Alex Deucher2ce529d2013-08-28 18:12:59 -04008355 r = radeon_uvd_resume(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008356 if (!r) {
Alex Deucher2ce529d2013-08-28 18:12:59 -04008357 r = uvd_v4_2_resume(rdev);
8358 if (!r) {
8359 r = radeon_fence_driver_start_ring(rdev,
8360 R600_RING_TYPE_UVD_INDEX);
8361 if (r)
8362 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
8363 }
Christian König87167bb2013-04-09 13:39:21 -04008364 }
8365 if (r)
8366 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
8367
Christian Königd93f7932013-05-23 12:10:04 +02008368 r = radeon_vce_resume(rdev);
8369 if (!r) {
8370 r = vce_v2_0_resume(rdev);
8371 if (!r)
8372 r = radeon_fence_driver_start_ring(rdev,
8373 TN_RING_TYPE_VCE1_INDEX);
8374 if (!r)
8375 r = radeon_fence_driver_start_ring(rdev,
8376 TN_RING_TYPE_VCE2_INDEX);
8377 }
8378 if (r) {
8379 dev_err(rdev->dev, "VCE init error (%d).\n", r);
8380 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
8381 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
8382 }
8383
Alex Deucher7bf94a22012-08-17 11:48:29 -04008384 /* Enable IRQ */
8385 if (!rdev->irq.installed) {
8386 r = radeon_irq_kms_init(rdev);
8387 if (r)
8388 return r;
8389 }
8390
8391 r = cik_irq_init(rdev);
8392 if (r) {
8393 DRM_ERROR("radeon: IH init failed (%d).\n", r);
8394 radeon_irq_kms_fini(rdev);
8395 return r;
8396 }
8397 cik_irq_set(rdev);
8398
8399 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8400 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
Marek Olšák1dac28e2013-10-30 14:41:35 +01008401 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008402 if (r)
8403 return r;
8404
Alex Deucher963e81f2013-06-26 17:37:11 -04008405 /* set up the compute queues */
Alex Deucher2615b532013-06-03 11:21:58 -04008406 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008407 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8408 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008409 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher963e81f2013-06-26 17:37:11 -04008410 if (r)
8411 return r;
8412 ring->me = 1; /* first MEC */
8413 ring->pipe = 0; /* first pipe */
8414 ring->queue = 0; /* first queue */
8415 ring->wptr_offs = CIK_WB_CP1_WPTR_OFFSET;
8416
Alex Deucher2615b532013-06-03 11:21:58 -04008417 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008418 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8419 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008420 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher963e81f2013-06-26 17:37:11 -04008421 if (r)
8422 return r;
8423 /* dGPU only have 1 MEC */
8424 ring->me = 1; /* first MEC */
8425 ring->pipe = 0; /* first pipe */
8426 ring->queue = 1; /* second queue */
8427 ring->wptr_offs = CIK_WB_CP2_WPTR_OFFSET;
8428
Alex Deucher7bf94a22012-08-17 11:48:29 -04008429 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8430 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008431 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008432 if (r)
8433 return r;
8434
8435 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8436 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008437 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008438 if (r)
8439 return r;
8440
8441 r = cik_cp_resume(rdev);
8442 if (r)
8443 return r;
8444
8445 r = cik_sdma_resume(rdev);
8446 if (r)
8447 return r;
8448
Christian König87167bb2013-04-09 13:39:21 -04008449 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8450 if (ring->ring_size) {
Christian König02c9f7f2013-08-13 11:56:51 +02008451 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
Christian König2e1e6da2013-08-13 11:56:52 +02008452 RADEON_CP_PACKET2);
Christian König87167bb2013-04-09 13:39:21 -04008453 if (!r)
Christian Könige409b122013-08-13 11:56:53 +02008454 r = uvd_v1_0_init(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008455 if (r)
8456 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
8457 }
8458
Christian Königd93f7932013-05-23 12:10:04 +02008459 r = -ENOENT;
8460
8461 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8462 if (ring->ring_size)
8463 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8464 VCE_CMD_NO_OP);
8465
8466 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8467 if (ring->ring_size)
8468 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8469 VCE_CMD_NO_OP);
8470
8471 if (!r)
8472 r = vce_v1_0_init(rdev);
8473 else if (r != -ENOENT)
8474 DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
8475
Alex Deucher7bf94a22012-08-17 11:48:29 -04008476 r = radeon_ib_pool_init(rdev);
8477 if (r) {
8478 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
8479 return r;
8480 }
8481
8482 r = radeon_vm_manager_init(rdev);
8483 if (r) {
8484 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
8485 return r;
8486 }
8487
Alex Deucherb5306022013-07-31 16:51:33 -04008488 r = dce6_audio_init(rdev);
8489 if (r)
8490 return r;
8491
Alex Deucher7bf94a22012-08-17 11:48:29 -04008492 return 0;
8493}
8494
8495/**
8496 * cik_resume - resume the asic to a functional state
8497 *
8498 * @rdev: radeon_device pointer
8499 *
8500 * Programs the asic to a functional state (CIK).
8501 * Called at resume.
8502 * Returns 0 for success, error for failure.
8503 */
8504int cik_resume(struct radeon_device *rdev)
8505{
8506 int r;
8507
8508 /* post card */
8509 atom_asic_init(rdev->mode_info.atom_context);
8510
Alex Deucher0aafd312013-04-09 14:43:30 -04008511 /* init golden registers */
8512 cik_init_golden_registers(rdev);
8513
Alex Deucherbc6a6292014-02-25 12:01:28 -05008514 if (rdev->pm.pm_method == PM_METHOD_DPM)
8515 radeon_pm_resume(rdev);
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008516
Alex Deucher7bf94a22012-08-17 11:48:29 -04008517 rdev->accel_working = true;
8518 r = cik_startup(rdev);
8519 if (r) {
8520 DRM_ERROR("cik startup failed on resume\n");
8521 rdev->accel_working = false;
8522 return r;
8523 }
8524
8525 return r;
8526
8527}
8528
8529/**
8530 * cik_suspend - suspend the asic
8531 *
8532 * @rdev: radeon_device pointer
8533 *
8534 * Bring the chip into a state suitable for suspend (CIK).
8535 * Called at suspend.
8536 * Returns 0 for success.
8537 */
8538int cik_suspend(struct radeon_device *rdev)
8539{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008540 radeon_pm_suspend(rdev);
Alex Deucherb5306022013-07-31 16:51:33 -04008541 dce6_audio_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008542 radeon_vm_manager_fini(rdev);
8543 cik_cp_enable(rdev, false);
8544 cik_sdma_enable(rdev, false);
Christian Könige409b122013-08-13 11:56:53 +02008545 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008546 radeon_uvd_suspend(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008547 radeon_vce_suspend(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008548 cik_fini_pg(rdev);
8549 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008550 cik_irq_suspend(rdev);
8551 radeon_wb_disable(rdev);
8552 cik_pcie_gart_disable(rdev);
8553 return 0;
8554}
8555
8556/* Plan is to move initialization in that function and use
8557 * helper function so that radeon_device_init pretty much
8558 * do nothing more than calling asic specific function. This
8559 * should also allow to remove a bunch of callback function
8560 * like vram_info.
8561 */
8562/**
8563 * cik_init - asic specific driver and hw init
8564 *
8565 * @rdev: radeon_device pointer
8566 *
8567 * Setup asic specific driver variables and program the hw
8568 * to a functional state (CIK).
8569 * Called at driver startup.
8570 * Returns 0 for success, errors for failure.
8571 */
8572int cik_init(struct radeon_device *rdev)
8573{
8574 struct radeon_ring *ring;
8575 int r;
8576
8577 /* Read BIOS */
8578 if (!radeon_get_bios(rdev)) {
8579 if (ASIC_IS_AVIVO(rdev))
8580 return -EINVAL;
8581 }
8582 /* Must be an ATOMBIOS */
8583 if (!rdev->is_atom_bios) {
8584 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
8585 return -EINVAL;
8586 }
8587 r = radeon_atombios_init(rdev);
8588 if (r)
8589 return r;
8590
8591 /* Post card if necessary */
8592 if (!radeon_card_posted(rdev)) {
8593 if (!rdev->bios) {
8594 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
8595 return -EINVAL;
8596 }
8597 DRM_INFO("GPU not posted. posting now...\n");
8598 atom_asic_init(rdev->mode_info.atom_context);
8599 }
Alex Deucher0aafd312013-04-09 14:43:30 -04008600 /* init golden registers */
8601 cik_init_golden_registers(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008602 /* Initialize scratch registers */
8603 cik_scratch_init(rdev);
8604 /* Initialize surface registers */
8605 radeon_surface_init(rdev);
8606 /* Initialize clocks */
8607 radeon_get_clock_info(rdev->ddev);
8608
8609 /* Fence driver */
8610 r = radeon_fence_driver_init(rdev);
8611 if (r)
8612 return r;
8613
8614 /* initialize memory controller */
8615 r = cik_mc_init(rdev);
8616 if (r)
8617 return r;
8618 /* Memory manager */
8619 r = radeon_bo_init(rdev);
8620 if (r)
8621 return r;
8622
Alex Deucher01ac8792013-12-18 19:11:27 -05008623 if (rdev->flags & RADEON_IS_IGP) {
8624 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8625 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
8626 r = cik_init_microcode(rdev);
8627 if (r) {
8628 DRM_ERROR("Failed to load firmware!\n");
8629 return r;
8630 }
8631 }
8632 } else {
8633 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8634 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
8635 !rdev->mc_fw) {
8636 r = cik_init_microcode(rdev);
8637 if (r) {
8638 DRM_ERROR("Failed to load firmware!\n");
8639 return r;
8640 }
8641 }
8642 }
8643
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008644 /* Initialize power management */
8645 radeon_pm_init(rdev);
8646
Alex Deucher7bf94a22012-08-17 11:48:29 -04008647 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8648 ring->ring_obj = NULL;
8649 r600_ring_init(rdev, ring, 1024 * 1024);
8650
Alex Deucher963e81f2013-06-26 17:37:11 -04008651 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8652 ring->ring_obj = NULL;
8653 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008654 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008655 if (r)
8656 return r;
8657
8658 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8659 ring->ring_obj = NULL;
8660 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008661 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008662 if (r)
8663 return r;
8664
Alex Deucher7bf94a22012-08-17 11:48:29 -04008665 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8666 ring->ring_obj = NULL;
8667 r600_ring_init(rdev, ring, 256 * 1024);
8668
8669 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8670 ring->ring_obj = NULL;
8671 r600_ring_init(rdev, ring, 256 * 1024);
8672
Christian König87167bb2013-04-09 13:39:21 -04008673 r = radeon_uvd_init(rdev);
8674 if (!r) {
8675 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8676 ring->ring_obj = NULL;
8677 r600_ring_init(rdev, ring, 4096);
8678 }
8679
Christian Königd93f7932013-05-23 12:10:04 +02008680 r = radeon_vce_init(rdev);
8681 if (!r) {
8682 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8683 ring->ring_obj = NULL;
8684 r600_ring_init(rdev, ring, 4096);
8685
8686 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8687 ring->ring_obj = NULL;
8688 r600_ring_init(rdev, ring, 4096);
8689 }
8690
Alex Deucher7bf94a22012-08-17 11:48:29 -04008691 rdev->ih.ring_obj = NULL;
8692 r600_ih_ring_init(rdev, 64 * 1024);
8693
8694 r = r600_pcie_gart_init(rdev);
8695 if (r)
8696 return r;
8697
8698 rdev->accel_working = true;
8699 r = cik_startup(rdev);
8700 if (r) {
8701 dev_err(rdev->dev, "disabling GPU acceleration\n");
8702 cik_cp_fini(rdev);
8703 cik_sdma_fini(rdev);
8704 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008705 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008706 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008707 radeon_wb_fini(rdev);
8708 radeon_ib_pool_fini(rdev);
8709 radeon_vm_manager_fini(rdev);
8710 radeon_irq_kms_fini(rdev);
8711 cik_pcie_gart_fini(rdev);
8712 rdev->accel_working = false;
8713 }
8714
8715 /* Don't start up if the MC ucode is missing.
8716 * The default clocks and voltages before the MC ucode
8717 * is loaded are not suffient for advanced operations.
8718 */
8719 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
8720 DRM_ERROR("radeon: MC ucode required for NI+.\n");
8721 return -EINVAL;
8722 }
8723
8724 return 0;
8725}
8726
8727/**
8728 * cik_fini - asic specific driver and hw fini
8729 *
8730 * @rdev: radeon_device pointer
8731 *
8732 * Tear down the asic specific driver variables and program the hw
8733 * to an idle state (CIK).
8734 * Called at driver unload.
8735 */
8736void cik_fini(struct radeon_device *rdev)
8737{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008738 radeon_pm_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008739 cik_cp_fini(rdev);
8740 cik_sdma_fini(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008741 cik_fini_pg(rdev);
8742 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008743 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008744 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008745 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008746 radeon_wb_fini(rdev);
8747 radeon_vm_manager_fini(rdev);
8748 radeon_ib_pool_fini(rdev);
8749 radeon_irq_kms_fini(rdev);
Christian Könige409b122013-08-13 11:56:53 +02008750 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008751 radeon_uvd_fini(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008752 radeon_vce_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008753 cik_pcie_gart_fini(rdev);
8754 r600_vram_scratch_fini(rdev);
8755 radeon_gem_fini(rdev);
8756 radeon_fence_driver_fini(rdev);
8757 radeon_bo_fini(rdev);
8758 radeon_atombios_fini(rdev);
8759 kfree(rdev->bios);
8760 rdev->bios = NULL;
8761}
Alex Deuchercd84a272012-07-20 17:13:13 -04008762
Alex Deucher134b4802013-09-23 12:22:11 -04008763void dce8_program_fmt(struct drm_encoder *encoder)
8764{
8765 struct drm_device *dev = encoder->dev;
8766 struct radeon_device *rdev = dev->dev_private;
8767 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
8768 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
8769 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
8770 int bpc = 0;
8771 u32 tmp = 0;
Alex Deucher6214bb72013-09-24 17:26:26 -04008772 enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
Alex Deucher134b4802013-09-23 12:22:11 -04008773
Alex Deucher6214bb72013-09-24 17:26:26 -04008774 if (connector) {
8775 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
Alex Deucher134b4802013-09-23 12:22:11 -04008776 bpc = radeon_get_monitor_bpc(connector);
Alex Deucher6214bb72013-09-24 17:26:26 -04008777 dither = radeon_connector->dither;
8778 }
Alex Deucher134b4802013-09-23 12:22:11 -04008779
8780 /* LVDS/eDP FMT is set up by atom */
8781 if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
8782 return;
8783
8784 /* not needed for analog */
8785 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
8786 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
8787 return;
8788
8789 if (bpc == 0)
8790 return;
8791
8792 switch (bpc) {
8793 case 6:
Alex Deucher6214bb72013-09-24 17:26:26 -04008794 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008795 /* XXX sort out optimal dither settings */
8796 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8797 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(0));
8798 else
8799 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(0));
8800 break;
8801 case 8:
Alex Deucher6214bb72013-09-24 17:26:26 -04008802 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008803 /* XXX sort out optimal dither settings */
8804 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8805 FMT_RGB_RANDOM_ENABLE |
8806 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(1));
8807 else
8808 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(1));
8809 break;
8810 case 10:
Alex Deucher6214bb72013-09-24 17:26:26 -04008811 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008812 /* XXX sort out optimal dither settings */
8813 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8814 FMT_RGB_RANDOM_ENABLE |
8815 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(2));
8816 else
8817 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(2));
8818 break;
8819 default:
8820 /* not needed */
8821 break;
8822 }
8823
8824 WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
8825}
8826
Alex Deuchercd84a272012-07-20 17:13:13 -04008827/* display watermark setup */
8828/**
8829 * dce8_line_buffer_adjust - Set up the line buffer
8830 *
8831 * @rdev: radeon_device pointer
8832 * @radeon_crtc: the selected display controller
8833 * @mode: the current display mode on the selected display
8834 * controller
8835 *
8836 * Setup up the line buffer allocation for
8837 * the selected display controller (CIK).
8838 * Returns the line buffer size in pixels.
8839 */
8840static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
8841 struct radeon_crtc *radeon_crtc,
8842 struct drm_display_mode *mode)
8843{
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008844 u32 tmp, buffer_alloc, i;
8845 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
Alex Deuchercd84a272012-07-20 17:13:13 -04008846 /*
8847 * Line Buffer Setup
8848 * There are 6 line buffers, one for each display controllers.
8849 * There are 3 partitions per LB. Select the number of partitions
8850 * to enable based on the display width. For display widths larger
8851 * than 4096, you need use to use 2 display controllers and combine
8852 * them using the stereo blender.
8853 */
8854 if (radeon_crtc->base.enabled && mode) {
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008855 if (mode->crtc_hdisplay < 1920) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008856 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008857 buffer_alloc = 2;
8858 } else if (mode->crtc_hdisplay < 2560) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008859 tmp = 2;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008860 buffer_alloc = 2;
8861 } else if (mode->crtc_hdisplay < 4096) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008862 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008863 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
8864 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008865 DRM_DEBUG_KMS("Mode too big for LB!\n");
8866 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008867 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
Alex Deuchercd84a272012-07-20 17:13:13 -04008868 }
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008869 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008870 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008871 buffer_alloc = 0;
8872 }
Alex Deuchercd84a272012-07-20 17:13:13 -04008873
8874 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
8875 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
8876
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008877 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
8878 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
8879 for (i = 0; i < rdev->usec_timeout; i++) {
8880 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
8881 DMIF_BUFFERS_ALLOCATED_COMPLETED)
8882 break;
8883 udelay(1);
8884 }
8885
Alex Deuchercd84a272012-07-20 17:13:13 -04008886 if (radeon_crtc->base.enabled && mode) {
8887 switch (tmp) {
8888 case 0:
8889 default:
8890 return 4096 * 2;
8891 case 1:
8892 return 1920 * 2;
8893 case 2:
8894 return 2560 * 2;
8895 }
8896 }
8897
8898 /* controller not enabled, so no lb used */
8899 return 0;
8900}
8901
8902/**
8903 * cik_get_number_of_dram_channels - get the number of dram channels
8904 *
8905 * @rdev: radeon_device pointer
8906 *
8907 * Look up the number of video ram channels (CIK).
8908 * Used for display watermark bandwidth calculations
8909 * Returns the number of dram channels
8910 */
8911static u32 cik_get_number_of_dram_channels(struct radeon_device *rdev)
8912{
8913 u32 tmp = RREG32(MC_SHARED_CHMAP);
8914
8915 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
8916 case 0:
8917 default:
8918 return 1;
8919 case 1:
8920 return 2;
8921 case 2:
8922 return 4;
8923 case 3:
8924 return 8;
8925 case 4:
8926 return 3;
8927 case 5:
8928 return 6;
8929 case 6:
8930 return 10;
8931 case 7:
8932 return 12;
8933 case 8:
8934 return 16;
8935 }
8936}
8937
8938struct dce8_wm_params {
8939 u32 dram_channels; /* number of dram channels */
8940 u32 yclk; /* bandwidth per dram data pin in kHz */
8941 u32 sclk; /* engine clock in kHz */
8942 u32 disp_clk; /* display clock in kHz */
8943 u32 src_width; /* viewport width */
8944 u32 active_time; /* active display time in ns */
8945 u32 blank_time; /* blank time in ns */
8946 bool interlaced; /* mode is interlaced */
8947 fixed20_12 vsc; /* vertical scale ratio */
8948 u32 num_heads; /* number of active crtcs */
8949 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
8950 u32 lb_size; /* line buffer allocated to pipe */
8951 u32 vtaps; /* vertical scaler taps */
8952};
8953
8954/**
8955 * dce8_dram_bandwidth - get the dram bandwidth
8956 *
8957 * @wm: watermark calculation data
8958 *
8959 * Calculate the raw dram bandwidth (CIK).
8960 * Used for display watermark bandwidth calculations
8961 * Returns the dram bandwidth in MBytes/s
8962 */
8963static u32 dce8_dram_bandwidth(struct dce8_wm_params *wm)
8964{
8965 /* Calculate raw DRAM Bandwidth */
8966 fixed20_12 dram_efficiency; /* 0.7 */
8967 fixed20_12 yclk, dram_channels, bandwidth;
8968 fixed20_12 a;
8969
8970 a.full = dfixed_const(1000);
8971 yclk.full = dfixed_const(wm->yclk);
8972 yclk.full = dfixed_div(yclk, a);
8973 dram_channels.full = dfixed_const(wm->dram_channels * 4);
8974 a.full = dfixed_const(10);
8975 dram_efficiency.full = dfixed_const(7);
8976 dram_efficiency.full = dfixed_div(dram_efficiency, a);
8977 bandwidth.full = dfixed_mul(dram_channels, yclk);
8978 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
8979
8980 return dfixed_trunc(bandwidth);
8981}
8982
8983/**
8984 * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
8985 *
8986 * @wm: watermark calculation data
8987 *
8988 * Calculate the dram bandwidth used for display (CIK).
8989 * Used for display watermark bandwidth calculations
8990 * Returns the dram bandwidth for display in MBytes/s
8991 */
8992static u32 dce8_dram_bandwidth_for_display(struct dce8_wm_params *wm)
8993{
8994 /* Calculate DRAM Bandwidth and the part allocated to display. */
8995 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
8996 fixed20_12 yclk, dram_channels, bandwidth;
8997 fixed20_12 a;
8998
8999 a.full = dfixed_const(1000);
9000 yclk.full = dfixed_const(wm->yclk);
9001 yclk.full = dfixed_div(yclk, a);
9002 dram_channels.full = dfixed_const(wm->dram_channels * 4);
9003 a.full = dfixed_const(10);
9004 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
9005 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
9006 bandwidth.full = dfixed_mul(dram_channels, yclk);
9007 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
9008
9009 return dfixed_trunc(bandwidth);
9010}
9011
9012/**
9013 * dce8_data_return_bandwidth - get the data return bandwidth
9014 *
9015 * @wm: watermark calculation data
9016 *
9017 * Calculate the data return bandwidth used for display (CIK).
9018 * Used for display watermark bandwidth calculations
9019 * Returns the data return bandwidth in MBytes/s
9020 */
9021static u32 dce8_data_return_bandwidth(struct dce8_wm_params *wm)
9022{
9023 /* Calculate the display Data return Bandwidth */
9024 fixed20_12 return_efficiency; /* 0.8 */
9025 fixed20_12 sclk, bandwidth;
9026 fixed20_12 a;
9027
9028 a.full = dfixed_const(1000);
9029 sclk.full = dfixed_const(wm->sclk);
9030 sclk.full = dfixed_div(sclk, a);
9031 a.full = dfixed_const(10);
9032 return_efficiency.full = dfixed_const(8);
9033 return_efficiency.full = dfixed_div(return_efficiency, a);
9034 a.full = dfixed_const(32);
9035 bandwidth.full = dfixed_mul(a, sclk);
9036 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
9037
9038 return dfixed_trunc(bandwidth);
9039}
9040
9041/**
9042 * dce8_dmif_request_bandwidth - get the dmif bandwidth
9043 *
9044 * @wm: watermark calculation data
9045 *
9046 * Calculate the dmif bandwidth used for display (CIK).
9047 * Used for display watermark bandwidth calculations
9048 * Returns the dmif bandwidth in MBytes/s
9049 */
9050static u32 dce8_dmif_request_bandwidth(struct dce8_wm_params *wm)
9051{
9052 /* Calculate the DMIF Request Bandwidth */
9053 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
9054 fixed20_12 disp_clk, bandwidth;
9055 fixed20_12 a, b;
9056
9057 a.full = dfixed_const(1000);
9058 disp_clk.full = dfixed_const(wm->disp_clk);
9059 disp_clk.full = dfixed_div(disp_clk, a);
9060 a.full = dfixed_const(32);
9061 b.full = dfixed_mul(a, disp_clk);
9062
9063 a.full = dfixed_const(10);
9064 disp_clk_request_efficiency.full = dfixed_const(8);
9065 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
9066
9067 bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
9068
9069 return dfixed_trunc(bandwidth);
9070}
9071
9072/**
9073 * dce8_available_bandwidth - get the min available bandwidth
9074 *
9075 * @wm: watermark calculation data
9076 *
9077 * Calculate the min available bandwidth used for display (CIK).
9078 * Used for display watermark bandwidth calculations
9079 * Returns the min available bandwidth in MBytes/s
9080 */
9081static u32 dce8_available_bandwidth(struct dce8_wm_params *wm)
9082{
9083 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
9084 u32 dram_bandwidth = dce8_dram_bandwidth(wm);
9085 u32 data_return_bandwidth = dce8_data_return_bandwidth(wm);
9086 u32 dmif_req_bandwidth = dce8_dmif_request_bandwidth(wm);
9087
9088 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
9089}
9090
9091/**
9092 * dce8_average_bandwidth - get the average available bandwidth
9093 *
9094 * @wm: watermark calculation data
9095 *
9096 * Calculate the average available bandwidth used for display (CIK).
9097 * Used for display watermark bandwidth calculations
9098 * Returns the average available bandwidth in MBytes/s
9099 */
9100static u32 dce8_average_bandwidth(struct dce8_wm_params *wm)
9101{
9102 /* Calculate the display mode Average Bandwidth
9103 * DisplayMode should contain the source and destination dimensions,
9104 * timing, etc.
9105 */
9106 fixed20_12 bpp;
9107 fixed20_12 line_time;
9108 fixed20_12 src_width;
9109 fixed20_12 bandwidth;
9110 fixed20_12 a;
9111
9112 a.full = dfixed_const(1000);
9113 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
9114 line_time.full = dfixed_div(line_time, a);
9115 bpp.full = dfixed_const(wm->bytes_per_pixel);
9116 src_width.full = dfixed_const(wm->src_width);
9117 bandwidth.full = dfixed_mul(src_width, bpp);
9118 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
9119 bandwidth.full = dfixed_div(bandwidth, line_time);
9120
9121 return dfixed_trunc(bandwidth);
9122}
9123
9124/**
9125 * dce8_latency_watermark - get the latency watermark
9126 *
9127 * @wm: watermark calculation data
9128 *
9129 * Calculate the latency watermark (CIK).
9130 * Used for display watermark bandwidth calculations
9131 * Returns the latency watermark in ns
9132 */
9133static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
9134{
9135 /* First calculate the latency in ns */
9136 u32 mc_latency = 2000; /* 2000 ns. */
9137 u32 available_bandwidth = dce8_available_bandwidth(wm);
9138 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
9139 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
9140 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
9141 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
9142 (wm->num_heads * cursor_line_pair_return_time);
9143 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
9144 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
9145 u32 tmp, dmif_size = 12288;
9146 fixed20_12 a, b, c;
9147
9148 if (wm->num_heads == 0)
9149 return 0;
9150
9151 a.full = dfixed_const(2);
9152 b.full = dfixed_const(1);
9153 if ((wm->vsc.full > a.full) ||
9154 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
9155 (wm->vtaps >= 5) ||
9156 ((wm->vsc.full >= a.full) && wm->interlaced))
9157 max_src_lines_per_dst_line = 4;
9158 else
9159 max_src_lines_per_dst_line = 2;
9160
9161 a.full = dfixed_const(available_bandwidth);
9162 b.full = dfixed_const(wm->num_heads);
9163 a.full = dfixed_div(a, b);
9164
9165 b.full = dfixed_const(mc_latency + 512);
9166 c.full = dfixed_const(wm->disp_clk);
9167 b.full = dfixed_div(b, c);
9168
9169 c.full = dfixed_const(dmif_size);
9170 b.full = dfixed_div(c, b);
9171
9172 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
9173
9174 b.full = dfixed_const(1000);
9175 c.full = dfixed_const(wm->disp_clk);
9176 b.full = dfixed_div(c, b);
9177 c.full = dfixed_const(wm->bytes_per_pixel);
9178 b.full = dfixed_mul(b, c);
9179
9180 lb_fill_bw = min(tmp, dfixed_trunc(b));
9181
9182 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
9183 b.full = dfixed_const(1000);
9184 c.full = dfixed_const(lb_fill_bw);
9185 b.full = dfixed_div(c, b);
9186 a.full = dfixed_div(a, b);
9187 line_fill_time = dfixed_trunc(a);
9188
9189 if (line_fill_time < wm->active_time)
9190 return latency;
9191 else
9192 return latency + (line_fill_time - wm->active_time);
9193
9194}
9195
9196/**
9197 * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
9198 * average and available dram bandwidth
9199 *
9200 * @wm: watermark calculation data
9201 *
9202 * Check if the display average bandwidth fits in the display
9203 * dram bandwidth (CIK).
9204 * Used for display watermark bandwidth calculations
9205 * Returns true if the display fits, false if not.
9206 */
9207static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9208{
9209 if (dce8_average_bandwidth(wm) <=
9210 (dce8_dram_bandwidth_for_display(wm) / wm->num_heads))
9211 return true;
9212 else
9213 return false;
9214}
9215
9216/**
9217 * dce8_average_bandwidth_vs_available_bandwidth - check
9218 * average and available bandwidth
9219 *
9220 * @wm: watermark calculation data
9221 *
9222 * Check if the display average bandwidth fits in the display
9223 * available bandwidth (CIK).
9224 * Used for display watermark bandwidth calculations
9225 * Returns true if the display fits, false if not.
9226 */
9227static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params *wm)
9228{
9229 if (dce8_average_bandwidth(wm) <=
9230 (dce8_available_bandwidth(wm) / wm->num_heads))
9231 return true;
9232 else
9233 return false;
9234}
9235
9236/**
9237 * dce8_check_latency_hiding - check latency hiding
9238 *
9239 * @wm: watermark calculation data
9240 *
9241 * Check latency hiding (CIK).
9242 * Used for display watermark bandwidth calculations
9243 * Returns true if the display fits, false if not.
9244 */
9245static bool dce8_check_latency_hiding(struct dce8_wm_params *wm)
9246{
9247 u32 lb_partitions = wm->lb_size / wm->src_width;
9248 u32 line_time = wm->active_time + wm->blank_time;
9249 u32 latency_tolerant_lines;
9250 u32 latency_hiding;
9251 fixed20_12 a;
9252
9253 a.full = dfixed_const(1);
9254 if (wm->vsc.full > a.full)
9255 latency_tolerant_lines = 1;
9256 else {
9257 if (lb_partitions <= (wm->vtaps + 1))
9258 latency_tolerant_lines = 1;
9259 else
9260 latency_tolerant_lines = 2;
9261 }
9262
9263 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
9264
9265 if (dce8_latency_watermark(wm) <= latency_hiding)
9266 return true;
9267 else
9268 return false;
9269}
9270
9271/**
9272 * dce8_program_watermarks - program display watermarks
9273 *
9274 * @rdev: radeon_device pointer
9275 * @radeon_crtc: the selected display controller
9276 * @lb_size: line buffer size
9277 * @num_heads: number of display controllers in use
9278 *
9279 * Calculate and program the display watermarks for the
9280 * selected display controller (CIK).
9281 */
9282static void dce8_program_watermarks(struct radeon_device *rdev,
9283 struct radeon_crtc *radeon_crtc,
9284 u32 lb_size, u32 num_heads)
9285{
9286 struct drm_display_mode *mode = &radeon_crtc->base.mode;
Alex Deucher58ea2de2013-01-24 10:03:39 -05009287 struct dce8_wm_params wm_low, wm_high;
Alex Deuchercd84a272012-07-20 17:13:13 -04009288 u32 pixel_period;
9289 u32 line_time = 0;
9290 u32 latency_watermark_a = 0, latency_watermark_b = 0;
9291 u32 tmp, wm_mask;
9292
9293 if (radeon_crtc->base.enabled && num_heads && mode) {
9294 pixel_period = 1000000 / (u32)mode->clock;
9295 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
9296
Alex Deucher58ea2de2013-01-24 10:03:39 -05009297 /* watermark for high clocks */
9298 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9299 rdev->pm.dpm_enabled) {
9300 wm_high.yclk =
9301 radeon_dpm_get_mclk(rdev, false) * 10;
9302 wm_high.sclk =
9303 radeon_dpm_get_sclk(rdev, false) * 10;
9304 } else {
9305 wm_high.yclk = rdev->pm.current_mclk * 10;
9306 wm_high.sclk = rdev->pm.current_sclk * 10;
9307 }
9308
9309 wm_high.disp_clk = mode->clock;
9310 wm_high.src_width = mode->crtc_hdisplay;
9311 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
9312 wm_high.blank_time = line_time - wm_high.active_time;
9313 wm_high.interlaced = false;
Alex Deuchercd84a272012-07-20 17:13:13 -04009314 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009315 wm_high.interlaced = true;
9316 wm_high.vsc = radeon_crtc->vsc;
9317 wm_high.vtaps = 1;
Alex Deuchercd84a272012-07-20 17:13:13 -04009318 if (radeon_crtc->rmx_type != RMX_OFF)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009319 wm_high.vtaps = 2;
9320 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
9321 wm_high.lb_size = lb_size;
9322 wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
9323 wm_high.num_heads = num_heads;
Alex Deuchercd84a272012-07-20 17:13:13 -04009324
9325 /* set for high clocks */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009326 latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
Alex Deuchercd84a272012-07-20 17:13:13 -04009327
9328 /* possibly force display priority to high */
9329 /* should really do this at mode validation time... */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009330 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
9331 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
9332 !dce8_check_latency_hiding(&wm_high) ||
9333 (rdev->disp_priority == 2)) {
9334 DRM_DEBUG_KMS("force priority to high\n");
9335 }
9336
9337 /* watermark for low clocks */
9338 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9339 rdev->pm.dpm_enabled) {
9340 wm_low.yclk =
9341 radeon_dpm_get_mclk(rdev, true) * 10;
9342 wm_low.sclk =
9343 radeon_dpm_get_sclk(rdev, true) * 10;
9344 } else {
9345 wm_low.yclk = rdev->pm.current_mclk * 10;
9346 wm_low.sclk = rdev->pm.current_sclk * 10;
9347 }
9348
9349 wm_low.disp_clk = mode->clock;
9350 wm_low.src_width = mode->crtc_hdisplay;
9351 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
9352 wm_low.blank_time = line_time - wm_low.active_time;
9353 wm_low.interlaced = false;
9354 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
9355 wm_low.interlaced = true;
9356 wm_low.vsc = radeon_crtc->vsc;
9357 wm_low.vtaps = 1;
9358 if (radeon_crtc->rmx_type != RMX_OFF)
9359 wm_low.vtaps = 2;
9360 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
9361 wm_low.lb_size = lb_size;
9362 wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
9363 wm_low.num_heads = num_heads;
9364
9365 /* set for low clocks */
9366 latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
9367
9368 /* possibly force display priority to high */
9369 /* should really do this at mode validation time... */
9370 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
9371 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
9372 !dce8_check_latency_hiding(&wm_low) ||
Alex Deuchercd84a272012-07-20 17:13:13 -04009373 (rdev->disp_priority == 2)) {
9374 DRM_DEBUG_KMS("force priority to high\n");
9375 }
9376 }
9377
9378 /* select wm A */
9379 wm_mask = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9380 tmp = wm_mask;
9381 tmp &= ~LATENCY_WATERMARK_MASK(3);
9382 tmp |= LATENCY_WATERMARK_MASK(1);
9383 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9384 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9385 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
9386 LATENCY_HIGH_WATERMARK(line_time)));
9387 /* select wm B */
9388 tmp = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9389 tmp &= ~LATENCY_WATERMARK_MASK(3);
9390 tmp |= LATENCY_WATERMARK_MASK(2);
9391 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9392 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9393 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
9394 LATENCY_HIGH_WATERMARK(line_time)));
9395 /* restore original selection */
9396 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
Alex Deucher58ea2de2013-01-24 10:03:39 -05009397
9398 /* save values for DPM */
9399 radeon_crtc->line_time = line_time;
9400 radeon_crtc->wm_high = latency_watermark_a;
9401 radeon_crtc->wm_low = latency_watermark_b;
Alex Deuchercd84a272012-07-20 17:13:13 -04009402}
9403
9404/**
9405 * dce8_bandwidth_update - program display watermarks
9406 *
9407 * @rdev: radeon_device pointer
9408 *
9409 * Calculate and program the display watermarks and line
9410 * buffer allocation (CIK).
9411 */
9412void dce8_bandwidth_update(struct radeon_device *rdev)
9413{
9414 struct drm_display_mode *mode = NULL;
9415 u32 num_heads = 0, lb_size;
9416 int i;
9417
9418 radeon_update_display_priority(rdev);
9419
9420 for (i = 0; i < rdev->num_crtc; i++) {
9421 if (rdev->mode_info.crtcs[i]->base.enabled)
9422 num_heads++;
9423 }
9424 for (i = 0; i < rdev->num_crtc; i++) {
9425 mode = &rdev->mode_info.crtcs[i]->base.mode;
9426 lb_size = dce8_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode);
9427 dce8_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
9428 }
9429}
Alex Deucher44fa3462012-12-18 22:17:00 -05009430
9431/**
9432 * cik_get_gpu_clock_counter - return GPU clock counter snapshot
9433 *
9434 * @rdev: radeon_device pointer
9435 *
9436 * Fetches a GPU clock counter snapshot (SI).
9437 * Returns the 64 bit clock counter snapshot.
9438 */
9439uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
9440{
9441 uint64_t clock;
9442
9443 mutex_lock(&rdev->gpu_clock_mutex);
9444 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
9445 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
9446 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
9447 mutex_unlock(&rdev->gpu_clock_mutex);
9448 return clock;
9449}
9450
Christian König87167bb2013-04-09 13:39:21 -04009451static int cik_set_uvd_clock(struct radeon_device *rdev, u32 clock,
9452 u32 cntl_reg, u32 status_reg)
9453{
9454 int r, i;
9455 struct atom_clock_dividers dividers;
9456 uint32_t tmp;
9457
9458 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9459 clock, false, &dividers);
9460 if (r)
9461 return r;
9462
9463 tmp = RREG32_SMC(cntl_reg);
9464 tmp &= ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK);
9465 tmp |= dividers.post_divider;
9466 WREG32_SMC(cntl_reg, tmp);
9467
9468 for (i = 0; i < 100; i++) {
9469 if (RREG32_SMC(status_reg) & DCLK_STATUS)
9470 break;
9471 mdelay(10);
9472 }
9473 if (i == 100)
9474 return -ETIMEDOUT;
9475
9476 return 0;
9477}
9478
9479int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
9480{
9481 int r = 0;
9482
9483 r = cik_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
9484 if (r)
9485 return r;
9486
9487 r = cik_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
9488 return r;
9489}
9490
Alex Deucher5ad6bf92013-08-22 17:09:06 -04009491int cik_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
9492{
9493 int r, i;
9494 struct atom_clock_dividers dividers;
9495 u32 tmp;
9496
9497 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9498 ecclk, false, &dividers);
9499 if (r)
9500 return r;
9501
9502 for (i = 0; i < 100; i++) {
9503 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9504 break;
9505 mdelay(10);
9506 }
9507 if (i == 100)
9508 return -ETIMEDOUT;
9509
9510 tmp = RREG32_SMC(CG_ECLK_CNTL);
9511 tmp &= ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK);
9512 tmp |= dividers.post_divider;
9513 WREG32_SMC(CG_ECLK_CNTL, tmp);
9514
9515 for (i = 0; i < 100; i++) {
9516 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9517 break;
9518 mdelay(10);
9519 }
9520 if (i == 100)
9521 return -ETIMEDOUT;
9522
9523 return 0;
9524}
9525
Alex Deucher8a7cd272013-08-06 11:29:39 -04009526static void cik_pcie_gen3_enable(struct radeon_device *rdev)
Christian König87167bb2013-04-09 13:39:21 -04009527{
Alex Deucher8a7cd272013-08-06 11:29:39 -04009528 struct pci_dev *root = rdev->pdev->bus->self;
9529 int bridge_pos, gpu_pos;
9530 u32 speed_cntl, mask, current_data_rate;
9531 int ret, i;
9532 u16 tmp16;
Christian König87167bb2013-04-09 13:39:21 -04009533
Alex Deucher8a7cd272013-08-06 11:29:39 -04009534 if (radeon_pcie_gen2 == 0)
9535 return;
Christian König87167bb2013-04-09 13:39:21 -04009536
Alex Deucher8a7cd272013-08-06 11:29:39 -04009537 if (rdev->flags & RADEON_IS_IGP)
9538 return;
Christian König87167bb2013-04-09 13:39:21 -04009539
Alex Deucher8a7cd272013-08-06 11:29:39 -04009540 if (!(rdev->flags & RADEON_IS_PCIE))
9541 return;
Christian König87167bb2013-04-09 13:39:21 -04009542
Alex Deucher8a7cd272013-08-06 11:29:39 -04009543 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
9544 if (ret != 0)
9545 return;
Christian König87167bb2013-04-09 13:39:21 -04009546
Alex Deucher8a7cd272013-08-06 11:29:39 -04009547 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
9548 return;
Christian König87167bb2013-04-09 13:39:21 -04009549
Alex Deucher8a7cd272013-08-06 11:29:39 -04009550 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9551 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
9552 LC_CURRENT_DATA_RATE_SHIFT;
9553 if (mask & DRM_PCIE_SPEED_80) {
9554 if (current_data_rate == 2) {
9555 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
9556 return;
9557 }
9558 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
9559 } else if (mask & DRM_PCIE_SPEED_50) {
9560 if (current_data_rate == 1) {
9561 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
9562 return;
9563 }
9564 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
9565 }
Christian König87167bb2013-04-09 13:39:21 -04009566
Alex Deucher8a7cd272013-08-06 11:29:39 -04009567 bridge_pos = pci_pcie_cap(root);
9568 if (!bridge_pos)
9569 return;
9570
9571 gpu_pos = pci_pcie_cap(rdev->pdev);
9572 if (!gpu_pos)
9573 return;
9574
9575 if (mask & DRM_PCIE_SPEED_80) {
9576 /* re-try equalization if gen3 is not already enabled */
9577 if (current_data_rate != 2) {
9578 u16 bridge_cfg, gpu_cfg;
9579 u16 bridge_cfg2, gpu_cfg2;
9580 u32 max_lw, current_lw, tmp;
9581
9582 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9583 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9584
9585 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
9586 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9587
9588 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
9589 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9590
9591 tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9592 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
9593 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
9594
9595 if (current_lw < max_lw) {
9596 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9597 if (tmp & LC_RENEGOTIATION_SUPPORT) {
9598 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
9599 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
9600 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
9601 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
9602 }
9603 }
9604
9605 for (i = 0; i < 10; i++) {
9606 /* check status */
9607 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
9608 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
9609 break;
9610
9611 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9612 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9613
9614 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
9615 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
9616
9617 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9618 tmp |= LC_SET_QUIESCE;
9619 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9620
9621 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9622 tmp |= LC_REDO_EQ;
9623 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9624
9625 mdelay(100);
9626
9627 /* linkctl */
9628 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
9629 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9630 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
9631 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9632
9633 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
9634 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9635 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
9636 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9637
9638 /* linkctl2 */
9639 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
9640 tmp16 &= ~((1 << 4) | (7 << 9));
9641 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
9642 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
9643
9644 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9645 tmp16 &= ~((1 << 4) | (7 << 9));
9646 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
9647 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9648
9649 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9650 tmp &= ~LC_SET_QUIESCE;
9651 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9652 }
9653 }
9654 }
9655
9656 /* set the link speed */
9657 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
9658 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
9659 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9660
9661 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9662 tmp16 &= ~0xf;
9663 if (mask & DRM_PCIE_SPEED_80)
9664 tmp16 |= 3; /* gen3 */
9665 else if (mask & DRM_PCIE_SPEED_50)
9666 tmp16 |= 2; /* gen2 */
9667 else
9668 tmp16 |= 1; /* gen1 */
9669 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9670
9671 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9672 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
9673 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9674
9675 for (i = 0; i < rdev->usec_timeout; i++) {
9676 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9677 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
9678 break;
9679 udelay(1);
9680 }
9681}
Alex Deucher7235711a42013-04-04 13:58:09 -04009682
9683static void cik_program_aspm(struct radeon_device *rdev)
9684{
9685 u32 data, orig;
9686 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
9687 bool disable_clkreq = false;
9688
9689 if (radeon_aspm == 0)
9690 return;
9691
9692 /* XXX double check IGPs */
9693 if (rdev->flags & RADEON_IS_IGP)
9694 return;
9695
9696 if (!(rdev->flags & RADEON_IS_PCIE))
9697 return;
9698
9699 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9700 data &= ~LC_XMIT_N_FTS_MASK;
9701 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
9702 if (orig != data)
9703 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
9704
9705 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
9706 data |= LC_GO_TO_RECOVERY;
9707 if (orig != data)
9708 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
9709
9710 orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
9711 data |= P_IGNORE_EDB_ERR;
9712 if (orig != data)
9713 WREG32_PCIE_PORT(PCIE_P_CNTL, data);
9714
9715 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9716 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
9717 data |= LC_PMI_TO_L1_DIS;
9718 if (!disable_l0s)
9719 data |= LC_L0S_INACTIVITY(7);
9720
9721 if (!disable_l1) {
9722 data |= LC_L1_INACTIVITY(7);
9723 data &= ~LC_PMI_TO_L1_DIS;
9724 if (orig != data)
9725 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9726
9727 if (!disable_plloff_in_l1) {
9728 bool clk_req_support;
9729
9730 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
9731 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9732 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9733 if (orig != data)
9734 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
9735
9736 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
9737 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9738 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9739 if (orig != data)
9740 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
9741
9742 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
9743 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9744 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9745 if (orig != data)
9746 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
9747
9748 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
9749 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9750 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9751 if (orig != data)
9752 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
9753
9754 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9755 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
9756 data |= LC_DYN_LANES_PWR_STATE(3);
9757 if (orig != data)
9758 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
9759
9760 if (!disable_clkreq) {
9761 struct pci_dev *root = rdev->pdev->bus->self;
9762 u32 lnkcap;
9763
9764 clk_req_support = false;
9765 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
9766 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
9767 clk_req_support = true;
9768 } else {
9769 clk_req_support = false;
9770 }
9771
9772 if (clk_req_support) {
9773 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
9774 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
9775 if (orig != data)
9776 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
9777
9778 orig = data = RREG32_SMC(THM_CLK_CNTL);
9779 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
9780 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
9781 if (orig != data)
9782 WREG32_SMC(THM_CLK_CNTL, data);
9783
9784 orig = data = RREG32_SMC(MISC_CLK_CTRL);
9785 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
9786 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
9787 if (orig != data)
9788 WREG32_SMC(MISC_CLK_CTRL, data);
9789
9790 orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
9791 data &= ~BCLK_AS_XCLK;
9792 if (orig != data)
9793 WREG32_SMC(CG_CLKPIN_CNTL, data);
9794
9795 orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
9796 data &= ~FORCE_BIF_REFCLK_EN;
9797 if (orig != data)
9798 WREG32_SMC(CG_CLKPIN_CNTL_2, data);
9799
9800 orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
9801 data &= ~MPLL_CLKOUT_SEL_MASK;
9802 data |= MPLL_CLKOUT_SEL(4);
9803 if (orig != data)
9804 WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
9805 }
9806 }
9807 } else {
9808 if (orig != data)
9809 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9810 }
9811
9812 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
9813 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
9814 if (orig != data)
9815 WREG32_PCIE_PORT(PCIE_CNTL2, data);
9816
9817 if (!disable_l0s) {
9818 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9819 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
9820 data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9821 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
9822 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9823 data &= ~LC_L0S_INACTIVITY_MASK;
9824 if (orig != data)
9825 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9826 }
9827 }
9828 }
Christian König87167bb2013-04-09 13:39:21 -04009829}