blob: 0d761f73a7faf2b73caec17a9824dae2c0740cc1 [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 Deucher6101b3a2014-08-19 11:54:15 -04003486 int i, j;
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) ||
Alex Deucher6dc14ba2014-08-21 10:41:42 -04003547 (rdev->pdev->device == 0x1318) ||
Alex Deucherb2e4c702013-06-10 15:18:26 -04003548 (rdev->pdev->device == 0x131B)) {
3549 rdev->config.cik.max_cu_per_sh = 4;
3550 rdev->config.cik.max_backends_per_se = 1;
3551 } else {
3552 rdev->config.cik.max_cu_per_sh = 3;
3553 rdev->config.cik.max_backends_per_se = 1;
3554 }
3555 rdev->config.cik.max_sh_per_se = 1;
3556 rdev->config.cik.max_texture_channel_caches = 4;
3557 rdev->config.cik.max_gprs = 256;
3558 rdev->config.cik.max_gs_threads = 16;
3559 rdev->config.cik.max_hw_contexts = 8;
3560
3561 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3562 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3563 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3564 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3565 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003566 break;
3567 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04003568 case CHIP_MULLINS:
Alex Deucher8cc1a532013-04-09 12:41:24 -04003569 default:
3570 rdev->config.cik.max_shader_engines = 1;
3571 rdev->config.cik.max_tile_pipes = 2;
3572 rdev->config.cik.max_cu_per_sh = 2;
3573 rdev->config.cik.max_sh_per_se = 1;
3574 rdev->config.cik.max_backends_per_se = 1;
3575 rdev->config.cik.max_texture_channel_caches = 2;
3576 rdev->config.cik.max_gprs = 256;
3577 rdev->config.cik.max_gs_threads = 16;
3578 rdev->config.cik.max_hw_contexts = 8;
3579
3580 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3581 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3582 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3583 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3584 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3585 break;
3586 }
3587
3588 /* Initialize HDP */
3589 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3590 WREG32((0x2c14 + j), 0x00000000);
3591 WREG32((0x2c18 + j), 0x00000000);
3592 WREG32((0x2c1c + j), 0x00000000);
3593 WREG32((0x2c20 + j), 0x00000000);
3594 WREG32((0x2c24 + j), 0x00000000);
3595 }
3596
3597 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3598
3599 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
3600
3601 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3602 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3603
3604 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
3605 rdev->config.cik.mem_max_burst_length_bytes = 256;
3606 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3607 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3608 if (rdev->config.cik.mem_row_size_in_kb > 4)
3609 rdev->config.cik.mem_row_size_in_kb = 4;
3610 /* XXX use MC settings? */
3611 rdev->config.cik.shader_engine_tile_size = 32;
3612 rdev->config.cik.num_gpus = 1;
3613 rdev->config.cik.multi_gpu_tile_size = 64;
3614
3615 /* fix up row size */
3616 gb_addr_config &= ~ROW_SIZE_MASK;
3617 switch (rdev->config.cik.mem_row_size_in_kb) {
3618 case 1:
3619 default:
3620 gb_addr_config |= ROW_SIZE(0);
3621 break;
3622 case 2:
3623 gb_addr_config |= ROW_SIZE(1);
3624 break;
3625 case 4:
3626 gb_addr_config |= ROW_SIZE(2);
3627 break;
3628 }
3629
3630 /* setup tiling info dword. gb_addr_config is not adequate since it does
3631 * not have bank info, so create a custom tiling dword.
3632 * bits 3:0 num_pipes
3633 * bits 7:4 num_banks
3634 * bits 11:8 group_size
3635 * bits 15:12 row_size
3636 */
3637 rdev->config.cik.tile_config = 0;
3638 switch (rdev->config.cik.num_tile_pipes) {
3639 case 1:
3640 rdev->config.cik.tile_config |= (0 << 0);
3641 break;
3642 case 2:
3643 rdev->config.cik.tile_config |= (1 << 0);
3644 break;
3645 case 4:
3646 rdev->config.cik.tile_config |= (2 << 0);
3647 break;
3648 case 8:
3649 default:
3650 /* XXX what about 12? */
3651 rdev->config.cik.tile_config |= (3 << 0);
3652 break;
3653 }
Michel Dänzera5373142013-09-18 15:39:41 +02003654 rdev->config.cik.tile_config |=
3655 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
Alex Deucher8cc1a532013-04-09 12:41:24 -04003656 rdev->config.cik.tile_config |=
3657 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3658 rdev->config.cik.tile_config |=
3659 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3660
3661 WREG32(GB_ADDR_CONFIG, gb_addr_config);
3662 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3663 WREG32(DMIF_ADDR_CALC, gb_addr_config);
Alex Deucher21a93e12013-04-09 12:47:11 -04003664 WREG32(SDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
3665 WREG32(SDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
Christian König87167bb2013-04-09 13:39:21 -04003666 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3667 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3668 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
Alex Deucher8cc1a532013-04-09 12:41:24 -04003669
3670 cik_tiling_mode_table_init(rdev);
3671
3672 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
3673 rdev->config.cik.max_sh_per_se,
3674 rdev->config.cik.max_backends_per_se);
3675
Alex Deucher52da51f2014-08-19 11:56:38 -04003676 rdev->config.cik.active_cus = 0;
Alex Deucher65fcf662014-06-02 16:13:21 -04003677 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3678 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
Alex Deucher6101b3a2014-08-19 11:54:15 -04003679 rdev->config.cik.active_cus +=
3680 hweight32(cik_get_cu_active_bitmap(rdev, i, j));
Alex Deucher65fcf662014-06-02 16:13:21 -04003681 }
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);
Michel Dänzer1538a9e2014-08-18 17:34:55 +09003804 radeon_ring_unlock_commit(rdev, ring, false);
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);
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003893}
3894
Alex Deucherb07fdd32013-04-11 09:36:17 -04003895/**
3896 * cik_fence_compute_ring_emit - emit a fence on the compute ring
3897 *
3898 * @rdev: radeon_device pointer
3899 * @fence: radeon fence object
3900 *
3901 * Emits a fence sequnce number on the compute ring and flushes
3902 * GPU caches.
3903 */
3904void cik_fence_compute_ring_emit(struct radeon_device *rdev,
3905 struct radeon_fence *fence)
3906{
3907 struct radeon_ring *ring = &rdev->ring[fence->ring];
3908 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3909
3910 /* RELEASE_MEM - flush caches, send int */
3911 radeon_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
3912 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3913 EOP_TC_ACTION_EN |
3914 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3915 EVENT_INDEX(5)));
3916 radeon_ring_write(ring, DATA_SEL(1) | INT_SEL(2));
3917 radeon_ring_write(ring, addr & 0xfffffffc);
3918 radeon_ring_write(ring, upper_32_bits(addr));
3919 radeon_ring_write(ring, fence->seq);
3920 radeon_ring_write(ring, 0);
Alex Deucherb07fdd32013-04-11 09:36:17 -04003921}
3922
Christian König86302ee2014-08-18 16:30:12 +02003923/**
3924 * cik_semaphore_ring_emit - emit a semaphore on the CP ring
3925 *
3926 * @rdev: radeon_device pointer
3927 * @ring: radeon ring buffer object
3928 * @semaphore: radeon semaphore object
3929 * @emit_wait: Is this a sempahore wait?
3930 *
3931 * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
3932 * from running ahead of semaphore waits.
3933 */
Christian König1654b812013-11-12 12:58:05 +01003934bool cik_semaphore_ring_emit(struct radeon_device *rdev,
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003935 struct radeon_ring *ring,
3936 struct radeon_semaphore *semaphore,
3937 bool emit_wait)
3938{
3939 uint64_t addr = semaphore->gpu_addr;
3940 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3941
3942 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
Christian König5e167cd2014-06-03 20:51:46 +02003943 radeon_ring_write(ring, lower_32_bits(addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003944 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
Christian König1654b812013-11-12 12:58:05 +01003945
Christian König86302ee2014-08-18 16:30:12 +02003946 if (emit_wait && ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
3947 /* Prevent the PFP from running ahead of the semaphore wait */
3948 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
3949 radeon_ring_write(ring, 0x0);
3950 }
3951
Christian König1654b812013-11-12 12:58:05 +01003952 return true;
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003953}
3954
Alex Deucherc9dbd702013-10-01 16:36:51 -04003955/**
3956 * cik_copy_cpdma - copy pages using the CP DMA engine
3957 *
3958 * @rdev: radeon_device pointer
3959 * @src_offset: src GPU address
3960 * @dst_offset: dst GPU address
3961 * @num_gpu_pages: number of GPU pages to xfer
Christian König57d20a42014-09-04 20:01:53 +02003962 * @resv: reservation object to sync to
Alex Deucherc9dbd702013-10-01 16:36:51 -04003963 *
3964 * Copy GPU paging using the CP DMA engine (CIK+).
3965 * Used by the radeon ttm implementation to move pages if
3966 * registered as the asic copy callback.
3967 */
Christian König57d20a42014-09-04 20:01:53 +02003968struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
3969 uint64_t src_offset, uint64_t dst_offset,
3970 unsigned num_gpu_pages,
3971 struct reservation_object *resv)
Alex Deucherc9dbd702013-10-01 16:36:51 -04003972{
3973 struct radeon_semaphore *sem = NULL;
Christian König57d20a42014-09-04 20:01:53 +02003974 struct radeon_fence *fence;
Alex Deucherc9dbd702013-10-01 16:36:51 -04003975 int ring_index = rdev->asic->copy.blit_ring_index;
3976 struct radeon_ring *ring = &rdev->ring[ring_index];
3977 u32 size_in_bytes, cur_size_in_bytes, control;
3978 int i, num_loops;
3979 int r = 0;
3980
3981 r = radeon_semaphore_create(rdev, &sem);
3982 if (r) {
3983 DRM_ERROR("radeon: moving bo (%d).\n", r);
Christian König57d20a42014-09-04 20:01:53 +02003984 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04003985 }
3986
3987 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3988 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
3989 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 18);
3990 if (r) {
3991 DRM_ERROR("radeon: moving bo (%d).\n", r);
3992 radeon_semaphore_free(rdev, &sem, NULL);
Christian König57d20a42014-09-04 20:01:53 +02003993 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04003994 }
3995
Christian König57d20a42014-09-04 20:01:53 +02003996 radeon_semaphore_sync_resv(sem, resv, false);
Christian König1654b812013-11-12 12:58:05 +01003997 radeon_semaphore_sync_rings(rdev, sem, ring->idx);
Alex Deucherc9dbd702013-10-01 16:36:51 -04003998
3999 for (i = 0; i < num_loops; i++) {
4000 cur_size_in_bytes = size_in_bytes;
4001 if (cur_size_in_bytes > 0x1fffff)
4002 cur_size_in_bytes = 0x1fffff;
4003 size_in_bytes -= cur_size_in_bytes;
4004 control = 0;
4005 if (size_in_bytes == 0)
4006 control |= PACKET3_DMA_DATA_CP_SYNC;
4007 radeon_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
4008 radeon_ring_write(ring, control);
4009 radeon_ring_write(ring, lower_32_bits(src_offset));
4010 radeon_ring_write(ring, upper_32_bits(src_offset));
4011 radeon_ring_write(ring, lower_32_bits(dst_offset));
4012 radeon_ring_write(ring, upper_32_bits(dst_offset));
4013 radeon_ring_write(ring, cur_size_in_bytes);
4014 src_offset += cur_size_in_bytes;
4015 dst_offset += cur_size_in_bytes;
4016 }
4017
Christian König57d20a42014-09-04 20:01:53 +02004018 r = radeon_fence_emit(rdev, &fence, ring->idx);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004019 if (r) {
4020 radeon_ring_unlock_undo(rdev, ring);
Maarten Lankhorstaa4c8b32014-04-24 13:29:14 +02004021 radeon_semaphore_free(rdev, &sem, NULL);
Christian König57d20a42014-09-04 20:01:53 +02004022 return ERR_PTR(r);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004023 }
4024
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004025 radeon_ring_unlock_commit(rdev, ring, false);
Christian König57d20a42014-09-04 20:01:53 +02004026 radeon_semaphore_free(rdev, &sem, fence);
Alex Deucherc9dbd702013-10-01 16:36:51 -04004027
Christian König57d20a42014-09-04 20:01:53 +02004028 return fence;
Alex Deucherc9dbd702013-10-01 16:36:51 -04004029}
4030
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004031/*
4032 * IB stuff
4033 */
4034/**
4035 * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
4036 *
4037 * @rdev: radeon_device pointer
4038 * @ib: radeon indirect buffer object
4039 *
4040 * Emits an DE (drawing engine) or CE (constant engine) IB
4041 * on the gfx ring. IBs are usually generated by userspace
4042 * acceleration drivers and submitted to the kernel for
4043 * sheduling on the ring. This function schedules the IB
4044 * on the gfx ring for execution by the GPU.
4045 */
4046void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
4047{
4048 struct radeon_ring *ring = &rdev->ring[ib->ring];
4049 u32 header, control = INDIRECT_BUFFER_VALID;
4050
4051 if (ib->is_const_ib) {
4052 /* set switch buffer packet before const IB */
4053 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
4054 radeon_ring_write(ring, 0);
4055
4056 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
4057 } else {
4058 u32 next_rptr;
4059 if (ring->rptr_save_reg) {
4060 next_rptr = ring->wptr + 3 + 4;
4061 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
4062 radeon_ring_write(ring, ((ring->rptr_save_reg -
4063 PACKET3_SET_UCONFIG_REG_START) >> 2));
4064 radeon_ring_write(ring, next_rptr);
4065 } else if (rdev->wb.enabled) {
4066 next_rptr = ring->wptr + 5 + 4;
4067 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4068 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
4069 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
Christian König5e167cd2014-06-03 20:51:46 +02004070 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004071 radeon_ring_write(ring, next_rptr);
4072 }
4073
4074 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
4075 }
4076
4077 control |= ib->length_dw |
4078 (ib->vm ? (ib->vm->id << 24) : 0);
4079
4080 radeon_ring_write(ring, header);
4081 radeon_ring_write(ring,
4082#ifdef __BIG_ENDIAN
4083 (2 << 0) |
4084#endif
4085 (ib->gpu_addr & 0xFFFFFFFC));
4086 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
4087 radeon_ring_write(ring, control);
4088}
4089
Alex Deucherfbc832c2012-07-20 14:41:35 -04004090/**
4091 * cik_ib_test - basic gfx ring IB test
4092 *
4093 * @rdev: radeon_device pointer
4094 * @ring: radeon_ring structure holding ring information
4095 *
4096 * Allocate an IB and execute it on the gfx ring (CIK).
4097 * Provides a basic gfx ring test to verify that IBs are working.
4098 * Returns 0 on success, error on failure.
4099 */
4100int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
4101{
4102 struct radeon_ib ib;
4103 uint32_t scratch;
4104 uint32_t tmp = 0;
4105 unsigned i;
4106 int r;
4107
4108 r = radeon_scratch_get(rdev, &scratch);
4109 if (r) {
4110 DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
4111 return r;
4112 }
4113 WREG32(scratch, 0xCAFEDEAD);
4114 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
4115 if (r) {
4116 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004117 radeon_scratch_free(rdev, scratch);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004118 return r;
4119 }
4120 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
4121 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
4122 ib.ptr[2] = 0xDEADBEEF;
4123 ib.length_dw = 3;
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004124 r = radeon_ib_schedule(rdev, &ib, NULL, false);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004125 if (r) {
4126 radeon_scratch_free(rdev, scratch);
4127 radeon_ib_free(rdev, &ib);
4128 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
4129 return r;
4130 }
4131 r = radeon_fence_wait(ib.fence, false);
4132 if (r) {
4133 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02004134 radeon_scratch_free(rdev, scratch);
4135 radeon_ib_free(rdev, &ib);
Alex Deucherfbc832c2012-07-20 14:41:35 -04004136 return r;
4137 }
4138 for (i = 0; i < rdev->usec_timeout; i++) {
4139 tmp = RREG32(scratch);
4140 if (tmp == 0xDEADBEEF)
4141 break;
4142 DRM_UDELAY(1);
4143 }
4144 if (i < rdev->usec_timeout) {
4145 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
4146 } else {
4147 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
4148 scratch, tmp);
4149 r = -EINVAL;
4150 }
4151 radeon_scratch_free(rdev, scratch);
4152 radeon_ib_free(rdev, &ib);
4153 return r;
4154}
4155
Alex Deucher2cae3bc2012-07-05 11:45:40 -04004156/*
Alex Deucher841cf442012-12-18 21:47:44 -05004157 * CP.
4158 * On CIK, gfx and compute now have independant command processors.
4159 *
4160 * GFX
4161 * Gfx consists of a single ring and can process both gfx jobs and
4162 * compute jobs. The gfx CP consists of three microengines (ME):
4163 * PFP - Pre-Fetch Parser
4164 * ME - Micro Engine
4165 * CE - Constant Engine
4166 * The PFP and ME make up what is considered the Drawing Engine (DE).
4167 * The CE is an asynchronous engine used for updating buffer desciptors
4168 * used by the DE so that they can be loaded into cache in parallel
4169 * while the DE is processing state update packets.
4170 *
4171 * Compute
4172 * The compute CP consists of two microengines (ME):
4173 * MEC1 - Compute MicroEngine 1
4174 * MEC2 - Compute MicroEngine 2
4175 * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
4176 * The queues are exposed to userspace and are programmed directly
4177 * by the compute runtime.
4178 */
4179/**
4180 * cik_cp_gfx_enable - enable/disable the gfx CP MEs
4181 *
4182 * @rdev: radeon_device pointer
4183 * @enable: enable or disable the MEs
4184 *
4185 * Halts or unhalts the gfx MEs.
4186 */
4187static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
4188{
4189 if (enable)
4190 WREG32(CP_ME_CNTL, 0);
4191 else {
Alex Deucher50efa512014-01-27 11:26:33 -05004192 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4193 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
Alex Deucher841cf442012-12-18 21:47:44 -05004194 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
4195 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4196 }
4197 udelay(50);
4198}
4199
4200/**
4201 * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
4202 *
4203 * @rdev: radeon_device pointer
4204 *
4205 * Loads the gfx PFP, ME, and CE ucode.
4206 * Returns 0 for success, -EINVAL if the ucode is not available.
4207 */
4208static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
4209{
Alex Deucher841cf442012-12-18 21:47:44 -05004210 int i;
4211
4212 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
4213 return -EINVAL;
4214
4215 cik_cp_gfx_enable(rdev, false);
4216
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004217 if (rdev->new_fw) {
4218 const struct gfx_firmware_header_v1_0 *pfp_hdr =
4219 (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
4220 const struct gfx_firmware_header_v1_0 *ce_hdr =
4221 (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
4222 const struct gfx_firmware_header_v1_0 *me_hdr =
4223 (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
4224 const __le32 *fw_data;
4225 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004226
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004227 radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
4228 radeon_ucode_print_gfx_hdr(&ce_hdr->header);
4229 radeon_ucode_print_gfx_hdr(&me_hdr->header);
Alex Deucher841cf442012-12-18 21:47:44 -05004230
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004231 /* PFP */
4232 fw_data = (const __le32 *)
4233 (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
4234 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
4235 WREG32(CP_PFP_UCODE_ADDR, 0);
4236 for (i = 0; i < fw_size; i++)
4237 WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
4238 WREG32(CP_PFP_UCODE_ADDR, 0);
4239
4240 /* CE */
4241 fw_data = (const __le32 *)
4242 (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
4243 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
4244 WREG32(CP_CE_UCODE_ADDR, 0);
4245 for (i = 0; i < fw_size; i++)
4246 WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
4247 WREG32(CP_CE_UCODE_ADDR, 0);
4248
4249 /* ME */
4250 fw_data = (const __be32 *)
4251 (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
4252 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
4253 WREG32(CP_ME_RAM_WADDR, 0);
4254 for (i = 0; i < fw_size; i++)
4255 WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
4256 WREG32(CP_ME_RAM_WADDR, 0);
4257 } else {
4258 const __be32 *fw_data;
4259
4260 /* PFP */
4261 fw_data = (const __be32 *)rdev->pfp_fw->data;
4262 WREG32(CP_PFP_UCODE_ADDR, 0);
4263 for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
4264 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
4265 WREG32(CP_PFP_UCODE_ADDR, 0);
4266
4267 /* CE */
4268 fw_data = (const __be32 *)rdev->ce_fw->data;
4269 WREG32(CP_CE_UCODE_ADDR, 0);
4270 for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
4271 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
4272 WREG32(CP_CE_UCODE_ADDR, 0);
4273
4274 /* ME */
4275 fw_data = (const __be32 *)rdev->me_fw->data;
4276 WREG32(CP_ME_RAM_WADDR, 0);
4277 for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
4278 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
4279 WREG32(CP_ME_RAM_WADDR, 0);
4280 }
Alex Deucher841cf442012-12-18 21:47:44 -05004281
4282 WREG32(CP_PFP_UCODE_ADDR, 0);
4283 WREG32(CP_CE_UCODE_ADDR, 0);
4284 WREG32(CP_ME_RAM_WADDR, 0);
4285 WREG32(CP_ME_RAM_RADDR, 0);
4286 return 0;
4287}
4288
4289/**
4290 * cik_cp_gfx_start - start the gfx ring
4291 *
4292 * @rdev: radeon_device pointer
4293 *
4294 * Enables the ring and loads the clear state context and other
4295 * packets required to init the ring.
4296 * Returns 0 for success, error for failure.
4297 */
4298static int cik_cp_gfx_start(struct radeon_device *rdev)
4299{
4300 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4301 int r, i;
4302
4303 /* init the CP */
4304 WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
4305 WREG32(CP_ENDIAN_SWAP, 0);
4306 WREG32(CP_DEVICE_ID, 1);
4307
4308 cik_cp_gfx_enable(rdev, true);
4309
4310 r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
4311 if (r) {
4312 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
4313 return r;
4314 }
4315
4316 /* init the CE partitions. CE only used for gfx on CIK */
4317 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
4318 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
4319 radeon_ring_write(ring, 0xc000);
4320 radeon_ring_write(ring, 0xc000);
4321
4322 /* setup clear context state */
4323 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4324 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
4325
4326 radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
4327 radeon_ring_write(ring, 0x80000000);
4328 radeon_ring_write(ring, 0x80000000);
4329
4330 for (i = 0; i < cik_default_size; i++)
4331 radeon_ring_write(ring, cik_default_state[i]);
4332
4333 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4334 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
4335
4336 /* set clear context state */
4337 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
4338 radeon_ring_write(ring, 0);
4339
4340 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
4341 radeon_ring_write(ring, 0x00000316);
4342 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
4343 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
4344
Michel Dänzer1538a9e2014-08-18 17:34:55 +09004345 radeon_ring_unlock_commit(rdev, ring, false);
Alex Deucher841cf442012-12-18 21:47:44 -05004346
4347 return 0;
4348}
4349
4350/**
4351 * cik_cp_gfx_fini - stop the gfx ring
4352 *
4353 * @rdev: radeon_device pointer
4354 *
4355 * Stop the gfx ring and tear down the driver ring
4356 * info.
4357 */
4358static void cik_cp_gfx_fini(struct radeon_device *rdev)
4359{
4360 cik_cp_gfx_enable(rdev, false);
4361 radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4362}
4363
4364/**
4365 * cik_cp_gfx_resume - setup the gfx ring buffer registers
4366 *
4367 * @rdev: radeon_device pointer
4368 *
4369 * Program the location and size of the gfx ring buffer
4370 * and test it to make sure it's working.
4371 * Returns 0 for success, error for failure.
4372 */
4373static int cik_cp_gfx_resume(struct radeon_device *rdev)
4374{
4375 struct radeon_ring *ring;
4376 u32 tmp;
4377 u32 rb_bufsz;
4378 u64 rb_addr;
4379 int r;
4380
4381 WREG32(CP_SEM_WAIT_TIMER, 0x0);
Alex Deucher939c0d32013-09-30 18:03:06 -04004382 if (rdev->family != CHIP_HAWAII)
4383 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
Alex Deucher841cf442012-12-18 21:47:44 -05004384
4385 /* Set the write pointer delay */
4386 WREG32(CP_RB_WPTR_DELAY, 0);
4387
4388 /* set the RB to use vmid 0 */
4389 WREG32(CP_RB_VMID, 0);
4390
4391 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
4392
4393 /* ring 0 - compute and gfx */
4394 /* Set ring buffer size */
4395 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
Daniel Vetterb72a8922013-07-10 14:11:59 +02004396 rb_bufsz = order_base_2(ring->ring_size / 8);
4397 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
Alex Deucher841cf442012-12-18 21:47:44 -05004398#ifdef __BIG_ENDIAN
4399 tmp |= BUF_SWAP_32BIT;
4400#endif
4401 WREG32(CP_RB0_CNTL, tmp);
4402
4403 /* Initialize the ring buffer's read and write pointers */
4404 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
4405 ring->wptr = 0;
4406 WREG32(CP_RB0_WPTR, ring->wptr);
4407
4408 /* set the wb address wether it's enabled or not */
4409 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
4410 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
4411
4412 /* scratch register shadowing is no longer supported */
4413 WREG32(SCRATCH_UMSK, 0);
4414
4415 if (!rdev->wb.enabled)
4416 tmp |= RB_NO_UPDATE;
4417
4418 mdelay(1);
4419 WREG32(CP_RB0_CNTL, tmp);
4420
4421 rb_addr = ring->gpu_addr >> 8;
4422 WREG32(CP_RB0_BASE, rb_addr);
4423 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
4424
Alex Deucher841cf442012-12-18 21:47:44 -05004425 /* start the ring */
4426 cik_cp_gfx_start(rdev);
4427 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
4428 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4429 if (r) {
4430 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4431 return r;
4432 }
Alex Deucher50efa512014-01-27 11:26:33 -05004433
4434 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4435 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
4436
Alex Deucher841cf442012-12-18 21:47:44 -05004437 return 0;
4438}
4439
Alex Deucherea31bf62013-12-09 19:44:30 -05004440u32 cik_gfx_get_rptr(struct radeon_device *rdev,
4441 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004442{
4443 u32 rptr;
4444
Alex Deucherea31bf62013-12-09 19:44:30 -05004445 if (rdev->wb.enabled)
4446 rptr = rdev->wb.wb[ring->rptr_offs/4];
4447 else
4448 rptr = RREG32(CP_RB0_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04004449
Alex Deucherea31bf62013-12-09 19:44:30 -05004450 return rptr;
4451}
4452
4453u32 cik_gfx_get_wptr(struct radeon_device *rdev,
4454 struct radeon_ring *ring)
4455{
4456 u32 wptr;
4457
4458 wptr = RREG32(CP_RB0_WPTR);
4459
4460 return wptr;
4461}
4462
4463void cik_gfx_set_wptr(struct radeon_device *rdev,
4464 struct radeon_ring *ring)
4465{
4466 WREG32(CP_RB0_WPTR, ring->wptr);
4467 (void)RREG32(CP_RB0_WPTR);
4468}
4469
4470u32 cik_compute_get_rptr(struct radeon_device *rdev,
4471 struct radeon_ring *ring)
4472{
4473 u32 rptr;
Alex Deucher963e81f2013-06-26 17:37:11 -04004474
4475 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004476 rptr = rdev->wb.wb[ring->rptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004477 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004478 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004479 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4480 rptr = RREG32(CP_HQD_PQ_RPTR);
4481 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004482 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004483 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004484
4485 return rptr;
4486}
4487
Alex Deucherea31bf62013-12-09 19:44:30 -05004488u32 cik_compute_get_wptr(struct radeon_device *rdev,
4489 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004490{
4491 u32 wptr;
4492
4493 if (rdev->wb.enabled) {
Alex Deucherea31bf62013-12-09 19:44:30 -05004494 /* XXX check if swapping is necessary on BE */
4495 wptr = rdev->wb.wb[ring->wptr_offs/4];
Alex Deucher963e81f2013-06-26 17:37:11 -04004496 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04004497 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004498 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4499 wptr = RREG32(CP_HQD_PQ_WPTR);
4500 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004501 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004502 }
Alex Deucher963e81f2013-06-26 17:37:11 -04004503
4504 return wptr;
4505}
4506
Alex Deucherea31bf62013-12-09 19:44:30 -05004507void cik_compute_set_wptr(struct radeon_device *rdev,
4508 struct radeon_ring *ring)
Alex Deucher963e81f2013-06-26 17:37:11 -04004509{
Alex Deucherea31bf62013-12-09 19:44:30 -05004510 /* XXX check if swapping is necessary on BE */
4511 rdev->wb.wb[ring->wptr_offs/4] = ring->wptr;
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05004512 WDOORBELL32(ring->doorbell_index, ring->wptr);
Alex Deucher963e81f2013-06-26 17:37:11 -04004513}
4514
Alex Deucher841cf442012-12-18 21:47:44 -05004515/**
4516 * cik_cp_compute_enable - enable/disable the compute CP MEs
4517 *
4518 * @rdev: radeon_device pointer
4519 * @enable: enable or disable the MEs
4520 *
4521 * Halts or unhalts the compute MEs.
4522 */
4523static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
4524{
4525 if (enable)
4526 WREG32(CP_MEC_CNTL, 0);
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004527 else {
Alex Deucher841cf442012-12-18 21:47:44 -05004528 WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
Alex Deucherb2b3d8d2014-03-12 16:20:44 -04004529 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
4530 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
4531 }
Alex Deucher841cf442012-12-18 21:47:44 -05004532 udelay(50);
4533}
4534
4535/**
4536 * cik_cp_compute_load_microcode - load the compute CP ME ucode
4537 *
4538 * @rdev: radeon_device pointer
4539 *
4540 * Loads the compute MEC1&2 ucode.
4541 * Returns 0 for success, -EINVAL if the ucode is not available.
4542 */
4543static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
4544{
Alex Deucher841cf442012-12-18 21:47:44 -05004545 int i;
4546
4547 if (!rdev->mec_fw)
4548 return -EINVAL;
4549
4550 cik_cp_compute_enable(rdev, false);
4551
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004552 if (rdev->new_fw) {
4553 const struct gfx_firmware_header_v1_0 *mec_hdr =
4554 (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
4555 const __le32 *fw_data;
4556 u32 fw_size;
Alex Deucher841cf442012-12-18 21:47:44 -05004557
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004558 radeon_ucode_print_gfx_hdr(&mec_hdr->header);
4559
4560 /* MEC1 */
4561 fw_data = (const __le32 *)
4562 (rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
4563 fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
4564 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4565 for (i = 0; i < fw_size; i++)
4566 WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
4567 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4568
Alex Deucher841cf442012-12-18 21:47:44 -05004569 /* MEC2 */
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004570 if (rdev->family == CHIP_KAVERI) {
4571 const struct gfx_firmware_header_v1_0 *mec2_hdr =
4572 (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
4573
4574 fw_data = (const __le32 *)
4575 (rdev->mec2_fw->data +
4576 le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
4577 fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
4578 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4579 for (i = 0; i < fw_size; i++)
4580 WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
4581 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4582 }
4583 } else {
4584 const __be32 *fw_data;
4585
4586 /* MEC1 */
Alex Deucher841cf442012-12-18 21:47:44 -05004587 fw_data = (const __be32 *)rdev->mec_fw->data;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004588 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
Alex Deucher841cf442012-12-18 21:47:44 -05004589 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04004590 WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
4591 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4592
4593 if (rdev->family == CHIP_KAVERI) {
4594 /* MEC2 */
4595 fw_data = (const __be32 *)rdev->mec_fw->data;
4596 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4597 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
4598 WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
4599 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4600 }
Alex Deucher841cf442012-12-18 21:47:44 -05004601 }
4602
4603 return 0;
4604}
4605
4606/**
4607 * cik_cp_compute_start - start the compute queues
4608 *
4609 * @rdev: radeon_device pointer
4610 *
4611 * Enable the compute queues.
4612 * Returns 0 for success, error for failure.
4613 */
4614static int cik_cp_compute_start(struct radeon_device *rdev)
4615{
Alex Deucher963e81f2013-06-26 17:37:11 -04004616 cik_cp_compute_enable(rdev, true);
4617
Alex Deucher841cf442012-12-18 21:47:44 -05004618 return 0;
4619}
4620
4621/**
4622 * cik_cp_compute_fini - stop the compute queues
4623 *
4624 * @rdev: radeon_device pointer
4625 *
4626 * Stop the compute queues and tear down the driver queue
4627 * info.
4628 */
4629static void cik_cp_compute_fini(struct radeon_device *rdev)
4630{
Alex Deucher963e81f2013-06-26 17:37:11 -04004631 int i, idx, r;
4632
Alex Deucher841cf442012-12-18 21:47:44 -05004633 cik_cp_compute_enable(rdev, false);
Alex Deucher963e81f2013-06-26 17:37:11 -04004634
4635 for (i = 0; i < 2; i++) {
4636 if (i == 0)
4637 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4638 else
4639 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4640
4641 if (rdev->ring[idx].mqd_obj) {
4642 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4643 if (unlikely(r != 0))
4644 dev_warn(rdev->dev, "(%d) reserve MQD bo failed\n", r);
4645
4646 radeon_bo_unpin(rdev->ring[idx].mqd_obj);
4647 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
4648
4649 radeon_bo_unref(&rdev->ring[idx].mqd_obj);
4650 rdev->ring[idx].mqd_obj = NULL;
4651 }
4652 }
Alex Deucher841cf442012-12-18 21:47:44 -05004653}
4654
Alex Deucher963e81f2013-06-26 17:37:11 -04004655static void cik_mec_fini(struct radeon_device *rdev)
4656{
4657 int r;
4658
4659 if (rdev->mec.hpd_eop_obj) {
4660 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4661 if (unlikely(r != 0))
4662 dev_warn(rdev->dev, "(%d) reserve HPD EOP bo failed\n", r);
4663 radeon_bo_unpin(rdev->mec.hpd_eop_obj);
4664 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4665
4666 radeon_bo_unref(&rdev->mec.hpd_eop_obj);
4667 rdev->mec.hpd_eop_obj = NULL;
4668 }
4669}
4670
4671#define MEC_HPD_SIZE 2048
4672
4673static int cik_mec_init(struct radeon_device *rdev)
4674{
4675 int r;
4676 u32 *hpd;
4677
4678 /*
4679 * KV: 2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
4680 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
4681 */
4682 if (rdev->family == CHIP_KAVERI)
4683 rdev->mec.num_mec = 2;
4684 else
4685 rdev->mec.num_mec = 1;
4686 rdev->mec.num_pipe = 4;
4687 rdev->mec.num_queue = rdev->mec.num_mec * rdev->mec.num_pipe * 8;
4688
4689 if (rdev->mec.hpd_eop_obj == NULL) {
4690 r = radeon_bo_create(rdev,
4691 rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
4692 PAGE_SIZE, true,
Michel Dänzer02376d82014-07-17 19:01:08 +09004693 RADEON_GEM_DOMAIN_GTT, 0, NULL,
Alex Deucher963e81f2013-06-26 17:37:11 -04004694 &rdev->mec.hpd_eop_obj);
4695 if (r) {
4696 dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
4697 return r;
4698 }
4699 }
4700
4701 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4702 if (unlikely(r != 0)) {
4703 cik_mec_fini(rdev);
4704 return r;
4705 }
4706 r = radeon_bo_pin(rdev->mec.hpd_eop_obj, RADEON_GEM_DOMAIN_GTT,
4707 &rdev->mec.hpd_eop_gpu_addr);
4708 if (r) {
4709 dev_warn(rdev->dev, "(%d) pin HDP EOP bo failed\n", r);
4710 cik_mec_fini(rdev);
4711 return r;
4712 }
4713 r = radeon_bo_kmap(rdev->mec.hpd_eop_obj, (void **)&hpd);
4714 if (r) {
4715 dev_warn(rdev->dev, "(%d) map HDP EOP bo failed\n", r);
4716 cik_mec_fini(rdev);
4717 return r;
4718 }
4719
4720 /* clear memory. Not sure if this is required or not */
4721 memset(hpd, 0, rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2);
4722
4723 radeon_bo_kunmap(rdev->mec.hpd_eop_obj);
4724 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4725
4726 return 0;
4727}
4728
4729struct hqd_registers
4730{
4731 u32 cp_mqd_base_addr;
4732 u32 cp_mqd_base_addr_hi;
4733 u32 cp_hqd_active;
4734 u32 cp_hqd_vmid;
4735 u32 cp_hqd_persistent_state;
4736 u32 cp_hqd_pipe_priority;
4737 u32 cp_hqd_queue_priority;
4738 u32 cp_hqd_quantum;
4739 u32 cp_hqd_pq_base;
4740 u32 cp_hqd_pq_base_hi;
4741 u32 cp_hqd_pq_rptr;
4742 u32 cp_hqd_pq_rptr_report_addr;
4743 u32 cp_hqd_pq_rptr_report_addr_hi;
4744 u32 cp_hqd_pq_wptr_poll_addr;
4745 u32 cp_hqd_pq_wptr_poll_addr_hi;
4746 u32 cp_hqd_pq_doorbell_control;
4747 u32 cp_hqd_pq_wptr;
4748 u32 cp_hqd_pq_control;
4749 u32 cp_hqd_ib_base_addr;
4750 u32 cp_hqd_ib_base_addr_hi;
4751 u32 cp_hqd_ib_rptr;
4752 u32 cp_hqd_ib_control;
4753 u32 cp_hqd_iq_timer;
4754 u32 cp_hqd_iq_rptr;
4755 u32 cp_hqd_dequeue_request;
4756 u32 cp_hqd_dma_offload;
4757 u32 cp_hqd_sema_cmd;
4758 u32 cp_hqd_msg_type;
4759 u32 cp_hqd_atomic0_preop_lo;
4760 u32 cp_hqd_atomic0_preop_hi;
4761 u32 cp_hqd_atomic1_preop_lo;
4762 u32 cp_hqd_atomic1_preop_hi;
4763 u32 cp_hqd_hq_scheduler0;
4764 u32 cp_hqd_hq_scheduler1;
4765 u32 cp_mqd_control;
4766};
4767
4768struct bonaire_mqd
4769{
4770 u32 header;
4771 u32 dispatch_initiator;
4772 u32 dimensions[3];
4773 u32 start_idx[3];
4774 u32 num_threads[3];
4775 u32 pipeline_stat_enable;
4776 u32 perf_counter_enable;
4777 u32 pgm[2];
4778 u32 tba[2];
4779 u32 tma[2];
4780 u32 pgm_rsrc[2];
4781 u32 vmid;
4782 u32 resource_limits;
4783 u32 static_thread_mgmt01[2];
4784 u32 tmp_ring_size;
4785 u32 static_thread_mgmt23[2];
4786 u32 restart[3];
4787 u32 thread_trace_enable;
4788 u32 reserved1;
4789 u32 user_data[16];
4790 u32 vgtcs_invoke_count[2];
4791 struct hqd_registers queue_state;
4792 u32 dequeue_cntr;
4793 u32 interrupt_queue[64];
4794};
4795
Alex Deucher841cf442012-12-18 21:47:44 -05004796/**
4797 * cik_cp_compute_resume - setup the compute queue registers
4798 *
4799 * @rdev: radeon_device pointer
4800 *
4801 * Program the compute queues and test them to make sure they
4802 * are working.
4803 * Returns 0 for success, error for failure.
4804 */
4805static int cik_cp_compute_resume(struct radeon_device *rdev)
4806{
Alex Deucher963e81f2013-06-26 17:37:11 -04004807 int r, i, idx;
4808 u32 tmp;
4809 bool use_doorbell = true;
4810 u64 hqd_gpu_addr;
4811 u64 mqd_gpu_addr;
4812 u64 eop_gpu_addr;
4813 u64 wb_gpu_addr;
4814 u32 *buf;
4815 struct bonaire_mqd *mqd;
Alex Deucher841cf442012-12-18 21:47:44 -05004816
Alex Deucher841cf442012-12-18 21:47:44 -05004817 r = cik_cp_compute_start(rdev);
4818 if (r)
4819 return r;
Alex Deucher963e81f2013-06-26 17:37:11 -04004820
4821 /* fix up chicken bits */
4822 tmp = RREG32(CP_CPF_DEBUG);
4823 tmp |= (1 << 23);
4824 WREG32(CP_CPF_DEBUG, tmp);
4825
4826 /* init the pipes */
Alex Deucherf61d5b462013-08-06 12:40:16 -04004827 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004828 for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
4829 int me = (i < 4) ? 1 : 2;
4830 int pipe = (i < 4) ? i : (i - 4);
4831
4832 eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE * 2);
4833
4834 cik_srbm_select(rdev, me, pipe, 0, 0);
4835
4836 /* write the EOP addr */
4837 WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
4838 WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
4839
4840 /* set the VMID assigned */
4841 WREG32(CP_HPD_EOP_VMID, 0);
4842
4843 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4844 tmp = RREG32(CP_HPD_EOP_CONTROL);
4845 tmp &= ~EOP_SIZE_MASK;
Daniel Vetterb72a8922013-07-10 14:11:59 +02004846 tmp |= order_base_2(MEC_HPD_SIZE / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004847 WREG32(CP_HPD_EOP_CONTROL, tmp);
4848 }
4849 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004850 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004851
4852 /* init the queues. Just two for now. */
4853 for (i = 0; i < 2; i++) {
4854 if (i == 0)
4855 idx = CAYMAN_RING_TYPE_CP1_INDEX;
4856 else
4857 idx = CAYMAN_RING_TYPE_CP2_INDEX;
4858
4859 if (rdev->ring[idx].mqd_obj == NULL) {
4860 r = radeon_bo_create(rdev,
4861 sizeof(struct bonaire_mqd),
4862 PAGE_SIZE, true,
Michel Dänzer02376d82014-07-17 19:01:08 +09004863 RADEON_GEM_DOMAIN_GTT, 0, NULL,
Alex Deucher963e81f2013-06-26 17:37:11 -04004864 &rdev->ring[idx].mqd_obj);
4865 if (r) {
4866 dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
4867 return r;
4868 }
4869 }
4870
4871 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4872 if (unlikely(r != 0)) {
4873 cik_cp_compute_fini(rdev);
4874 return r;
4875 }
4876 r = radeon_bo_pin(rdev->ring[idx].mqd_obj, RADEON_GEM_DOMAIN_GTT,
4877 &mqd_gpu_addr);
4878 if (r) {
4879 dev_warn(rdev->dev, "(%d) pin MQD bo failed\n", r);
4880 cik_cp_compute_fini(rdev);
4881 return r;
4882 }
4883 r = radeon_bo_kmap(rdev->ring[idx].mqd_obj, (void **)&buf);
4884 if (r) {
4885 dev_warn(rdev->dev, "(%d) map MQD bo failed\n", r);
4886 cik_cp_compute_fini(rdev);
4887 return r;
4888 }
4889
Alex Deucher963e81f2013-06-26 17:37:11 -04004890 /* init the mqd struct */
4891 memset(buf, 0, sizeof(struct bonaire_mqd));
4892
4893 mqd = (struct bonaire_mqd *)buf;
4894 mqd->header = 0xC0310800;
4895 mqd->static_thread_mgmt01[0] = 0xffffffff;
4896 mqd->static_thread_mgmt01[1] = 0xffffffff;
4897 mqd->static_thread_mgmt23[0] = 0xffffffff;
4898 mqd->static_thread_mgmt23[1] = 0xffffffff;
4899
Alex Deucherf61d5b462013-08-06 12:40:16 -04004900 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004901 cik_srbm_select(rdev, rdev->ring[idx].me,
4902 rdev->ring[idx].pipe,
4903 rdev->ring[idx].queue, 0);
4904
4905 /* disable wptr polling */
4906 tmp = RREG32(CP_PQ_WPTR_POLL_CNTL);
4907 tmp &= ~WPTR_POLL_EN;
4908 WREG32(CP_PQ_WPTR_POLL_CNTL, tmp);
4909
4910 /* enable doorbell? */
4911 mqd->queue_state.cp_hqd_pq_doorbell_control =
4912 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4913 if (use_doorbell)
4914 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4915 else
4916 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_EN;
4917 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4918 mqd->queue_state.cp_hqd_pq_doorbell_control);
4919
4920 /* disable the queue if it's active */
4921 mqd->queue_state.cp_hqd_dequeue_request = 0;
4922 mqd->queue_state.cp_hqd_pq_rptr = 0;
4923 mqd->queue_state.cp_hqd_pq_wptr= 0;
4924 if (RREG32(CP_HQD_ACTIVE) & 1) {
4925 WREG32(CP_HQD_DEQUEUE_REQUEST, 1);
4926 for (i = 0; i < rdev->usec_timeout; i++) {
4927 if (!(RREG32(CP_HQD_ACTIVE) & 1))
4928 break;
4929 udelay(1);
4930 }
4931 WREG32(CP_HQD_DEQUEUE_REQUEST, mqd->queue_state.cp_hqd_dequeue_request);
4932 WREG32(CP_HQD_PQ_RPTR, mqd->queue_state.cp_hqd_pq_rptr);
4933 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4934 }
4935
4936 /* set the pointer to the MQD */
4937 mqd->queue_state.cp_mqd_base_addr = mqd_gpu_addr & 0xfffffffc;
4938 mqd->queue_state.cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
4939 WREG32(CP_MQD_BASE_ADDR, mqd->queue_state.cp_mqd_base_addr);
4940 WREG32(CP_MQD_BASE_ADDR_HI, mqd->queue_state.cp_mqd_base_addr_hi);
4941 /* set MQD vmid to 0 */
4942 mqd->queue_state.cp_mqd_control = RREG32(CP_MQD_CONTROL);
4943 mqd->queue_state.cp_mqd_control &= ~MQD_VMID_MASK;
4944 WREG32(CP_MQD_CONTROL, mqd->queue_state.cp_mqd_control);
4945
4946 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4947 hqd_gpu_addr = rdev->ring[idx].gpu_addr >> 8;
4948 mqd->queue_state.cp_hqd_pq_base = hqd_gpu_addr;
4949 mqd->queue_state.cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
4950 WREG32(CP_HQD_PQ_BASE, mqd->queue_state.cp_hqd_pq_base);
4951 WREG32(CP_HQD_PQ_BASE_HI, mqd->queue_state.cp_hqd_pq_base_hi);
4952
4953 /* set up the HQD, this is similar to CP_RB0_CNTL */
4954 mqd->queue_state.cp_hqd_pq_control = RREG32(CP_HQD_PQ_CONTROL);
4955 mqd->queue_state.cp_hqd_pq_control &=
4956 ~(QUEUE_SIZE_MASK | RPTR_BLOCK_SIZE_MASK);
4957
4958 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004959 order_base_2(rdev->ring[idx].ring_size / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004960 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004961 (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004962#ifdef __BIG_ENDIAN
4963 mqd->queue_state.cp_hqd_pq_control |= BUF_SWAP_32BIT;
4964#endif
4965 mqd->queue_state.cp_hqd_pq_control &=
4966 ~(UNORD_DISPATCH | ROQ_PQ_IB_FLIP | PQ_VOLATILE);
4967 mqd->queue_state.cp_hqd_pq_control |=
4968 PRIV_STATE | KMD_QUEUE; /* assuming kernel queue control */
4969 WREG32(CP_HQD_PQ_CONTROL, mqd->queue_state.cp_hqd_pq_control);
4970
4971 /* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4972 if (i == 0)
4973 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP1_WPTR_OFFSET;
4974 else
4975 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP2_WPTR_OFFSET;
4976 mqd->queue_state.cp_hqd_pq_wptr_poll_addr = wb_gpu_addr & 0xfffffffc;
4977 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4978 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR, mqd->queue_state.cp_hqd_pq_wptr_poll_addr);
4979 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI,
4980 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi);
4981
4982 /* set the wb address wether it's enabled or not */
4983 if (i == 0)
4984 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET;
4985 else
4986 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET;
4987 mqd->queue_state.cp_hqd_pq_rptr_report_addr = wb_gpu_addr & 0xfffffffc;
4988 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi =
4989 upper_32_bits(wb_gpu_addr) & 0xffff;
4990 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR,
4991 mqd->queue_state.cp_hqd_pq_rptr_report_addr);
4992 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI,
4993 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi);
4994
4995 /* enable the doorbell if requested */
4996 if (use_doorbell) {
4997 mqd->queue_state.cp_hqd_pq_doorbell_control =
4998 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4999 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_OFFSET_MASK;
5000 mqd->queue_state.cp_hqd_pq_doorbell_control |=
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05005001 DOORBELL_OFFSET(rdev->ring[idx].doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04005002 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
5003 mqd->queue_state.cp_hqd_pq_doorbell_control &=
5004 ~(DOORBELL_SOURCE | DOORBELL_HIT);
5005
5006 } else {
5007 mqd->queue_state.cp_hqd_pq_doorbell_control = 0;
5008 }
5009 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
5010 mqd->queue_state.cp_hqd_pq_doorbell_control);
5011
5012 /* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
5013 rdev->ring[idx].wptr = 0;
5014 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
5015 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
Christian Königff212f22014-02-18 14:52:33 +01005016 mqd->queue_state.cp_hqd_pq_rptr = RREG32(CP_HQD_PQ_RPTR);
Alex Deucher963e81f2013-06-26 17:37:11 -04005017
5018 /* set the vmid for the queue */
5019 mqd->queue_state.cp_hqd_vmid = 0;
5020 WREG32(CP_HQD_VMID, mqd->queue_state.cp_hqd_vmid);
5021
5022 /* activate the queue */
5023 mqd->queue_state.cp_hqd_active = 1;
5024 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
5025
5026 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005027 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04005028
5029 radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
5030 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
5031
5032 rdev->ring[idx].ready = true;
5033 r = radeon_ring_test(rdev, idx, &rdev->ring[idx]);
5034 if (r)
5035 rdev->ring[idx].ready = false;
5036 }
5037
Alex Deucher841cf442012-12-18 21:47:44 -05005038 return 0;
5039}
5040
Alex Deucher841cf442012-12-18 21:47:44 -05005041static void cik_cp_enable(struct radeon_device *rdev, bool enable)
5042{
5043 cik_cp_gfx_enable(rdev, enable);
5044 cik_cp_compute_enable(rdev, enable);
5045}
5046
Alex Deucher841cf442012-12-18 21:47:44 -05005047static int cik_cp_load_microcode(struct radeon_device *rdev)
5048{
5049 int r;
5050
5051 r = cik_cp_gfx_load_microcode(rdev);
5052 if (r)
5053 return r;
5054 r = cik_cp_compute_load_microcode(rdev);
5055 if (r)
5056 return r;
5057
5058 return 0;
5059}
5060
Alex Deucher841cf442012-12-18 21:47:44 -05005061static void cik_cp_fini(struct radeon_device *rdev)
5062{
5063 cik_cp_gfx_fini(rdev);
5064 cik_cp_compute_fini(rdev);
5065}
5066
Alex Deucher841cf442012-12-18 21:47:44 -05005067static int cik_cp_resume(struct radeon_device *rdev)
5068{
5069 int r;
5070
Alex Deucher4214faf2013-09-03 10:17:13 -04005071 cik_enable_gui_idle_interrupt(rdev, false);
5072
Alex Deucher841cf442012-12-18 21:47:44 -05005073 r = cik_cp_load_microcode(rdev);
5074 if (r)
5075 return r;
5076
5077 r = cik_cp_gfx_resume(rdev);
5078 if (r)
5079 return r;
5080 r = cik_cp_compute_resume(rdev);
5081 if (r)
5082 return r;
5083
Alex Deucher4214faf2013-09-03 10:17:13 -04005084 cik_enable_gui_idle_interrupt(rdev, true);
5085
Alex Deucher841cf442012-12-18 21:47:44 -05005086 return 0;
5087}
5088
Alex Deuchercc066712013-04-09 12:59:51 -04005089static void cik_print_gpu_status_regs(struct radeon_device *rdev)
5090{
5091 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
5092 RREG32(GRBM_STATUS));
5093 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
5094 RREG32(GRBM_STATUS2));
5095 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
5096 RREG32(GRBM_STATUS_SE0));
5097 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
5098 RREG32(GRBM_STATUS_SE1));
5099 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
5100 RREG32(GRBM_STATUS_SE2));
5101 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
5102 RREG32(GRBM_STATUS_SE3));
5103 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
5104 RREG32(SRBM_STATUS));
5105 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
5106 RREG32(SRBM_STATUS2));
5107 dev_info(rdev->dev, " SDMA0_STATUS_REG = 0x%08X\n",
5108 RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
5109 dev_info(rdev->dev, " SDMA1_STATUS_REG = 0x%08X\n",
5110 RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
Alex Deucher963e81f2013-06-26 17:37:11 -04005111 dev_info(rdev->dev, " CP_STAT = 0x%08x\n", RREG32(CP_STAT));
5112 dev_info(rdev->dev, " CP_STALLED_STAT1 = 0x%08x\n",
5113 RREG32(CP_STALLED_STAT1));
5114 dev_info(rdev->dev, " CP_STALLED_STAT2 = 0x%08x\n",
5115 RREG32(CP_STALLED_STAT2));
5116 dev_info(rdev->dev, " CP_STALLED_STAT3 = 0x%08x\n",
5117 RREG32(CP_STALLED_STAT3));
5118 dev_info(rdev->dev, " CP_CPF_BUSY_STAT = 0x%08x\n",
5119 RREG32(CP_CPF_BUSY_STAT));
5120 dev_info(rdev->dev, " CP_CPF_STALLED_STAT1 = 0x%08x\n",
5121 RREG32(CP_CPF_STALLED_STAT1));
5122 dev_info(rdev->dev, " CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS));
5123 dev_info(rdev->dev, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT));
5124 dev_info(rdev->dev, " CP_CPC_STALLED_STAT1 = 0x%08x\n",
5125 RREG32(CP_CPC_STALLED_STAT1));
5126 dev_info(rdev->dev, " CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS));
Alex Deuchercc066712013-04-09 12:59:51 -04005127}
5128
Alex Deucher6f2043c2013-04-09 12:43:41 -04005129/**
Alex Deuchercc066712013-04-09 12:59:51 -04005130 * cik_gpu_check_soft_reset - check which blocks are busy
5131 *
5132 * @rdev: radeon_device pointer
5133 *
5134 * Check which blocks are busy and return the relevant reset
5135 * mask to be used by cik_gpu_soft_reset().
5136 * Returns a mask of the blocks to be reset.
5137 */
Christian König2483b4e2013-08-13 11:56:54 +02005138u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
Alex Deuchercc066712013-04-09 12:59:51 -04005139{
5140 u32 reset_mask = 0;
5141 u32 tmp;
5142
5143 /* GRBM_STATUS */
5144 tmp = RREG32(GRBM_STATUS);
5145 if (tmp & (PA_BUSY | SC_BUSY |
5146 BCI_BUSY | SX_BUSY |
5147 TA_BUSY | VGT_BUSY |
5148 DB_BUSY | CB_BUSY |
5149 GDS_BUSY | SPI_BUSY |
5150 IA_BUSY | IA_BUSY_NO_DMA))
5151 reset_mask |= RADEON_RESET_GFX;
5152
5153 if (tmp & (CP_BUSY | CP_COHERENCY_BUSY))
5154 reset_mask |= RADEON_RESET_CP;
5155
5156 /* GRBM_STATUS2 */
5157 tmp = RREG32(GRBM_STATUS2);
5158 if (tmp & RLC_BUSY)
5159 reset_mask |= RADEON_RESET_RLC;
5160
5161 /* SDMA0_STATUS_REG */
5162 tmp = RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET);
5163 if (!(tmp & SDMA_IDLE))
5164 reset_mask |= RADEON_RESET_DMA;
5165
5166 /* SDMA1_STATUS_REG */
5167 tmp = RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
5168 if (!(tmp & SDMA_IDLE))
5169 reset_mask |= RADEON_RESET_DMA1;
5170
5171 /* SRBM_STATUS2 */
5172 tmp = RREG32(SRBM_STATUS2);
5173 if (tmp & SDMA_BUSY)
5174 reset_mask |= RADEON_RESET_DMA;
5175
5176 if (tmp & SDMA1_BUSY)
5177 reset_mask |= RADEON_RESET_DMA1;
5178
5179 /* SRBM_STATUS */
5180 tmp = RREG32(SRBM_STATUS);
5181
5182 if (tmp & IH_BUSY)
5183 reset_mask |= RADEON_RESET_IH;
5184
5185 if (tmp & SEM_BUSY)
5186 reset_mask |= RADEON_RESET_SEM;
5187
5188 if (tmp & GRBM_RQ_PENDING)
5189 reset_mask |= RADEON_RESET_GRBM;
5190
5191 if (tmp & VMC_BUSY)
5192 reset_mask |= RADEON_RESET_VMC;
5193
5194 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
5195 MCC_BUSY | MCD_BUSY))
5196 reset_mask |= RADEON_RESET_MC;
5197
5198 if (evergreen_is_display_hung(rdev))
5199 reset_mask |= RADEON_RESET_DISPLAY;
5200
5201 /* Skip MC reset as it's mostly likely not hung, just busy */
5202 if (reset_mask & RADEON_RESET_MC) {
5203 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
5204 reset_mask &= ~RADEON_RESET_MC;
5205 }
5206
5207 return reset_mask;
5208}
5209
5210/**
5211 * cik_gpu_soft_reset - soft reset GPU
5212 *
5213 * @rdev: radeon_device pointer
5214 * @reset_mask: mask of which blocks to reset
5215 *
5216 * Soft reset the blocks specified in @reset_mask.
5217 */
5218static void cik_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
5219{
5220 struct evergreen_mc_save save;
5221 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5222 u32 tmp;
5223
5224 if (reset_mask == 0)
5225 return;
5226
5227 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
5228
5229 cik_print_gpu_status_regs(rdev);
5230 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
5231 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
5232 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5233 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
5234
Alex Deucherfb2c7f42013-10-02 14:54:44 -04005235 /* disable CG/PG */
5236 cik_fini_pg(rdev);
5237 cik_fini_cg(rdev);
5238
Alex Deuchercc066712013-04-09 12:59:51 -04005239 /* stop the rlc */
5240 cik_rlc_stop(rdev);
5241
5242 /* Disable GFX parsing/prefetching */
5243 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5244
5245 /* Disable MEC parsing/prefetching */
5246 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5247
5248 if (reset_mask & RADEON_RESET_DMA) {
5249 /* sdma0 */
5250 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5251 tmp |= SDMA_HALT;
5252 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5253 }
5254 if (reset_mask & RADEON_RESET_DMA1) {
5255 /* sdma1 */
5256 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5257 tmp |= SDMA_HALT;
5258 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5259 }
5260
5261 evergreen_mc_stop(rdev, &save);
5262 if (evergreen_mc_wait_for_idle(rdev)) {
5263 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5264 }
5265
5266 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP))
5267 grbm_soft_reset = SOFT_RESET_CP | SOFT_RESET_GFX;
5268
5269 if (reset_mask & RADEON_RESET_CP) {
5270 grbm_soft_reset |= SOFT_RESET_CP;
5271
5272 srbm_soft_reset |= SOFT_RESET_GRBM;
5273 }
5274
5275 if (reset_mask & RADEON_RESET_DMA)
5276 srbm_soft_reset |= SOFT_RESET_SDMA;
5277
5278 if (reset_mask & RADEON_RESET_DMA1)
5279 srbm_soft_reset |= SOFT_RESET_SDMA1;
5280
5281 if (reset_mask & RADEON_RESET_DISPLAY)
5282 srbm_soft_reset |= SOFT_RESET_DC;
5283
5284 if (reset_mask & RADEON_RESET_RLC)
5285 grbm_soft_reset |= SOFT_RESET_RLC;
5286
5287 if (reset_mask & RADEON_RESET_SEM)
5288 srbm_soft_reset |= SOFT_RESET_SEM;
5289
5290 if (reset_mask & RADEON_RESET_IH)
5291 srbm_soft_reset |= SOFT_RESET_IH;
5292
5293 if (reset_mask & RADEON_RESET_GRBM)
5294 srbm_soft_reset |= SOFT_RESET_GRBM;
5295
5296 if (reset_mask & RADEON_RESET_VMC)
5297 srbm_soft_reset |= SOFT_RESET_VMC;
5298
5299 if (!(rdev->flags & RADEON_IS_IGP)) {
5300 if (reset_mask & RADEON_RESET_MC)
5301 srbm_soft_reset |= SOFT_RESET_MC;
5302 }
5303
5304 if (grbm_soft_reset) {
5305 tmp = RREG32(GRBM_SOFT_RESET);
5306 tmp |= grbm_soft_reset;
5307 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5308 WREG32(GRBM_SOFT_RESET, tmp);
5309 tmp = RREG32(GRBM_SOFT_RESET);
5310
5311 udelay(50);
5312
5313 tmp &= ~grbm_soft_reset;
5314 WREG32(GRBM_SOFT_RESET, tmp);
5315 tmp = RREG32(GRBM_SOFT_RESET);
5316 }
5317
5318 if (srbm_soft_reset) {
5319 tmp = RREG32(SRBM_SOFT_RESET);
5320 tmp |= srbm_soft_reset;
5321 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5322 WREG32(SRBM_SOFT_RESET, tmp);
5323 tmp = RREG32(SRBM_SOFT_RESET);
5324
5325 udelay(50);
5326
5327 tmp &= ~srbm_soft_reset;
5328 WREG32(SRBM_SOFT_RESET, tmp);
5329 tmp = RREG32(SRBM_SOFT_RESET);
5330 }
5331
5332 /* Wait a little for things to settle down */
5333 udelay(50);
5334
5335 evergreen_mc_resume(rdev, &save);
5336 udelay(50);
5337
5338 cik_print_gpu_status_regs(rdev);
5339}
5340
Alex Deucher0279ed12013-10-02 15:18:14 -04005341struct kv_reset_save_regs {
5342 u32 gmcon_reng_execute;
5343 u32 gmcon_misc;
5344 u32 gmcon_misc3;
5345};
5346
5347static void kv_save_regs_for_reset(struct radeon_device *rdev,
5348 struct kv_reset_save_regs *save)
5349{
5350 save->gmcon_reng_execute = RREG32(GMCON_RENG_EXECUTE);
5351 save->gmcon_misc = RREG32(GMCON_MISC);
5352 save->gmcon_misc3 = RREG32(GMCON_MISC3);
5353
5354 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute & ~RENG_EXECUTE_ON_PWR_UP);
5355 WREG32(GMCON_MISC, save->gmcon_misc & ~(RENG_EXECUTE_ON_REG_UPDATE |
5356 STCTRL_STUTTER_EN));
5357}
5358
5359static void kv_restore_regs_for_reset(struct radeon_device *rdev,
5360 struct kv_reset_save_regs *save)
5361{
5362 int i;
5363
5364 WREG32(GMCON_PGFSM_WRITE, 0);
5365 WREG32(GMCON_PGFSM_CONFIG, 0x200010ff);
5366
5367 for (i = 0; i < 5; i++)
5368 WREG32(GMCON_PGFSM_WRITE, 0);
5369
5370 WREG32(GMCON_PGFSM_WRITE, 0);
5371 WREG32(GMCON_PGFSM_CONFIG, 0x300010ff);
5372
5373 for (i = 0; i < 5; i++)
5374 WREG32(GMCON_PGFSM_WRITE, 0);
5375
5376 WREG32(GMCON_PGFSM_WRITE, 0x210000);
5377 WREG32(GMCON_PGFSM_CONFIG, 0xa00010ff);
5378
5379 for (i = 0; i < 5; i++)
5380 WREG32(GMCON_PGFSM_WRITE, 0);
5381
5382 WREG32(GMCON_PGFSM_WRITE, 0x21003);
5383 WREG32(GMCON_PGFSM_CONFIG, 0xb00010ff);
5384
5385 for (i = 0; i < 5; i++)
5386 WREG32(GMCON_PGFSM_WRITE, 0);
5387
5388 WREG32(GMCON_PGFSM_WRITE, 0x2b00);
5389 WREG32(GMCON_PGFSM_CONFIG, 0xc00010ff);
5390
5391 for (i = 0; i < 5; i++)
5392 WREG32(GMCON_PGFSM_WRITE, 0);
5393
5394 WREG32(GMCON_PGFSM_WRITE, 0);
5395 WREG32(GMCON_PGFSM_CONFIG, 0xd00010ff);
5396
5397 for (i = 0; i < 5; i++)
5398 WREG32(GMCON_PGFSM_WRITE, 0);
5399
5400 WREG32(GMCON_PGFSM_WRITE, 0x420000);
5401 WREG32(GMCON_PGFSM_CONFIG, 0x100010ff);
5402
5403 for (i = 0; i < 5; i++)
5404 WREG32(GMCON_PGFSM_WRITE, 0);
5405
5406 WREG32(GMCON_PGFSM_WRITE, 0x120202);
5407 WREG32(GMCON_PGFSM_CONFIG, 0x500010ff);
5408
5409 for (i = 0; i < 5; i++)
5410 WREG32(GMCON_PGFSM_WRITE, 0);
5411
5412 WREG32(GMCON_PGFSM_WRITE, 0x3e3e36);
5413 WREG32(GMCON_PGFSM_CONFIG, 0x600010ff);
5414
5415 for (i = 0; i < 5; i++)
5416 WREG32(GMCON_PGFSM_WRITE, 0);
5417
5418 WREG32(GMCON_PGFSM_WRITE, 0x373f3e);
5419 WREG32(GMCON_PGFSM_CONFIG, 0x700010ff);
5420
5421 for (i = 0; i < 5; i++)
5422 WREG32(GMCON_PGFSM_WRITE, 0);
5423
5424 WREG32(GMCON_PGFSM_WRITE, 0x3e1332);
5425 WREG32(GMCON_PGFSM_CONFIG, 0xe00010ff);
5426
5427 WREG32(GMCON_MISC3, save->gmcon_misc3);
5428 WREG32(GMCON_MISC, save->gmcon_misc);
5429 WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute);
5430}
5431
5432static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
5433{
5434 struct evergreen_mc_save save;
5435 struct kv_reset_save_regs kv_save = { 0 };
5436 u32 tmp, i;
5437
5438 dev_info(rdev->dev, "GPU pci config reset\n");
5439
5440 /* disable dpm? */
5441
5442 /* disable cg/pg */
5443 cik_fini_pg(rdev);
5444 cik_fini_cg(rdev);
5445
5446 /* Disable GFX parsing/prefetching */
5447 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5448
5449 /* Disable MEC parsing/prefetching */
5450 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5451
5452 /* sdma0 */
5453 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5454 tmp |= SDMA_HALT;
5455 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5456 /* sdma1 */
5457 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5458 tmp |= SDMA_HALT;
5459 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5460 /* XXX other engines? */
5461
5462 /* halt the rlc, disable cp internal ints */
5463 cik_rlc_stop(rdev);
5464
5465 udelay(50);
5466
5467 /* disable mem access */
5468 evergreen_mc_stop(rdev, &save);
5469 if (evergreen_mc_wait_for_idle(rdev)) {
5470 dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
5471 }
5472
5473 if (rdev->flags & RADEON_IS_IGP)
5474 kv_save_regs_for_reset(rdev, &kv_save);
5475
5476 /* disable BM */
5477 pci_clear_master(rdev->pdev);
5478 /* reset */
5479 radeon_pci_config_reset(rdev);
5480
5481 udelay(100);
5482
5483 /* wait for asic to come out of reset */
5484 for (i = 0; i < rdev->usec_timeout; i++) {
5485 if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
5486 break;
5487 udelay(1);
5488 }
5489
5490 /* does asic init need to be run first??? */
5491 if (rdev->flags & RADEON_IS_IGP)
5492 kv_restore_regs_for_reset(rdev, &kv_save);
5493}
5494
Alex Deuchercc066712013-04-09 12:59:51 -04005495/**
5496 * cik_asic_reset - soft reset GPU
5497 *
5498 * @rdev: radeon_device pointer
5499 *
5500 * Look up which blocks are hung and attempt
5501 * to reset them.
5502 * Returns 0 for success.
5503 */
5504int cik_asic_reset(struct radeon_device *rdev)
5505{
5506 u32 reset_mask;
5507
5508 reset_mask = cik_gpu_check_soft_reset(rdev);
5509
5510 if (reset_mask)
5511 r600_set_bios_scratch_engine_hung(rdev, true);
5512
Alex Deucher0279ed12013-10-02 15:18:14 -04005513 /* try soft reset */
Alex Deuchercc066712013-04-09 12:59:51 -04005514 cik_gpu_soft_reset(rdev, reset_mask);
5515
5516 reset_mask = cik_gpu_check_soft_reset(rdev);
5517
Alex Deucher0279ed12013-10-02 15:18:14 -04005518 /* try pci config reset */
5519 if (reset_mask && radeon_hard_reset)
5520 cik_gpu_pci_config_reset(rdev);
5521
5522 reset_mask = cik_gpu_check_soft_reset(rdev);
5523
Alex Deuchercc066712013-04-09 12:59:51 -04005524 if (!reset_mask)
5525 r600_set_bios_scratch_engine_hung(rdev, false);
5526
5527 return 0;
5528}
5529
5530/**
5531 * cik_gfx_is_lockup - check if the 3D engine is locked up
Alex Deucher6f2043c2013-04-09 12:43:41 -04005532 *
5533 * @rdev: radeon_device pointer
5534 * @ring: radeon_ring structure holding ring information
5535 *
5536 * Check if the 3D engine is locked up (CIK).
5537 * Returns true if the engine is locked, false if not.
5538 */
Alex Deuchercc066712013-04-09 12:59:51 -04005539bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
Alex Deucher6f2043c2013-04-09 12:43:41 -04005540{
Alex Deuchercc066712013-04-09 12:59:51 -04005541 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005542
Alex Deuchercc066712013-04-09 12:59:51 -04005543 if (!(reset_mask & (RADEON_RESET_GFX |
5544 RADEON_RESET_COMPUTE |
5545 RADEON_RESET_CP))) {
Christian Königff212f22014-02-18 14:52:33 +01005546 radeon_ring_lockup_update(rdev, ring);
Alex Deucher6f2043c2013-04-09 12:43:41 -04005547 return false;
5548 }
Alex Deucher6f2043c2013-04-09 12:43:41 -04005549 return radeon_ring_test_lockup(rdev, ring);
5550}
5551
Alex Deucher1c491652013-04-09 12:45:26 -04005552/* MC */
5553/**
5554 * cik_mc_program - program the GPU memory controller
5555 *
5556 * @rdev: radeon_device pointer
5557 *
5558 * Set the location of vram, gart, and AGP in the GPU's
5559 * physical address space (CIK).
5560 */
5561static void cik_mc_program(struct radeon_device *rdev)
5562{
5563 struct evergreen_mc_save save;
5564 u32 tmp;
5565 int i, j;
5566
5567 /* Initialize HDP */
5568 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
5569 WREG32((0x2c14 + j), 0x00000000);
5570 WREG32((0x2c18 + j), 0x00000000);
5571 WREG32((0x2c1c + j), 0x00000000);
5572 WREG32((0x2c20 + j), 0x00000000);
5573 WREG32((0x2c24 + j), 0x00000000);
5574 }
5575 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
5576
5577 evergreen_mc_stop(rdev, &save);
5578 if (radeon_mc_wait_for_idle(rdev)) {
5579 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5580 }
5581 /* Lockout access through VGA aperture*/
5582 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
5583 /* Update configuration */
5584 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
5585 rdev->mc.vram_start >> 12);
5586 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
5587 rdev->mc.vram_end >> 12);
5588 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
5589 rdev->vram_scratch.gpu_addr >> 12);
5590 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
5591 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
5592 WREG32(MC_VM_FB_LOCATION, tmp);
5593 /* XXX double check these! */
5594 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
5595 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
5596 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
5597 WREG32(MC_VM_AGP_BASE, 0);
5598 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
5599 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
5600 if (radeon_mc_wait_for_idle(rdev)) {
5601 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5602 }
5603 evergreen_mc_resume(rdev, &save);
5604 /* we need to own VRAM, so turn off the VGA renderer here
5605 * to stop it overwriting our objects */
5606 rv515_vga_render_disable(rdev);
5607}
5608
5609/**
5610 * cik_mc_init - initialize the memory controller driver params
5611 *
5612 * @rdev: radeon_device pointer
5613 *
5614 * Look up the amount of vram, vram width, and decide how to place
5615 * vram and gart within the GPU's physical address space (CIK).
5616 * Returns 0 for success.
5617 */
5618static int cik_mc_init(struct radeon_device *rdev)
5619{
5620 u32 tmp;
5621 int chansize, numchan;
5622
5623 /* Get VRAM informations */
5624 rdev->mc.vram_is_ddr = true;
5625 tmp = RREG32(MC_ARB_RAMCFG);
5626 if (tmp & CHANSIZE_MASK) {
5627 chansize = 64;
5628 } else {
5629 chansize = 32;
5630 }
5631 tmp = RREG32(MC_SHARED_CHMAP);
5632 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
5633 case 0:
5634 default:
5635 numchan = 1;
5636 break;
5637 case 1:
5638 numchan = 2;
5639 break;
5640 case 2:
5641 numchan = 4;
5642 break;
5643 case 3:
5644 numchan = 8;
5645 break;
5646 case 4:
5647 numchan = 3;
5648 break;
5649 case 5:
5650 numchan = 6;
5651 break;
5652 case 6:
5653 numchan = 10;
5654 break;
5655 case 7:
5656 numchan = 12;
5657 break;
5658 case 8:
5659 numchan = 16;
5660 break;
5661 }
5662 rdev->mc.vram_width = numchan * chansize;
5663 /* Could aper size report 0 ? */
5664 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
5665 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
5666 /* size in MB on si */
Alex Deucher13c5bfd2013-09-24 10:56:55 -04005667 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
5668 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
Alex Deucher1c491652013-04-09 12:45:26 -04005669 rdev->mc.visible_vram_size = rdev->mc.aper_size;
5670 si_vram_gtt_location(rdev, &rdev->mc);
5671 radeon_update_bandwidth_info(rdev);
5672
5673 return 0;
5674}
5675
5676/*
5677 * GART
5678 * VMID 0 is the physical GPU addresses as used by the kernel.
5679 * VMIDs 1-15 are used for userspace clients and are handled
5680 * by the radeon vm/hsa code.
5681 */
5682/**
5683 * cik_pcie_gart_tlb_flush - gart tlb flush callback
5684 *
5685 * @rdev: radeon_device pointer
5686 *
5687 * Flush the TLB for the VMID 0 page table (CIK).
5688 */
5689void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
5690{
5691 /* flush hdp cache */
5692 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
5693
5694 /* bits 0-15 are the VM contexts0-15 */
5695 WREG32(VM_INVALIDATE_REQUEST, 0x1);
5696}
5697
5698/**
5699 * cik_pcie_gart_enable - gart enable
5700 *
5701 * @rdev: radeon_device pointer
5702 *
5703 * This sets up the TLBs, programs the page tables for VMID0,
5704 * sets up the hw for VMIDs 1-15 which are allocated on
5705 * demand, and sets up the global locations for the LDS, GDS,
5706 * and GPUVM for FSA64 clients (CIK).
5707 * Returns 0 for success, errors for failure.
5708 */
5709static int cik_pcie_gart_enable(struct radeon_device *rdev)
5710{
5711 int r, i;
5712
5713 if (rdev->gart.robj == NULL) {
5714 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
5715 return -EINVAL;
5716 }
5717 r = radeon_gart_table_vram_pin(rdev);
5718 if (r)
5719 return r;
Alex Deucher1c491652013-04-09 12:45:26 -04005720 /* Setup TLB control */
5721 WREG32(MC_VM_MX_L1_TLB_CNTL,
5722 (0xA << 7) |
5723 ENABLE_L1_TLB |
Christian Königec3dbbc2014-05-10 12:17:55 +02005724 ENABLE_L1_FRAGMENT_PROCESSING |
Alex Deucher1c491652013-04-09 12:45:26 -04005725 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5726 ENABLE_ADVANCED_DRIVER_MODEL |
5727 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5728 /* Setup L2 cache */
5729 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
5730 ENABLE_L2_FRAGMENT_PROCESSING |
5731 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5732 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5733 EFFECTIVE_L2_QUEUE_SIZE(7) |
5734 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5735 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
5736 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
Christian Königec3dbbc2014-05-10 12:17:55 +02005737 BANK_SELECT(4) |
5738 L2_CACHE_BIGK_FRAGMENT_SIZE(4));
Alex Deucher1c491652013-04-09 12:45:26 -04005739 /* setup context0 */
5740 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
5741 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
5742 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
5743 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
5744 (u32)(rdev->dummy_page.addr >> 12));
5745 WREG32(VM_CONTEXT0_CNTL2, 0);
5746 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
5747 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
5748
5749 WREG32(0x15D4, 0);
5750 WREG32(0x15D8, 0);
5751 WREG32(0x15DC, 0);
5752
Christian König054e01d2014-08-26 14:45:54 +02005753 /* restore context1-15 */
Alex Deucher1c491652013-04-09 12:45:26 -04005754 /* set vm size, must be a multiple of 4 */
5755 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
5756 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
5757 for (i = 1; i < 16; i++) {
5758 if (i < 8)
5759 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
Christian König054e01d2014-08-26 14:45:54 +02005760 rdev->vm_manager.saved_table_addr[i]);
Alex Deucher1c491652013-04-09 12:45:26 -04005761 else
5762 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
Christian König054e01d2014-08-26 14:45:54 +02005763 rdev->vm_manager.saved_table_addr[i]);
Alex Deucher1c491652013-04-09 12:45:26 -04005764 }
5765
5766 /* enable context1-15 */
5767 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
5768 (u32)(rdev->dummy_page.addr >> 12));
Alex Deuchera00024b2012-09-18 16:06:01 -04005769 WREG32(VM_CONTEXT1_CNTL2, 4);
Alex Deucher1c491652013-04-09 12:45:26 -04005770 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
Christian König4510fb92014-06-05 23:56:50 -04005771 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
Alex Deuchera00024b2012-09-18 16:06:01 -04005772 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5773 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5774 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5775 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5776 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
5777 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
5778 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
5779 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
5780 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
5781 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
5782 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5783 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
Alex Deucher1c491652013-04-09 12:45:26 -04005784
Alex Deucher1c491652013-04-09 12:45:26 -04005785 if (rdev->family == CHIP_KAVERI) {
5786 u32 tmp = RREG32(CHUB_CONTROL);
5787 tmp &= ~BYPASS_VM;
5788 WREG32(CHUB_CONTROL, tmp);
5789 }
5790
5791 /* XXX SH_MEM regs */
5792 /* where to put LDS, scratch, GPUVM in FSA64 space */
Alex Deucherf61d5b462013-08-06 12:40:16 -04005793 mutex_lock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005794 for (i = 0; i < 16; i++) {
Alex Deucherb556b122013-01-29 10:44:22 -05005795 cik_srbm_select(rdev, 0, 0, 0, i);
Alex Deucher21a93e12013-04-09 12:47:11 -04005796 /* CP and shaders */
Alex Deucher1c491652013-04-09 12:45:26 -04005797 WREG32(SH_MEM_CONFIG, 0);
5798 WREG32(SH_MEM_APE1_BASE, 1);
5799 WREG32(SH_MEM_APE1_LIMIT, 0);
5800 WREG32(SH_MEM_BASES, 0);
Alex Deucher21a93e12013-04-09 12:47:11 -04005801 /* SDMA GFX */
5802 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA0_REGISTER_OFFSET, 0);
5803 WREG32(SDMA0_GFX_APE1_CNTL + SDMA0_REGISTER_OFFSET, 0);
5804 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA1_REGISTER_OFFSET, 0);
5805 WREG32(SDMA0_GFX_APE1_CNTL + SDMA1_REGISTER_OFFSET, 0);
5806 /* XXX SDMA RLC - todo */
Alex Deucher1c491652013-04-09 12:45:26 -04005807 }
Alex Deucherb556b122013-01-29 10:44:22 -05005808 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04005809 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04005810
5811 cik_pcie_gart_tlb_flush(rdev);
5812 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
5813 (unsigned)(rdev->mc.gtt_size >> 20),
5814 (unsigned long long)rdev->gart.table_addr);
5815 rdev->gart.ready = true;
5816 return 0;
5817}
5818
5819/**
5820 * cik_pcie_gart_disable - gart disable
5821 *
5822 * @rdev: radeon_device pointer
5823 *
5824 * This disables all VM page table (CIK).
5825 */
5826static void cik_pcie_gart_disable(struct radeon_device *rdev)
5827{
Christian König054e01d2014-08-26 14:45:54 +02005828 unsigned i;
5829
5830 for (i = 1; i < 16; ++i) {
5831 uint32_t reg;
5832 if (i < 8)
5833 reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2);
5834 else
5835 reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2);
5836 rdev->vm_manager.saved_table_addr[i] = RREG32(reg);
5837 }
5838
Alex Deucher1c491652013-04-09 12:45:26 -04005839 /* Disable all tables */
5840 WREG32(VM_CONTEXT0_CNTL, 0);
5841 WREG32(VM_CONTEXT1_CNTL, 0);
5842 /* Setup TLB control */
5843 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5844 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5845 /* Setup L2 cache */
5846 WREG32(VM_L2_CNTL,
5847 ENABLE_L2_FRAGMENT_PROCESSING |
5848 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5849 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5850 EFFECTIVE_L2_QUEUE_SIZE(7) |
5851 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5852 WREG32(VM_L2_CNTL2, 0);
5853 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
5854 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
5855 radeon_gart_table_vram_unpin(rdev);
5856}
5857
5858/**
5859 * cik_pcie_gart_fini - vm fini callback
5860 *
5861 * @rdev: radeon_device pointer
5862 *
5863 * Tears down the driver GART/VM setup (CIK).
5864 */
5865static void cik_pcie_gart_fini(struct radeon_device *rdev)
5866{
5867 cik_pcie_gart_disable(rdev);
5868 radeon_gart_table_vram_free(rdev);
5869 radeon_gart_fini(rdev);
5870}
5871
5872/* vm parser */
5873/**
5874 * cik_ib_parse - vm ib_parse callback
5875 *
5876 * @rdev: radeon_device pointer
5877 * @ib: indirect buffer pointer
5878 *
5879 * CIK uses hw IB checking so this is a nop (CIK).
5880 */
5881int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
5882{
5883 return 0;
5884}
5885
5886/*
5887 * vm
5888 * VMID 0 is the physical GPU addresses as used by the kernel.
5889 * VMIDs 1-15 are used for userspace clients and are handled
5890 * by the radeon vm/hsa code.
5891 */
5892/**
5893 * cik_vm_init - cik vm init callback
5894 *
5895 * @rdev: radeon_device pointer
5896 *
5897 * Inits cik specific vm parameters (number of VMs, base of vram for
5898 * VMIDs 1-15) (CIK).
5899 * Returns 0 for success.
5900 */
5901int cik_vm_init(struct radeon_device *rdev)
5902{
5903 /* number of VMs */
5904 rdev->vm_manager.nvm = 16;
5905 /* base offset of vram pages */
5906 if (rdev->flags & RADEON_IS_IGP) {
5907 u64 tmp = RREG32(MC_VM_FB_OFFSET);
5908 tmp <<= 22;
5909 rdev->vm_manager.vram_base_offset = tmp;
5910 } else
5911 rdev->vm_manager.vram_base_offset = 0;
5912
5913 return 0;
5914}
5915
5916/**
5917 * cik_vm_fini - cik vm fini callback
5918 *
5919 * @rdev: radeon_device pointer
5920 *
5921 * Tear down any asic specific VM setup (CIK).
5922 */
5923void cik_vm_fini(struct radeon_device *rdev)
5924{
5925}
5926
Alex Deucherf96ab482012-08-31 10:37:47 -04005927/**
Alex Deucher3ec7d112013-06-14 10:42:22 -04005928 * cik_vm_decode_fault - print human readable fault info
5929 *
5930 * @rdev: radeon_device pointer
5931 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
5932 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
5933 *
5934 * Print human readable fault information (CIK).
5935 */
5936static void cik_vm_decode_fault(struct radeon_device *rdev,
5937 u32 status, u32 addr, u32 mc_client)
5938{
Alex Deucher939c0d32013-09-30 18:03:06 -04005939 u32 mc_id;
Alex Deucher3ec7d112013-06-14 10:42:22 -04005940 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
5941 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005942 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
5943 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
Alex Deucher3ec7d112013-06-14 10:42:22 -04005944
Alex Deucher939c0d32013-09-30 18:03:06 -04005945 if (rdev->family == CHIP_HAWAII)
5946 mc_id = (status & HAWAII_MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5947 else
5948 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5949
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005950 printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04005951 protections, vmid, addr,
5952 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02005953 block, mc_client, mc_id);
Alex Deucher3ec7d112013-06-14 10:42:22 -04005954}
5955
5956/**
Alex Deucherf96ab482012-08-31 10:37:47 -04005957 * cik_vm_flush - cik vm flush using the CP
5958 *
5959 * @rdev: radeon_device pointer
5960 *
5961 * Update the page table base and flush the VM TLB
5962 * using the CP (CIK).
5963 */
5964void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
5965{
5966 struct radeon_ring *ring = &rdev->ring[ridx];
Christian Königf1d2a262014-07-30 17:18:12 +02005967 int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX);
Alex Deucherf96ab482012-08-31 10:37:47 -04005968
5969 if (vm == NULL)
5970 return;
5971
5972 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Christian Königf1d2a262014-07-30 17:18:12 +02005973 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04005974 WRITE_DATA_DST_SEL(0)));
5975 if (vm->id < 8) {
5976 radeon_ring_write(ring,
5977 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
5978 } else {
5979 radeon_ring_write(ring,
5980 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
5981 }
5982 radeon_ring_write(ring, 0);
5983 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
5984
5985 /* update SH_MEM_* regs */
5986 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04005987 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04005988 WRITE_DATA_DST_SEL(0)));
5989 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
5990 radeon_ring_write(ring, 0);
5991 radeon_ring_write(ring, VMID(vm->id));
5992
5993 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04005994 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04005995 WRITE_DATA_DST_SEL(0)));
5996 radeon_ring_write(ring, SH_MEM_BASES >> 2);
5997 radeon_ring_write(ring, 0);
5998
5999 radeon_ring_write(ring, 0); /* SH_MEM_BASES */
6000 radeon_ring_write(ring, 0); /* SH_MEM_CONFIG */
6001 radeon_ring_write(ring, 1); /* SH_MEM_APE1_BASE */
6002 radeon_ring_write(ring, 0); /* SH_MEM_APE1_LIMIT */
6003
6004 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04006005 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04006006 WRITE_DATA_DST_SEL(0)));
6007 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
6008 radeon_ring_write(ring, 0);
6009 radeon_ring_write(ring, VMID(0));
6010
6011 /* HDP flush */
Alex Deucher780f5dd2014-01-09 16:18:11 -05006012 cik_hdp_flush_cp_ring_emit(rdev, ridx);
Alex Deucherf96ab482012-08-31 10:37:47 -04006013
6014 /* bits 0-15 are the VM contexts0-15 */
6015 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
Alex Deucher4fb0bbd2014-08-07 09:57:21 -04006016 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
Alex Deucherf96ab482012-08-31 10:37:47 -04006017 WRITE_DATA_DST_SEL(0)));
6018 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
6019 radeon_ring_write(ring, 0);
6020 radeon_ring_write(ring, 1 << vm->id);
6021
Alex Deucherb07fdd32013-04-11 09:36:17 -04006022 /* compute doesn't have PFP */
Christian Königf1d2a262014-07-30 17:18:12 +02006023 if (usepfp) {
Alex Deucherb07fdd32013-04-11 09:36:17 -04006024 /* sync PFP to ME, otherwise we might get invalid PFP reads */
6025 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6026 radeon_ring_write(ring, 0x0);
6027 }
Alex Deucherf96ab482012-08-31 10:37:47 -04006028}
6029
Alex Deucherf6796ca2012-11-09 10:44:08 -05006030/*
6031 * RLC
6032 * The RLC is a multi-purpose microengine that handles a
6033 * variety of functions, the most important of which is
6034 * the interrupt controller.
6035 */
Alex Deucher866d83d2013-04-15 17:13:29 -04006036static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
6037 bool enable)
Alex Deucherf6796ca2012-11-09 10:44:08 -05006038{
Alex Deucher866d83d2013-04-15 17:13:29 -04006039 u32 tmp = RREG32(CP_INT_CNTL_RING0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006040
Alex Deucher866d83d2013-04-15 17:13:29 -04006041 if (enable)
6042 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6043 else
6044 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006045 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher866d83d2013-04-15 17:13:29 -04006046}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006047
Alex Deucher866d83d2013-04-15 17:13:29 -04006048static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
6049{
6050 u32 tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006051
Alex Deucher866d83d2013-04-15 17:13:29 -04006052 tmp = RREG32(RLC_LB_CNTL);
6053 if (enable)
6054 tmp |= LOAD_BALANCE_ENABLE;
6055 else
6056 tmp &= ~LOAD_BALANCE_ENABLE;
6057 WREG32(RLC_LB_CNTL, tmp);
6058}
Alex Deucherf6796ca2012-11-09 10:44:08 -05006059
Alex Deucher866d83d2013-04-15 17:13:29 -04006060static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
6061{
6062 u32 i, j, k;
6063 u32 mask;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006064
6065 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6066 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6067 cik_select_se_sh(rdev, i, j);
6068 for (k = 0; k < rdev->usec_timeout; k++) {
6069 if (RREG32(RLC_SERDES_CU_MASTER_BUSY) == 0)
6070 break;
6071 udelay(1);
6072 }
6073 }
6074 }
6075 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6076
6077 mask = SE_MASTER_BUSY_MASK | GC_MASTER_BUSY | TC0_MASTER_BUSY | TC1_MASTER_BUSY;
6078 for (k = 0; k < rdev->usec_timeout; k++) {
6079 if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
6080 break;
6081 udelay(1);
6082 }
6083}
6084
Alex Deucher22c775c2013-07-23 09:41:05 -04006085static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
6086{
6087 u32 tmp;
6088
6089 tmp = RREG32(RLC_CNTL);
6090 if (tmp != rlc)
6091 WREG32(RLC_CNTL, rlc);
6092}
6093
6094static u32 cik_halt_rlc(struct radeon_device *rdev)
6095{
6096 u32 data, orig;
6097
6098 orig = data = RREG32(RLC_CNTL);
6099
6100 if (data & RLC_ENABLE) {
6101 u32 i;
6102
6103 data &= ~RLC_ENABLE;
6104 WREG32(RLC_CNTL, data);
6105
6106 for (i = 0; i < rdev->usec_timeout; i++) {
6107 if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
6108 break;
6109 udelay(1);
6110 }
6111
6112 cik_wait_for_rlc_serdes(rdev);
6113 }
6114
6115 return orig;
6116}
6117
Alex Deuchera412fce2013-04-22 20:23:31 -04006118void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
6119{
6120 u32 tmp, i, mask;
6121
6122 tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
6123 WREG32(RLC_GPR_REG2, tmp);
6124
6125 mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
6126 for (i = 0; i < rdev->usec_timeout; i++) {
6127 if ((RREG32(RLC_GPM_STAT) & mask) == mask)
6128 break;
6129 udelay(1);
6130 }
6131
6132 for (i = 0; i < rdev->usec_timeout; i++) {
6133 if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
6134 break;
6135 udelay(1);
6136 }
6137}
6138
6139void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
6140{
6141 u32 tmp;
6142
6143 tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
6144 WREG32(RLC_GPR_REG2, tmp);
6145}
6146
Alex Deucherf6796ca2012-11-09 10:44:08 -05006147/**
Alex Deucher866d83d2013-04-15 17:13:29 -04006148 * cik_rlc_stop - stop the RLC ME
6149 *
6150 * @rdev: radeon_device pointer
6151 *
6152 * Halt the RLC ME (MicroEngine) (CIK).
6153 */
6154static void cik_rlc_stop(struct radeon_device *rdev)
6155{
Alex Deucher22c775c2013-07-23 09:41:05 -04006156 WREG32(RLC_CNTL, 0);
Alex Deucher866d83d2013-04-15 17:13:29 -04006157
6158 cik_enable_gui_idle_interrupt(rdev, false);
6159
Alex Deucher866d83d2013-04-15 17:13:29 -04006160 cik_wait_for_rlc_serdes(rdev);
6161}
6162
Alex Deucherf6796ca2012-11-09 10:44:08 -05006163/**
6164 * cik_rlc_start - start the RLC ME
6165 *
6166 * @rdev: radeon_device pointer
6167 *
6168 * Unhalt the RLC ME (MicroEngine) (CIK).
6169 */
6170static void cik_rlc_start(struct radeon_device *rdev)
6171{
Alex Deucherf6796ca2012-11-09 10:44:08 -05006172 WREG32(RLC_CNTL, RLC_ENABLE);
6173
Alex Deucher866d83d2013-04-15 17:13:29 -04006174 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006175
6176 udelay(50);
6177}
6178
6179/**
6180 * cik_rlc_resume - setup the RLC hw
6181 *
6182 * @rdev: radeon_device pointer
6183 *
6184 * Initialize the RLC registers, load the ucode,
6185 * and start the RLC (CIK).
6186 * Returns 0 for success, -EINVAL if the ucode is not available.
6187 */
6188static int cik_rlc_resume(struct radeon_device *rdev)
6189{
Alex Deucher22c775c2013-07-23 09:41:05 -04006190 u32 i, size, tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006191
6192 if (!rdev->rlc_fw)
6193 return -EINVAL;
6194
Alex Deucherf6796ca2012-11-09 10:44:08 -05006195 cik_rlc_stop(rdev);
6196
Alex Deucher22c775c2013-07-23 09:41:05 -04006197 /* disable CG */
6198 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
6199 WREG32(RLC_CGCG_CGLS_CTRL, tmp);
6200
Alex Deucher866d83d2013-04-15 17:13:29 -04006201 si_rlc_reset(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006202
Alex Deucher22c775c2013-07-23 09:41:05 -04006203 cik_init_pg(rdev);
6204
6205 cik_init_cg(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006206
6207 WREG32(RLC_LB_CNTR_INIT, 0);
6208 WREG32(RLC_LB_CNTR_MAX, 0x00008000);
6209
6210 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6211 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
6212 WREG32(RLC_LB_PARAMS, 0x00600408);
6213 WREG32(RLC_LB_CNTL, 0x80000004);
6214
6215 WREG32(RLC_MC_CNTL, 0);
6216 WREG32(RLC_UCODE_CNTL, 0);
6217
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006218 if (rdev->new_fw) {
6219 const struct rlc_firmware_header_v1_0 *hdr =
6220 (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
6221 const __le32 *fw_data = (const __le32 *)
6222 (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6223
6224 radeon_ucode_print_rlc_hdr(&hdr->header);
6225
6226 size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
Alex Deucherf6796ca2012-11-09 10:44:08 -05006227 WREG32(RLC_GPM_UCODE_ADDR, 0);
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006228 for (i = 0; i < size; i++)
6229 WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
6230 WREG32(RLC_GPM_UCODE_ADDR, 0);
6231 } else {
6232 const __be32 *fw_data;
6233
6234 switch (rdev->family) {
6235 case CHIP_BONAIRE:
6236 case CHIP_HAWAII:
6237 default:
6238 size = BONAIRE_RLC_UCODE_SIZE;
6239 break;
6240 case CHIP_KAVERI:
6241 size = KV_RLC_UCODE_SIZE;
6242 break;
6243 case CHIP_KABINI:
6244 size = KB_RLC_UCODE_SIZE;
6245 break;
6246 case CHIP_MULLINS:
6247 size = ML_RLC_UCODE_SIZE;
6248 break;
6249 }
6250
6251 fw_data = (const __be32 *)rdev->rlc_fw->data;
6252 WREG32(RLC_GPM_UCODE_ADDR, 0);
6253 for (i = 0; i < size; i++)
6254 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
6255 WREG32(RLC_GPM_UCODE_ADDR, 0);
6256 }
Alex Deucherf6796ca2012-11-09 10:44:08 -05006257
Alex Deucher866d83d2013-04-15 17:13:29 -04006258 /* XXX - find out what chips support lbpw */
6259 cik_enable_lbpw(rdev, false);
6260
Alex Deucher22c775c2013-07-23 09:41:05 -04006261 if (rdev->family == CHIP_BONAIRE)
6262 WREG32(RLC_DRIVER_DMA_STATUS, 0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05006263
6264 cik_rlc_start(rdev);
6265
6266 return 0;
6267}
Alex Deuchera59781b2012-11-09 10:45:57 -05006268
Alex Deucher22c775c2013-07-23 09:41:05 -04006269static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
6270{
6271 u32 data, orig, tmp, tmp2;
6272
6273 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
6274
Alex Deucher473359b2013-08-09 11:18:39 -04006275 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006276 cik_enable_gui_idle_interrupt(rdev, true);
6277
Alex Deucher22c775c2013-07-23 09:41:05 -04006278 tmp = cik_halt_rlc(rdev);
6279
6280 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6281 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6282 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6283 tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
6284 WREG32(RLC_SERDES_WR_CTRL, tmp2);
6285
6286 cik_update_rlc(rdev, tmp);
6287
6288 data |= CGCG_EN | CGLS_EN;
6289 } else {
Alex Deucherddc76ff2013-08-12 17:25:26 -04006290 cik_enable_gui_idle_interrupt(rdev, false);
6291
Alex Deucher22c775c2013-07-23 09:41:05 -04006292 RREG32(CB_CGTT_SCLK_CTRL);
6293 RREG32(CB_CGTT_SCLK_CTRL);
6294 RREG32(CB_CGTT_SCLK_CTRL);
6295 RREG32(CB_CGTT_SCLK_CTRL);
6296
6297 data &= ~(CGCG_EN | CGLS_EN);
6298 }
6299
6300 if (orig != data)
6301 WREG32(RLC_CGCG_CGLS_CTRL, data);
6302
6303}
6304
6305static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
6306{
6307 u32 data, orig, tmp = 0;
6308
Alex Deucher473359b2013-08-09 11:18:39 -04006309 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
6310 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
6311 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
6312 orig = data = RREG32(CP_MEM_SLP_CNTL);
6313 data |= CP_MEM_LS_EN;
6314 if (orig != data)
6315 WREG32(CP_MEM_SLP_CNTL, data);
6316 }
6317 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006318
6319 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6320 data &= 0xfffffffd;
6321 if (orig != data)
6322 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6323
6324 tmp = cik_halt_rlc(rdev);
6325
6326 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6327 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6328 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6329 data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
6330 WREG32(RLC_SERDES_WR_CTRL, data);
6331
6332 cik_update_rlc(rdev, tmp);
6333
Alex Deucher473359b2013-08-09 11:18:39 -04006334 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
6335 orig = data = RREG32(CGTS_SM_CTRL_REG);
6336 data &= ~SM_MODE_MASK;
6337 data |= SM_MODE(0x2);
6338 data |= SM_MODE_ENABLE;
6339 data &= ~CGTS_OVERRIDE;
6340 if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
6341 (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
6342 data &= ~CGTS_LS_OVERRIDE;
6343 data &= ~ON_MONITOR_ADD_MASK;
6344 data |= ON_MONITOR_ADD_EN;
6345 data |= ON_MONITOR_ADD(0x96);
6346 if (orig != data)
6347 WREG32(CGTS_SM_CTRL_REG, data);
6348 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006349 } else {
6350 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6351 data |= 0x00000002;
6352 if (orig != data)
6353 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6354
6355 data = RREG32(RLC_MEM_SLP_CNTL);
6356 if (data & RLC_MEM_LS_EN) {
6357 data &= ~RLC_MEM_LS_EN;
6358 WREG32(RLC_MEM_SLP_CNTL, data);
6359 }
6360
6361 data = RREG32(CP_MEM_SLP_CNTL);
6362 if (data & CP_MEM_LS_EN) {
6363 data &= ~CP_MEM_LS_EN;
6364 WREG32(CP_MEM_SLP_CNTL, data);
6365 }
6366
6367 orig = data = RREG32(CGTS_SM_CTRL_REG);
6368 data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
6369 if (orig != data)
6370 WREG32(CGTS_SM_CTRL_REG, data);
6371
6372 tmp = cik_halt_rlc(rdev);
6373
6374 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6375 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6376 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6377 data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
6378 WREG32(RLC_SERDES_WR_CTRL, data);
6379
6380 cik_update_rlc(rdev, tmp);
6381 }
6382}
6383
6384static const u32 mc_cg_registers[] =
6385{
6386 MC_HUB_MISC_HUB_CG,
6387 MC_HUB_MISC_SIP_CG,
6388 MC_HUB_MISC_VM_CG,
6389 MC_XPB_CLK_GAT,
6390 ATC_MISC_CG,
6391 MC_CITF_MISC_WR_CG,
6392 MC_CITF_MISC_RD_CG,
6393 MC_CITF_MISC_VM_CG,
6394 VM_L2_CG,
6395};
6396
6397static void cik_enable_mc_ls(struct radeon_device *rdev,
6398 bool enable)
6399{
6400 int i;
6401 u32 orig, data;
6402
6403 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6404 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006405 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006406 data |= MC_LS_ENABLE;
6407 else
6408 data &= ~MC_LS_ENABLE;
6409 if (data != orig)
6410 WREG32(mc_cg_registers[i], data);
6411 }
6412}
6413
6414static void cik_enable_mc_mgcg(struct radeon_device *rdev,
6415 bool enable)
6416{
6417 int i;
6418 u32 orig, data;
6419
6420 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6421 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04006422 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006423 data |= MC_CG_ENABLE;
6424 else
6425 data &= ~MC_CG_ENABLE;
6426 if (data != orig)
6427 WREG32(mc_cg_registers[i], data);
6428 }
6429}
6430
6431static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
6432 bool enable)
6433{
6434 u32 orig, data;
6435
Alex Deucher473359b2013-08-09 11:18:39 -04006436 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006437 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
6438 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
6439 } else {
6440 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
6441 data |= 0xff000000;
6442 if (data != orig)
6443 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
6444
6445 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
6446 data |= 0xff000000;
6447 if (data != orig)
6448 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
6449 }
6450}
6451
6452static void cik_enable_sdma_mgls(struct radeon_device *rdev,
6453 bool enable)
6454{
6455 u32 orig, data;
6456
Alex Deucher473359b2013-08-09 11:18:39 -04006457 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006458 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6459 data |= 0x100;
6460 if (orig != data)
6461 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6462
6463 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6464 data |= 0x100;
6465 if (orig != data)
6466 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6467 } else {
6468 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6469 data &= ~0x100;
6470 if (orig != data)
6471 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6472
6473 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6474 data &= ~0x100;
6475 if (orig != data)
6476 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6477 }
6478}
6479
6480static void cik_enable_uvd_mgcg(struct radeon_device *rdev,
6481 bool enable)
6482{
6483 u32 orig, data;
6484
Alex Deucher473359b2013-08-09 11:18:39 -04006485 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006486 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6487 data = 0xfff;
6488 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6489
6490 orig = data = RREG32(UVD_CGC_CTRL);
6491 data |= DCM;
6492 if (orig != data)
6493 WREG32(UVD_CGC_CTRL, data);
6494 } else {
6495 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6496 data &= ~0xfff;
6497 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6498
6499 orig = data = RREG32(UVD_CGC_CTRL);
6500 data &= ~DCM;
6501 if (orig != data)
6502 WREG32(UVD_CGC_CTRL, data);
6503 }
6504}
6505
Alex Deucher473359b2013-08-09 11:18:39 -04006506static void cik_enable_bif_mgls(struct radeon_device *rdev,
6507 bool enable)
6508{
6509 u32 orig, data;
6510
6511 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
6512
6513 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
6514 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
6515 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
6516 else
6517 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
6518 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
6519
6520 if (orig != data)
6521 WREG32_PCIE_PORT(PCIE_CNTL2, data);
6522}
6523
Alex Deucher22c775c2013-07-23 09:41:05 -04006524static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
6525 bool enable)
6526{
6527 u32 orig, data;
6528
6529 orig = data = RREG32(HDP_HOST_PATH_CNTL);
6530
Alex Deucher473359b2013-08-09 11:18:39 -04006531 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006532 data &= ~CLOCK_GATING_DIS;
6533 else
6534 data |= CLOCK_GATING_DIS;
6535
6536 if (orig != data)
6537 WREG32(HDP_HOST_PATH_CNTL, data);
6538}
6539
6540static void cik_enable_hdp_ls(struct radeon_device *rdev,
6541 bool enable)
6542{
6543 u32 orig, data;
6544
6545 orig = data = RREG32(HDP_MEM_POWER_LS);
6546
Alex Deucher473359b2013-08-09 11:18:39 -04006547 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006548 data |= HDP_LS_ENABLE;
6549 else
6550 data &= ~HDP_LS_ENABLE;
6551
6552 if (orig != data)
6553 WREG32(HDP_MEM_POWER_LS, data);
6554}
6555
6556void cik_update_cg(struct radeon_device *rdev,
6557 u32 block, bool enable)
6558{
Alex Deucher4214faf2013-09-03 10:17:13 -04006559
Alex Deucher22c775c2013-07-23 09:41:05 -04006560 if (block & RADEON_CG_BLOCK_GFX) {
Alex Deucher4214faf2013-09-03 10:17:13 -04006561 cik_enable_gui_idle_interrupt(rdev, false);
Alex Deucher22c775c2013-07-23 09:41:05 -04006562 /* order matters! */
6563 if (enable) {
6564 cik_enable_mgcg(rdev, true);
6565 cik_enable_cgcg(rdev, true);
6566 } else {
6567 cik_enable_cgcg(rdev, false);
6568 cik_enable_mgcg(rdev, false);
6569 }
Alex Deucher4214faf2013-09-03 10:17:13 -04006570 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006571 }
6572
6573 if (block & RADEON_CG_BLOCK_MC) {
6574 if (!(rdev->flags & RADEON_IS_IGP)) {
6575 cik_enable_mc_mgcg(rdev, enable);
6576 cik_enable_mc_ls(rdev, enable);
6577 }
6578 }
6579
6580 if (block & RADEON_CG_BLOCK_SDMA) {
6581 cik_enable_sdma_mgcg(rdev, enable);
6582 cik_enable_sdma_mgls(rdev, enable);
6583 }
6584
Alex Deucher473359b2013-08-09 11:18:39 -04006585 if (block & RADEON_CG_BLOCK_BIF) {
6586 cik_enable_bif_mgls(rdev, enable);
6587 }
6588
Alex Deucher22c775c2013-07-23 09:41:05 -04006589 if (block & RADEON_CG_BLOCK_UVD) {
6590 if (rdev->has_uvd)
6591 cik_enable_uvd_mgcg(rdev, enable);
6592 }
6593
6594 if (block & RADEON_CG_BLOCK_HDP) {
6595 cik_enable_hdp_mgcg(rdev, enable);
6596 cik_enable_hdp_ls(rdev, enable);
6597 }
Alex Deuchera1d6f972013-09-06 12:33:04 -04006598
6599 if (block & RADEON_CG_BLOCK_VCE) {
6600 vce_v2_0_enable_mgcg(rdev, enable);
6601 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006602}
6603
6604static void cik_init_cg(struct radeon_device *rdev)
6605{
6606
Alex Deucherddc76ff2013-08-12 17:25:26 -04006607 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04006608
6609 if (rdev->has_uvd)
6610 si_init_uvd_internal_cg(rdev);
6611
6612 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6613 RADEON_CG_BLOCK_SDMA |
Alex Deucher473359b2013-08-09 11:18:39 -04006614 RADEON_CG_BLOCK_BIF |
Alex Deucher22c775c2013-07-23 09:41:05 -04006615 RADEON_CG_BLOCK_UVD |
6616 RADEON_CG_BLOCK_HDP), true);
6617}
6618
Alex Deucher473359b2013-08-09 11:18:39 -04006619static void cik_fini_cg(struct radeon_device *rdev)
6620{
6621 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6622 RADEON_CG_BLOCK_SDMA |
6623 RADEON_CG_BLOCK_BIF |
6624 RADEON_CG_BLOCK_UVD |
6625 RADEON_CG_BLOCK_HDP), false);
6626
6627 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
6628}
6629
Alex Deucher22c775c2013-07-23 09:41:05 -04006630static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
6631 bool enable)
6632{
6633 u32 data, orig;
6634
6635 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006636 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006637 data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6638 else
6639 data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6640 if (orig != data)
6641 WREG32(RLC_PG_CNTL, data);
6642}
6643
6644static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
6645 bool enable)
6646{
6647 u32 data, orig;
6648
6649 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006650 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006651 data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6652 else
6653 data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6654 if (orig != data)
6655 WREG32(RLC_PG_CNTL, data);
6656}
6657
6658static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
6659{
6660 u32 data, orig;
6661
6662 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006663 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
Alex Deucher22c775c2013-07-23 09:41:05 -04006664 data &= ~DISABLE_CP_PG;
6665 else
6666 data |= DISABLE_CP_PG;
6667 if (orig != data)
6668 WREG32(RLC_PG_CNTL, data);
6669}
6670
6671static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
6672{
6673 u32 data, orig;
6674
6675 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006676 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
Alex Deucher22c775c2013-07-23 09:41:05 -04006677 data &= ~DISABLE_GDS_PG;
6678 else
6679 data |= DISABLE_GDS_PG;
6680 if (orig != data)
6681 WREG32(RLC_PG_CNTL, data);
6682}
6683
6684#define CP_ME_TABLE_SIZE 96
6685#define CP_ME_TABLE_OFFSET 2048
6686#define CP_MEC_TABLE_OFFSET 4096
6687
6688void cik_init_cp_pg_table(struct radeon_device *rdev)
6689{
Alex Deucher22c775c2013-07-23 09:41:05 -04006690 volatile u32 *dst_ptr;
6691 int me, i, max_me = 4;
6692 u32 bo_offset = 0;
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006693 u32 table_offset, table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006694
6695 if (rdev->family == CHIP_KAVERI)
6696 max_me = 5;
6697
6698 if (rdev->rlc.cp_table_ptr == NULL)
6699 return;
6700
6701 /* write the cp table buffer */
6702 dst_ptr = rdev->rlc.cp_table_ptr;
6703 for (me = 0; me < max_me; me++) {
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006704 if (rdev->new_fw) {
6705 const __le32 *fw_data;
6706 const struct gfx_firmware_header_v1_0 *hdr;
Alex Deucher22c775c2013-07-23 09:41:05 -04006707
Alex Deucherf2c6b0f2014-06-25 19:32:36 -04006708 if (me == 0) {
6709 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
6710 fw_data = (const __le32 *)
6711 (rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6712 table_offset = le32_to_cpu(hdr->jt_offset);
6713 table_size = le32_to_cpu(hdr->jt_size);
6714 } else if (me == 1) {
6715 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
6716 fw_data = (const __le32 *)
6717 (rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6718 table_offset = le32_to_cpu(hdr->jt_offset);
6719 table_size = le32_to_cpu(hdr->jt_size);
6720 } else if (me == 2) {
6721 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
6722 fw_data = (const __le32 *)
6723 (rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6724 table_offset = le32_to_cpu(hdr->jt_offset);
6725 table_size = le32_to_cpu(hdr->jt_size);
6726 } else if (me == 3) {
6727 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
6728 fw_data = (const __le32 *)
6729 (rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6730 table_offset = le32_to_cpu(hdr->jt_offset);
6731 table_size = le32_to_cpu(hdr->jt_size);
6732 } else {
6733 hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
6734 fw_data = (const __le32 *)
6735 (rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6736 table_offset = le32_to_cpu(hdr->jt_offset);
6737 table_size = le32_to_cpu(hdr->jt_size);
6738 }
6739
6740 for (i = 0; i < table_size; i ++) {
6741 dst_ptr[bo_offset + i] =
6742 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
6743 }
6744 bo_offset += table_size;
6745 } else {
6746 const __be32 *fw_data;
6747 table_size = CP_ME_TABLE_SIZE;
6748
6749 if (me == 0) {
6750 fw_data = (const __be32 *)rdev->ce_fw->data;
6751 table_offset = CP_ME_TABLE_OFFSET;
6752 } else if (me == 1) {
6753 fw_data = (const __be32 *)rdev->pfp_fw->data;
6754 table_offset = CP_ME_TABLE_OFFSET;
6755 } else if (me == 2) {
6756 fw_data = (const __be32 *)rdev->me_fw->data;
6757 table_offset = CP_ME_TABLE_OFFSET;
6758 } else {
6759 fw_data = (const __be32 *)rdev->mec_fw->data;
6760 table_offset = CP_MEC_TABLE_OFFSET;
6761 }
6762
6763 for (i = 0; i < table_size; i ++) {
6764 dst_ptr[bo_offset + i] =
6765 cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
6766 }
6767 bo_offset += table_size;
Alex Deucher22c775c2013-07-23 09:41:05 -04006768 }
Alex Deucher22c775c2013-07-23 09:41:05 -04006769 }
6770}
6771
6772static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
6773 bool enable)
6774{
6775 u32 data, orig;
6776
Alex Deucher2b19d172013-09-04 16:58:29 -04006777 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04006778 orig = data = RREG32(RLC_PG_CNTL);
6779 data |= GFX_PG_ENABLE;
6780 if (orig != data)
6781 WREG32(RLC_PG_CNTL, data);
6782
6783 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6784 data |= AUTO_PG_EN;
6785 if (orig != data)
6786 WREG32(RLC_AUTO_PG_CTRL, data);
6787 } else {
6788 orig = data = RREG32(RLC_PG_CNTL);
6789 data &= ~GFX_PG_ENABLE;
6790 if (orig != data)
6791 WREG32(RLC_PG_CNTL, data);
6792
6793 orig = data = RREG32(RLC_AUTO_PG_CTRL);
6794 data &= ~AUTO_PG_EN;
6795 if (orig != data)
6796 WREG32(RLC_AUTO_PG_CTRL, data);
6797
6798 data = RREG32(DB_RENDER_CONTROL);
6799 }
6800}
6801
6802static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
6803{
6804 u32 mask = 0, tmp, tmp1;
6805 int i;
6806
6807 cik_select_se_sh(rdev, se, sh);
6808 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
6809 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
6810 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6811
6812 tmp &= 0xffff0000;
6813
6814 tmp |= tmp1;
6815 tmp >>= 16;
6816
6817 for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
6818 mask <<= 1;
6819 mask |= 1;
6820 }
6821
6822 return (~tmp) & mask;
6823}
6824
6825static void cik_init_ao_cu_mask(struct radeon_device *rdev)
6826{
6827 u32 i, j, k, active_cu_number = 0;
6828 u32 mask, counter, cu_bitmap;
6829 u32 tmp = 0;
6830
6831 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6832 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6833 mask = 1;
6834 cu_bitmap = 0;
6835 counter = 0;
6836 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
6837 if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
6838 if (counter < 2)
6839 cu_bitmap |= mask;
6840 counter ++;
6841 }
6842 mask <<= 1;
6843 }
6844
6845 active_cu_number += counter;
6846 tmp |= (cu_bitmap << (i * 16 + j * 8));
6847 }
6848 }
6849
6850 WREG32(RLC_PG_AO_CU_MASK, tmp);
6851
6852 tmp = RREG32(RLC_MAX_PG_CU);
6853 tmp &= ~MAX_PU_CU_MASK;
6854 tmp |= MAX_PU_CU(active_cu_number);
6855 WREG32(RLC_MAX_PG_CU, tmp);
6856}
6857
6858static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
6859 bool enable)
6860{
6861 u32 data, orig;
6862
6863 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006864 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006865 data |= STATIC_PER_CU_PG_ENABLE;
6866 else
6867 data &= ~STATIC_PER_CU_PG_ENABLE;
6868 if (orig != data)
6869 WREG32(RLC_PG_CNTL, data);
6870}
6871
6872static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
6873 bool enable)
6874{
6875 u32 data, orig;
6876
6877 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04006878 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04006879 data |= DYN_PER_CU_PG_ENABLE;
6880 else
6881 data &= ~DYN_PER_CU_PG_ENABLE;
6882 if (orig != data)
6883 WREG32(RLC_PG_CNTL, data);
6884}
6885
6886#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
6887#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
6888
6889static void cik_init_gfx_cgpg(struct radeon_device *rdev)
6890{
6891 u32 data, orig;
6892 u32 i;
6893
6894 if (rdev->rlc.cs_data) {
6895 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6896 WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deuchera0f38602013-08-22 11:57:46 -04006897 WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deucher22c775c2013-07-23 09:41:05 -04006898 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
6899 } else {
6900 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6901 for (i = 0; i < 3; i++)
6902 WREG32(RLC_GPM_SCRATCH_DATA, 0);
6903 }
6904 if (rdev->rlc.reg_list) {
6905 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
6906 for (i = 0; i < rdev->rlc.reg_list_size; i++)
6907 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
6908 }
6909
6910 orig = data = RREG32(RLC_PG_CNTL);
6911 data |= GFX_PG_SRC;
6912 if (orig != data)
6913 WREG32(RLC_PG_CNTL, data);
6914
6915 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
6916 WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
6917
6918 data = RREG32(CP_RB_WPTR_POLL_CNTL);
6919 data &= ~IDLE_POLL_COUNT_MASK;
6920 data |= IDLE_POLL_COUNT(0x60);
6921 WREG32(CP_RB_WPTR_POLL_CNTL, data);
6922
6923 data = 0x10101010;
6924 WREG32(RLC_PG_DELAY, data);
6925
6926 data = RREG32(RLC_PG_DELAY_2);
6927 data &= ~0xff;
6928 data |= 0x3;
6929 WREG32(RLC_PG_DELAY_2, data);
6930
6931 data = RREG32(RLC_AUTO_PG_CTRL);
6932 data &= ~GRBM_REG_SGIT_MASK;
6933 data |= GRBM_REG_SGIT(0x700);
6934 WREG32(RLC_AUTO_PG_CTRL, data);
6935
6936}
6937
6938static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
6939{
Alex Deucher473359b2013-08-09 11:18:39 -04006940 cik_enable_gfx_cgpg(rdev, enable);
6941 cik_enable_gfx_static_mgpg(rdev, enable);
6942 cik_enable_gfx_dynamic_mgpg(rdev, enable);
Alex Deucher22c775c2013-07-23 09:41:05 -04006943}
6944
Alex Deuchera0f38602013-08-22 11:57:46 -04006945u32 cik_get_csb_size(struct radeon_device *rdev)
6946{
6947 u32 count = 0;
6948 const struct cs_section_def *sect = NULL;
6949 const struct cs_extent_def *ext = NULL;
6950
6951 if (rdev->rlc.cs_data == NULL)
6952 return 0;
6953
6954 /* begin clear state */
6955 count += 2;
6956 /* context control state */
6957 count += 3;
6958
6959 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6960 for (ext = sect->section; ext->extent != NULL; ++ext) {
6961 if (sect->id == SECT_CONTEXT)
6962 count += 2 + ext->reg_count;
6963 else
6964 return 0;
6965 }
6966 }
6967 /* pa_sc_raster_config/pa_sc_raster_config1 */
6968 count += 4;
6969 /* end clear state */
6970 count += 2;
6971 /* clear state */
6972 count += 2;
6973
6974 return count;
6975}
6976
6977void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
6978{
6979 u32 count = 0, i;
6980 const struct cs_section_def *sect = NULL;
6981 const struct cs_extent_def *ext = NULL;
6982
6983 if (rdev->rlc.cs_data == NULL)
6984 return;
6985 if (buffer == NULL)
6986 return;
6987
Alex Deucher6ba81e52013-10-23 18:27:10 -04006988 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
6989 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04006990
Alex Deucher6ba81e52013-10-23 18:27:10 -04006991 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
6992 buffer[count++] = cpu_to_le32(0x80000000);
6993 buffer[count++] = cpu_to_le32(0x80000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04006994
6995 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6996 for (ext = sect->section; ext->extent != NULL; ++ext) {
6997 if (sect->id == SECT_CONTEXT) {
Alex Deucher6ba81e52013-10-23 18:27:10 -04006998 buffer[count++] =
6999 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
7000 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007001 for (i = 0; i < ext->reg_count; i++)
Alex Deucher6ba81e52013-10-23 18:27:10 -04007002 buffer[count++] = cpu_to_le32(ext->extent[i]);
Alex Deuchera0f38602013-08-22 11:57:46 -04007003 } else {
7004 return;
7005 }
7006 }
7007 }
7008
Alex Deucher6ba81e52013-10-23 18:27:10 -04007009 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
7010 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
Alex Deuchera0f38602013-08-22 11:57:46 -04007011 switch (rdev->family) {
7012 case CHIP_BONAIRE:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007013 buffer[count++] = cpu_to_le32(0x16000012);
7014 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007015 break;
7016 case CHIP_KAVERI:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007017 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7018 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007019 break;
7020 case CHIP_KABINI:
Samuel Lif73a9e82014-04-30 18:40:49 -04007021 case CHIP_MULLINS:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007022 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7023 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007024 break;
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007025 case CHIP_HAWAII:
Alex Deuchera8947f52014-04-02 08:42:48 -04007026 buffer[count++] = cpu_to_le32(0x3a00161a);
7027 buffer[count++] = cpu_to_le32(0x0000002e);
Alex Deucherbbfe90b2013-08-13 22:59:41 -04007028 break;
Alex Deuchera0f38602013-08-22 11:57:46 -04007029 default:
Alex Deucher6ba81e52013-10-23 18:27:10 -04007030 buffer[count++] = cpu_to_le32(0x00000000);
7031 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04007032 break;
7033 }
7034
Alex Deucher6ba81e52013-10-23 18:27:10 -04007035 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
7036 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04007037
Alex Deucher6ba81e52013-10-23 18:27:10 -04007038 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
7039 buffer[count++] = cpu_to_le32(0);
Alex Deuchera0f38602013-08-22 11:57:46 -04007040}
7041
Alex Deucher473359b2013-08-09 11:18:39 -04007042static void cik_init_pg(struct radeon_device *rdev)
Alex Deucher22c775c2013-07-23 09:41:05 -04007043{
Alex Deucher473359b2013-08-09 11:18:39 -04007044 if (rdev->pg_flags) {
Alex Deucher22c775c2013-07-23 09:41:05 -04007045 cik_enable_sck_slowdown_on_pu(rdev, true);
7046 cik_enable_sck_slowdown_on_pd(rdev, true);
Alex Deucher2b19d172013-09-04 16:58:29 -04007047 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007048 cik_init_gfx_cgpg(rdev);
7049 cik_enable_cp_pg(rdev, true);
7050 cik_enable_gds_pg(rdev, true);
7051 }
Alex Deucher22c775c2013-07-23 09:41:05 -04007052 cik_init_ao_cu_mask(rdev);
7053 cik_update_gfx_pg(rdev, true);
7054 }
7055}
7056
Alex Deucher473359b2013-08-09 11:18:39 -04007057static void cik_fini_pg(struct radeon_device *rdev)
7058{
7059 if (rdev->pg_flags) {
7060 cik_update_gfx_pg(rdev, false);
Alex Deucher2b19d172013-09-04 16:58:29 -04007061 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04007062 cik_enable_cp_pg(rdev, false);
7063 cik_enable_gds_pg(rdev, false);
7064 }
7065 }
7066}
7067
Alex Deuchera59781b2012-11-09 10:45:57 -05007068/*
7069 * Interrupts
7070 * Starting with r6xx, interrupts are handled via a ring buffer.
7071 * Ring buffers are areas of GPU accessible memory that the GPU
7072 * writes interrupt vectors into and the host reads vectors out of.
7073 * There is a rptr (read pointer) that determines where the
7074 * host is currently reading, and a wptr (write pointer)
7075 * which determines where the GPU has written. When the
7076 * pointers are equal, the ring is idle. When the GPU
7077 * writes vectors to the ring buffer, it increments the
7078 * wptr. When there is an interrupt, the host then starts
7079 * fetching commands and processing them until the pointers are
7080 * equal again at which point it updates the rptr.
7081 */
7082
7083/**
7084 * cik_enable_interrupts - Enable the interrupt ring buffer
7085 *
7086 * @rdev: radeon_device pointer
7087 *
7088 * Enable the interrupt ring buffer (CIK).
7089 */
7090static void cik_enable_interrupts(struct radeon_device *rdev)
7091{
7092 u32 ih_cntl = RREG32(IH_CNTL);
7093 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7094
7095 ih_cntl |= ENABLE_INTR;
7096 ih_rb_cntl |= IH_RB_ENABLE;
7097 WREG32(IH_CNTL, ih_cntl);
7098 WREG32(IH_RB_CNTL, ih_rb_cntl);
7099 rdev->ih.enabled = true;
7100}
7101
7102/**
7103 * cik_disable_interrupts - Disable the interrupt ring buffer
7104 *
7105 * @rdev: radeon_device pointer
7106 *
7107 * Disable the interrupt ring buffer (CIK).
7108 */
7109static void cik_disable_interrupts(struct radeon_device *rdev)
7110{
7111 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7112 u32 ih_cntl = RREG32(IH_CNTL);
7113
7114 ih_rb_cntl &= ~IH_RB_ENABLE;
7115 ih_cntl &= ~ENABLE_INTR;
7116 WREG32(IH_RB_CNTL, ih_rb_cntl);
7117 WREG32(IH_CNTL, ih_cntl);
7118 /* set rptr, wptr to 0 */
7119 WREG32(IH_RB_RPTR, 0);
7120 WREG32(IH_RB_WPTR, 0);
7121 rdev->ih.enabled = false;
7122 rdev->ih.rptr = 0;
7123}
7124
7125/**
7126 * cik_disable_interrupt_state - Disable all interrupt sources
7127 *
7128 * @rdev: radeon_device pointer
7129 *
7130 * Clear all interrupt enable bits used by the driver (CIK).
7131 */
7132static void cik_disable_interrupt_state(struct radeon_device *rdev)
7133{
7134 u32 tmp;
7135
7136 /* gfx ring */
Alex Deucher4214faf2013-09-03 10:17:13 -04007137 tmp = RREG32(CP_INT_CNTL_RING0) &
7138 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7139 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher21a93e12013-04-09 12:47:11 -04007140 /* sdma */
7141 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7142 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
7143 tmp = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7144 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, tmp);
Alex Deuchera59781b2012-11-09 10:45:57 -05007145 /* compute queues */
7146 WREG32(CP_ME1_PIPE0_INT_CNTL, 0);
7147 WREG32(CP_ME1_PIPE1_INT_CNTL, 0);
7148 WREG32(CP_ME1_PIPE2_INT_CNTL, 0);
7149 WREG32(CP_ME1_PIPE3_INT_CNTL, 0);
7150 WREG32(CP_ME2_PIPE0_INT_CNTL, 0);
7151 WREG32(CP_ME2_PIPE1_INT_CNTL, 0);
7152 WREG32(CP_ME2_PIPE2_INT_CNTL, 0);
7153 WREG32(CP_ME2_PIPE3_INT_CNTL, 0);
7154 /* grbm */
7155 WREG32(GRBM_INT_CNTL, 0);
7156 /* vline/vblank, etc. */
7157 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7158 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7159 if (rdev->num_crtc >= 4) {
7160 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7161 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7162 }
7163 if (rdev->num_crtc >= 6) {
7164 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7165 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7166 }
Christian Königf5d636d2014-04-23 20:46:06 +02007167 /* pflip */
7168 if (rdev->num_crtc >= 2) {
7169 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7170 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7171 }
7172 if (rdev->num_crtc >= 4) {
7173 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7174 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7175 }
7176 if (rdev->num_crtc >= 6) {
7177 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7178 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7179 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007180
7181 /* dac hotplug */
7182 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
7183
7184 /* digital hotplug */
7185 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7186 WREG32(DC_HPD1_INT_CONTROL, tmp);
7187 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7188 WREG32(DC_HPD2_INT_CONTROL, tmp);
7189 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7190 WREG32(DC_HPD3_INT_CONTROL, tmp);
7191 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7192 WREG32(DC_HPD4_INT_CONTROL, tmp);
7193 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7194 WREG32(DC_HPD5_INT_CONTROL, tmp);
7195 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7196 WREG32(DC_HPD6_INT_CONTROL, tmp);
7197
7198}
7199
7200/**
7201 * cik_irq_init - init and enable the interrupt ring
7202 *
7203 * @rdev: radeon_device pointer
7204 *
7205 * Allocate a ring buffer for the interrupt controller,
7206 * enable the RLC, disable interrupts, enable the IH
7207 * ring buffer and enable it (CIK).
7208 * Called at device load and reume.
7209 * Returns 0 for success, errors for failure.
7210 */
7211static int cik_irq_init(struct radeon_device *rdev)
7212{
7213 int ret = 0;
7214 int rb_bufsz;
7215 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
7216
7217 /* allocate ring */
7218 ret = r600_ih_ring_alloc(rdev);
7219 if (ret)
7220 return ret;
7221
7222 /* disable irqs */
7223 cik_disable_interrupts(rdev);
7224
7225 /* init rlc */
7226 ret = cik_rlc_resume(rdev);
7227 if (ret) {
7228 r600_ih_ring_fini(rdev);
7229 return ret;
7230 }
7231
7232 /* setup interrupt control */
7233 /* XXX this should actually be a bus address, not an MC address. same on older asics */
7234 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
7235 interrupt_cntl = RREG32(INTERRUPT_CNTL);
7236 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
7237 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
7238 */
7239 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
7240 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
7241 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
7242 WREG32(INTERRUPT_CNTL, interrupt_cntl);
7243
7244 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
Daniel Vetterb72a8922013-07-10 14:11:59 +02007245 rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007246
7247 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
7248 IH_WPTR_OVERFLOW_CLEAR |
7249 (rb_bufsz << 1));
7250
7251 if (rdev->wb.enabled)
7252 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
7253
7254 /* set the writeback address whether it's enabled or not */
7255 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
7256 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
7257
7258 WREG32(IH_RB_CNTL, ih_rb_cntl);
7259
7260 /* set rptr, wptr to 0 */
7261 WREG32(IH_RB_RPTR, 0);
7262 WREG32(IH_RB_WPTR, 0);
7263
7264 /* Default settings for IH_CNTL (disabled at first) */
7265 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
7266 /* RPTR_REARM only works if msi's are enabled */
7267 if (rdev->msi_enabled)
7268 ih_cntl |= RPTR_REARM;
7269 WREG32(IH_CNTL, ih_cntl);
7270
7271 /* force the active interrupt state to all disabled */
7272 cik_disable_interrupt_state(rdev);
7273
7274 pci_set_master(rdev->pdev);
7275
7276 /* enable irqs */
7277 cik_enable_interrupts(rdev);
7278
7279 return ret;
7280}
7281
7282/**
7283 * cik_irq_set - enable/disable interrupt sources
7284 *
7285 * @rdev: radeon_device pointer
7286 *
7287 * Enable interrupt sources on the GPU (vblanks, hpd,
7288 * etc.) (CIK).
7289 * Returns 0 for success, errors for failure.
7290 */
7291int cik_irq_set(struct radeon_device *rdev)
7292{
Alex Deucher4214faf2013-09-03 10:17:13 -04007293 u32 cp_int_cntl;
Alex Deucher2b0781a2013-04-09 14:26:16 -04007294 u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
7295 u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
Alex Deuchera59781b2012-11-09 10:45:57 -05007296 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
7297 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7298 u32 grbm_int_cntl = 0;
Alex Deucher21a93e12013-04-09 12:47:11 -04007299 u32 dma_cntl, dma_cntl1;
Alex Deucher41a524a2013-08-14 01:01:40 -04007300 u32 thermal_int;
Alex Deuchera59781b2012-11-09 10:45:57 -05007301
7302 if (!rdev->irq.installed) {
7303 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
7304 return -EINVAL;
7305 }
7306 /* don't enable anything if the ih is disabled */
7307 if (!rdev->ih.enabled) {
7308 cik_disable_interrupts(rdev);
7309 /* force the active interrupt state to all disabled */
7310 cik_disable_interrupt_state(rdev);
7311 return 0;
7312 }
7313
Alex Deucher4214faf2013-09-03 10:17:13 -04007314 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
7315 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7316 cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
7317
Alex Deuchera59781b2012-11-09 10:45:57 -05007318 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
7319 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
7320 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
7321 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
7322 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
7323 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
7324
Alex Deucher21a93e12013-04-09 12:47:11 -04007325 dma_cntl = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7326 dma_cntl1 = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7327
Alex Deucher2b0781a2013-04-09 14:26:16 -04007328 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7329 cp_m1p1 = RREG32(CP_ME1_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7330 cp_m1p2 = RREG32(CP_ME1_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7331 cp_m1p3 = RREG32(CP_ME1_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7332 cp_m2p0 = RREG32(CP_ME2_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7333 cp_m2p1 = RREG32(CP_ME2_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7334 cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7335 cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7336
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007337 if (rdev->flags & RADEON_IS_IGP)
7338 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7339 ~(THERM_INTH_MASK | THERM_INTL_MASK);
7340 else
7341 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7342 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
Alex Deucher41a524a2013-08-14 01:01:40 -04007343
Alex Deuchera59781b2012-11-09 10:45:57 -05007344 /* enable CP interrupts on all rings */
7345 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
7346 DRM_DEBUG("cik_irq_set: sw int gfx\n");
7347 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
7348 }
Alex Deucher2b0781a2013-04-09 14:26:16 -04007349 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
7350 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7351 DRM_DEBUG("si_irq_set: sw int cp1\n");
7352 if (ring->me == 1) {
7353 switch (ring->pipe) {
7354 case 0:
7355 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7356 break;
7357 case 1:
7358 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7359 break;
7360 case 2:
7361 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7362 break;
7363 case 3:
7364 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7365 break;
7366 default:
7367 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7368 break;
7369 }
7370 } else if (ring->me == 2) {
7371 switch (ring->pipe) {
7372 case 0:
7373 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7374 break;
7375 case 1:
7376 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7377 break;
7378 case 2:
7379 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7380 break;
7381 case 3:
7382 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7383 break;
7384 default:
7385 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7386 break;
7387 }
7388 } else {
7389 DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring->me);
7390 }
7391 }
7392 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
7393 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7394 DRM_DEBUG("si_irq_set: sw int cp2\n");
7395 if (ring->me == 1) {
7396 switch (ring->pipe) {
7397 case 0:
7398 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7399 break;
7400 case 1:
7401 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7402 break;
7403 case 2:
7404 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7405 break;
7406 case 3:
7407 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7408 break;
7409 default:
7410 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7411 break;
7412 }
7413 } else if (ring->me == 2) {
7414 switch (ring->pipe) {
7415 case 0:
7416 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7417 break;
7418 case 1:
7419 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7420 break;
7421 case 2:
7422 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7423 break;
7424 case 3:
7425 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7426 break;
7427 default:
7428 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7429 break;
7430 }
7431 } else {
7432 DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring->me);
7433 }
7434 }
Alex Deuchera59781b2012-11-09 10:45:57 -05007435
Alex Deucher21a93e12013-04-09 12:47:11 -04007436 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
7437 DRM_DEBUG("cik_irq_set: sw int dma\n");
7438 dma_cntl |= TRAP_ENABLE;
7439 }
7440
7441 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
7442 DRM_DEBUG("cik_irq_set: sw int dma1\n");
7443 dma_cntl1 |= TRAP_ENABLE;
7444 }
7445
Alex Deuchera59781b2012-11-09 10:45:57 -05007446 if (rdev->irq.crtc_vblank_int[0] ||
7447 atomic_read(&rdev->irq.pflip[0])) {
7448 DRM_DEBUG("cik_irq_set: vblank 0\n");
7449 crtc1 |= VBLANK_INTERRUPT_MASK;
7450 }
7451 if (rdev->irq.crtc_vblank_int[1] ||
7452 atomic_read(&rdev->irq.pflip[1])) {
7453 DRM_DEBUG("cik_irq_set: vblank 1\n");
7454 crtc2 |= VBLANK_INTERRUPT_MASK;
7455 }
7456 if (rdev->irq.crtc_vblank_int[2] ||
7457 atomic_read(&rdev->irq.pflip[2])) {
7458 DRM_DEBUG("cik_irq_set: vblank 2\n");
7459 crtc3 |= VBLANK_INTERRUPT_MASK;
7460 }
7461 if (rdev->irq.crtc_vblank_int[3] ||
7462 atomic_read(&rdev->irq.pflip[3])) {
7463 DRM_DEBUG("cik_irq_set: vblank 3\n");
7464 crtc4 |= VBLANK_INTERRUPT_MASK;
7465 }
7466 if (rdev->irq.crtc_vblank_int[4] ||
7467 atomic_read(&rdev->irq.pflip[4])) {
7468 DRM_DEBUG("cik_irq_set: vblank 4\n");
7469 crtc5 |= VBLANK_INTERRUPT_MASK;
7470 }
7471 if (rdev->irq.crtc_vblank_int[5] ||
7472 atomic_read(&rdev->irq.pflip[5])) {
7473 DRM_DEBUG("cik_irq_set: vblank 5\n");
7474 crtc6 |= VBLANK_INTERRUPT_MASK;
7475 }
7476 if (rdev->irq.hpd[0]) {
7477 DRM_DEBUG("cik_irq_set: hpd 1\n");
7478 hpd1 |= DC_HPDx_INT_EN;
7479 }
7480 if (rdev->irq.hpd[1]) {
7481 DRM_DEBUG("cik_irq_set: hpd 2\n");
7482 hpd2 |= DC_HPDx_INT_EN;
7483 }
7484 if (rdev->irq.hpd[2]) {
7485 DRM_DEBUG("cik_irq_set: hpd 3\n");
7486 hpd3 |= DC_HPDx_INT_EN;
7487 }
7488 if (rdev->irq.hpd[3]) {
7489 DRM_DEBUG("cik_irq_set: hpd 4\n");
7490 hpd4 |= DC_HPDx_INT_EN;
7491 }
7492 if (rdev->irq.hpd[4]) {
7493 DRM_DEBUG("cik_irq_set: hpd 5\n");
7494 hpd5 |= DC_HPDx_INT_EN;
7495 }
7496 if (rdev->irq.hpd[5]) {
7497 DRM_DEBUG("cik_irq_set: hpd 6\n");
7498 hpd6 |= DC_HPDx_INT_EN;
7499 }
7500
Alex Deucher41a524a2013-08-14 01:01:40 -04007501 if (rdev->irq.dpm_thermal) {
7502 DRM_DEBUG("dpm thermal\n");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007503 if (rdev->flags & RADEON_IS_IGP)
7504 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7505 else
7506 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
Alex Deucher41a524a2013-08-14 01:01:40 -04007507 }
7508
Alex Deuchera59781b2012-11-09 10:45:57 -05007509 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7510
Alex Deucher21a93e12013-04-09 12:47:11 -04007511 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
7512 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, dma_cntl1);
7513
Alex Deucher2b0781a2013-04-09 14:26:16 -04007514 WREG32(CP_ME1_PIPE0_INT_CNTL, cp_m1p0);
7515 WREG32(CP_ME1_PIPE1_INT_CNTL, cp_m1p1);
7516 WREG32(CP_ME1_PIPE2_INT_CNTL, cp_m1p2);
7517 WREG32(CP_ME1_PIPE3_INT_CNTL, cp_m1p3);
7518 WREG32(CP_ME2_PIPE0_INT_CNTL, cp_m2p0);
7519 WREG32(CP_ME2_PIPE1_INT_CNTL, cp_m2p1);
7520 WREG32(CP_ME2_PIPE2_INT_CNTL, cp_m2p2);
7521 WREG32(CP_ME2_PIPE3_INT_CNTL, cp_m2p3);
7522
Alex Deuchera59781b2012-11-09 10:45:57 -05007523 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
7524
7525 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
7526 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
7527 if (rdev->num_crtc >= 4) {
7528 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
7529 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
7530 }
7531 if (rdev->num_crtc >= 6) {
7532 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
7533 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
7534 }
7535
Christian Königf5d636d2014-04-23 20:46:06 +02007536 if (rdev->num_crtc >= 2) {
7537 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
7538 GRPH_PFLIP_INT_MASK);
7539 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
7540 GRPH_PFLIP_INT_MASK);
7541 }
7542 if (rdev->num_crtc >= 4) {
7543 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
7544 GRPH_PFLIP_INT_MASK);
7545 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
7546 GRPH_PFLIP_INT_MASK);
7547 }
7548 if (rdev->num_crtc >= 6) {
7549 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
7550 GRPH_PFLIP_INT_MASK);
7551 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
7552 GRPH_PFLIP_INT_MASK);
7553 }
7554
Alex Deuchera59781b2012-11-09 10:45:57 -05007555 WREG32(DC_HPD1_INT_CONTROL, hpd1);
7556 WREG32(DC_HPD2_INT_CONTROL, hpd2);
7557 WREG32(DC_HPD3_INT_CONTROL, hpd3);
7558 WREG32(DC_HPD4_INT_CONTROL, hpd4);
7559 WREG32(DC_HPD5_INT_CONTROL, hpd5);
7560 WREG32(DC_HPD6_INT_CONTROL, hpd6);
7561
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04007562 if (rdev->flags & RADEON_IS_IGP)
7563 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7564 else
7565 WREG32_SMC(CG_THERMAL_INT, thermal_int);
Alex Deucher41a524a2013-08-14 01:01:40 -04007566
Alex Deuchera59781b2012-11-09 10:45:57 -05007567 return 0;
7568}
7569
7570/**
7571 * cik_irq_ack - ack interrupt sources
7572 *
7573 * @rdev: radeon_device pointer
7574 *
7575 * Ack interrupt sources on the GPU (vblanks, hpd,
7576 * etc.) (CIK). Certain interrupts sources are sw
7577 * generated and do not require an explicit ack.
7578 */
7579static inline void cik_irq_ack(struct radeon_device *rdev)
7580{
7581 u32 tmp;
7582
7583 rdev->irq.stat_regs.cik.disp_int = RREG32(DISP_INTERRUPT_STATUS);
7584 rdev->irq.stat_regs.cik.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
7585 rdev->irq.stat_regs.cik.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
7586 rdev->irq.stat_regs.cik.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
7587 rdev->irq.stat_regs.cik.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
7588 rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
7589 rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
7590
Christian Königf5d636d2014-04-23 20:46:06 +02007591 rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
7592 EVERGREEN_CRTC0_REGISTER_OFFSET);
7593 rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
7594 EVERGREEN_CRTC1_REGISTER_OFFSET);
7595 if (rdev->num_crtc >= 4) {
7596 rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
7597 EVERGREEN_CRTC2_REGISTER_OFFSET);
7598 rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
7599 EVERGREEN_CRTC3_REGISTER_OFFSET);
7600 }
7601 if (rdev->num_crtc >= 6) {
7602 rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
7603 EVERGREEN_CRTC4_REGISTER_OFFSET);
7604 rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
7605 EVERGREEN_CRTC5_REGISTER_OFFSET);
7606 }
7607
7608 if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
7609 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
7610 GRPH_PFLIP_INT_CLEAR);
7611 if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
7612 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
7613 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007614 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
7615 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
7616 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
7617 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
7618 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
7619 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
7620 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)
7621 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
7622
7623 if (rdev->num_crtc >= 4) {
Christian Königf5d636d2014-04-23 20:46:06 +02007624 if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
7625 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
7626 GRPH_PFLIP_INT_CLEAR);
7627 if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
7628 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
7629 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007630 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
7631 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
7632 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
7633 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
7634 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
7635 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
7636 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
7637 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
7638 }
7639
7640 if (rdev->num_crtc >= 6) {
Christian Königf5d636d2014-04-23 20:46:06 +02007641 if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
7642 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
7643 GRPH_PFLIP_INT_CLEAR);
7644 if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
7645 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
7646 GRPH_PFLIP_INT_CLEAR);
Alex Deuchera59781b2012-11-09 10:45:57 -05007647 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
7648 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
7649 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
7650 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
7651 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
7652 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
7653 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
7654 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
7655 }
7656
7657 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7658 tmp = RREG32(DC_HPD1_INT_CONTROL);
7659 tmp |= DC_HPDx_INT_ACK;
7660 WREG32(DC_HPD1_INT_CONTROL, tmp);
7661 }
7662 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7663 tmp = RREG32(DC_HPD2_INT_CONTROL);
7664 tmp |= DC_HPDx_INT_ACK;
7665 WREG32(DC_HPD2_INT_CONTROL, tmp);
7666 }
7667 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
7668 tmp = RREG32(DC_HPD3_INT_CONTROL);
7669 tmp |= DC_HPDx_INT_ACK;
7670 WREG32(DC_HPD3_INT_CONTROL, tmp);
7671 }
7672 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
7673 tmp = RREG32(DC_HPD4_INT_CONTROL);
7674 tmp |= DC_HPDx_INT_ACK;
7675 WREG32(DC_HPD4_INT_CONTROL, tmp);
7676 }
7677 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
7678 tmp = RREG32(DC_HPD5_INT_CONTROL);
7679 tmp |= DC_HPDx_INT_ACK;
7680 WREG32(DC_HPD5_INT_CONTROL, tmp);
7681 }
7682 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
7683 tmp = RREG32(DC_HPD5_INT_CONTROL);
7684 tmp |= DC_HPDx_INT_ACK;
7685 WREG32(DC_HPD6_INT_CONTROL, tmp);
7686 }
7687}
7688
7689/**
7690 * cik_irq_disable - disable interrupts
7691 *
7692 * @rdev: radeon_device pointer
7693 *
7694 * Disable interrupts on the hw (CIK).
7695 */
7696static void cik_irq_disable(struct radeon_device *rdev)
7697{
7698 cik_disable_interrupts(rdev);
7699 /* Wait and acknowledge irq */
7700 mdelay(1);
7701 cik_irq_ack(rdev);
7702 cik_disable_interrupt_state(rdev);
7703}
7704
7705/**
7706 * cik_irq_disable - disable interrupts for suspend
7707 *
7708 * @rdev: radeon_device pointer
7709 *
7710 * Disable interrupts and stop the RLC (CIK).
7711 * Used for suspend.
7712 */
7713static void cik_irq_suspend(struct radeon_device *rdev)
7714{
7715 cik_irq_disable(rdev);
7716 cik_rlc_stop(rdev);
7717}
7718
7719/**
7720 * cik_irq_fini - tear down interrupt support
7721 *
7722 * @rdev: radeon_device pointer
7723 *
7724 * Disable interrupts on the hw and free the IH ring
7725 * buffer (CIK).
7726 * Used for driver unload.
7727 */
7728static void cik_irq_fini(struct radeon_device *rdev)
7729{
7730 cik_irq_suspend(rdev);
7731 r600_ih_ring_fini(rdev);
7732}
7733
7734/**
7735 * cik_get_ih_wptr - get the IH ring buffer wptr
7736 *
7737 * @rdev: radeon_device pointer
7738 *
7739 * Get the IH ring buffer wptr from either the register
7740 * or the writeback memory buffer (CIK). Also check for
7741 * ring buffer overflow and deal with it.
7742 * Used by cik_irq_process().
7743 * Returns the value of the wptr.
7744 */
7745static inline u32 cik_get_ih_wptr(struct radeon_device *rdev)
7746{
7747 u32 wptr, tmp;
7748
7749 if (rdev->wb.enabled)
7750 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
7751 else
7752 wptr = RREG32(IH_RB_WPTR);
7753
7754 if (wptr & RB_OVERFLOW) {
7755 /* When a ring buffer overflow happen start parsing interrupt
7756 * from the last not overwritten vector (wptr + 16). Hopefully
7757 * this should allow us to catchup.
7758 */
7759 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n",
7760 wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
7761 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
7762 tmp = RREG32(IH_RB_CNTL);
7763 tmp |= IH_WPTR_OVERFLOW_CLEAR;
7764 WREG32(IH_RB_CNTL, tmp);
Christian Könige8c214d2014-07-23 09:47:58 +02007765 wptr &= ~RB_OVERFLOW;
Alex Deuchera59781b2012-11-09 10:45:57 -05007766 }
7767 return (wptr & rdev->ih.ptr_mask);
7768}
7769
7770/* CIK IV Ring
7771 * Each IV ring entry is 128 bits:
7772 * [7:0] - interrupt source id
7773 * [31:8] - reserved
7774 * [59:32] - interrupt source data
7775 * [63:60] - reserved
Alex Deucher21a93e12013-04-09 12:47:11 -04007776 * [71:64] - RINGID
7777 * CP:
7778 * ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
Alex Deuchera59781b2012-11-09 10:45:57 -05007779 * QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
7780 * - for gfx, hw shader state (0=PS...5=LS, 6=CS)
7781 * ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
7782 * PIPE_ID - ME0 0=3D
7783 * - ME1&2 compute dispatcher (4 pipes each)
Alex Deucher21a93e12013-04-09 12:47:11 -04007784 * SDMA:
7785 * INSTANCE_ID [1:0], QUEUE_ID[1:0]
7786 * INSTANCE_ID - 0 = sdma0, 1 = sdma1
7787 * QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
Alex Deuchera59781b2012-11-09 10:45:57 -05007788 * [79:72] - VMID
7789 * [95:80] - PASID
7790 * [127:96] - reserved
7791 */
7792/**
7793 * cik_irq_process - interrupt handler
7794 *
7795 * @rdev: radeon_device pointer
7796 *
7797 * Interrupt hander (CIK). Walk the IH ring,
7798 * ack interrupts and schedule work to handle
7799 * interrupt events.
7800 * Returns irq process return code.
7801 */
7802int cik_irq_process(struct radeon_device *rdev)
7803{
Alex Deucher2b0781a2013-04-09 14:26:16 -04007804 struct radeon_ring *cp1_ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7805 struct radeon_ring *cp2_ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
Alex Deuchera59781b2012-11-09 10:45:57 -05007806 u32 wptr;
7807 u32 rptr;
7808 u32 src_id, src_data, ring_id;
7809 u8 me_id, pipe_id, queue_id;
7810 u32 ring_index;
7811 bool queue_hotplug = false;
7812 bool queue_reset = false;
Alex Deucher3ec7d112013-06-14 10:42:22 -04007813 u32 addr, status, mc_client;
Alex Deucher41a524a2013-08-14 01:01:40 -04007814 bool queue_thermal = false;
Alex Deuchera59781b2012-11-09 10:45:57 -05007815
7816 if (!rdev->ih.enabled || rdev->shutdown)
7817 return IRQ_NONE;
7818
7819 wptr = cik_get_ih_wptr(rdev);
7820
7821restart_ih:
7822 /* is somebody else already processing irqs? */
7823 if (atomic_xchg(&rdev->ih.lock, 1))
7824 return IRQ_NONE;
7825
7826 rptr = rdev->ih.rptr;
7827 DRM_DEBUG("cik_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
7828
7829 /* Order reading of wptr vs. reading of IH ring data */
7830 rmb();
7831
7832 /* display interrupts */
7833 cik_irq_ack(rdev);
7834
7835 while (rptr != wptr) {
7836 /* wptr/rptr are in bytes! */
7837 ring_index = rptr / 4;
7838 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
7839 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
7840 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
Alex Deuchera59781b2012-11-09 10:45:57 -05007841
7842 switch (src_id) {
7843 case 1: /* D1 vblank/vline */
7844 switch (src_data) {
7845 case 0: /* D1 vblank */
7846 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) {
7847 if (rdev->irq.crtc_vblank_int[0]) {
7848 drm_handle_vblank(rdev->ddev, 0);
7849 rdev->pm.vblank_sync = true;
7850 wake_up(&rdev->irq.vblank_queue);
7851 }
7852 if (atomic_read(&rdev->irq.pflip[0]))
Christian König1a0e7912014-05-27 16:49:21 +02007853 radeon_crtc_handle_vblank(rdev, 0);
Alex Deuchera59781b2012-11-09 10:45:57 -05007854 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
7855 DRM_DEBUG("IH: D1 vblank\n");
7856 }
7857 break;
7858 case 1: /* D1 vline */
7859 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) {
7860 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT;
7861 DRM_DEBUG("IH: D1 vline\n");
7862 }
7863 break;
7864 default:
7865 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7866 break;
7867 }
7868 break;
7869 case 2: /* D2 vblank/vline */
7870 switch (src_data) {
7871 case 0: /* D2 vblank */
7872 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
7873 if (rdev->irq.crtc_vblank_int[1]) {
7874 drm_handle_vblank(rdev->ddev, 1);
7875 rdev->pm.vblank_sync = true;
7876 wake_up(&rdev->irq.vblank_queue);
7877 }
7878 if (atomic_read(&rdev->irq.pflip[1]))
Christian König1a0e7912014-05-27 16:49:21 +02007879 radeon_crtc_handle_vblank(rdev, 1);
Alex Deuchera59781b2012-11-09 10:45:57 -05007880 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
7881 DRM_DEBUG("IH: D2 vblank\n");
7882 }
7883 break;
7884 case 1: /* D2 vline */
7885 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
7886 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
7887 DRM_DEBUG("IH: D2 vline\n");
7888 }
7889 break;
7890 default:
7891 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7892 break;
7893 }
7894 break;
7895 case 3: /* D3 vblank/vline */
7896 switch (src_data) {
7897 case 0: /* D3 vblank */
7898 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
7899 if (rdev->irq.crtc_vblank_int[2]) {
7900 drm_handle_vblank(rdev->ddev, 2);
7901 rdev->pm.vblank_sync = true;
7902 wake_up(&rdev->irq.vblank_queue);
7903 }
7904 if (atomic_read(&rdev->irq.pflip[2]))
Christian König1a0e7912014-05-27 16:49:21 +02007905 radeon_crtc_handle_vblank(rdev, 2);
Alex Deuchera59781b2012-11-09 10:45:57 -05007906 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
7907 DRM_DEBUG("IH: D3 vblank\n");
7908 }
7909 break;
7910 case 1: /* D3 vline */
7911 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
7912 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
7913 DRM_DEBUG("IH: D3 vline\n");
7914 }
7915 break;
7916 default:
7917 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7918 break;
7919 }
7920 break;
7921 case 4: /* D4 vblank/vline */
7922 switch (src_data) {
7923 case 0: /* D4 vblank */
7924 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
7925 if (rdev->irq.crtc_vblank_int[3]) {
7926 drm_handle_vblank(rdev->ddev, 3);
7927 rdev->pm.vblank_sync = true;
7928 wake_up(&rdev->irq.vblank_queue);
7929 }
7930 if (atomic_read(&rdev->irq.pflip[3]))
Christian König1a0e7912014-05-27 16:49:21 +02007931 radeon_crtc_handle_vblank(rdev, 3);
Alex Deuchera59781b2012-11-09 10:45:57 -05007932 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
7933 DRM_DEBUG("IH: D4 vblank\n");
7934 }
7935 break;
7936 case 1: /* D4 vline */
7937 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
7938 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
7939 DRM_DEBUG("IH: D4 vline\n");
7940 }
7941 break;
7942 default:
7943 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7944 break;
7945 }
7946 break;
7947 case 5: /* D5 vblank/vline */
7948 switch (src_data) {
7949 case 0: /* D5 vblank */
7950 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
7951 if (rdev->irq.crtc_vblank_int[4]) {
7952 drm_handle_vblank(rdev->ddev, 4);
7953 rdev->pm.vblank_sync = true;
7954 wake_up(&rdev->irq.vblank_queue);
7955 }
7956 if (atomic_read(&rdev->irq.pflip[4]))
Christian König1a0e7912014-05-27 16:49:21 +02007957 radeon_crtc_handle_vblank(rdev, 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05007958 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
7959 DRM_DEBUG("IH: D5 vblank\n");
7960 }
7961 break;
7962 case 1: /* D5 vline */
7963 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
7964 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
7965 DRM_DEBUG("IH: D5 vline\n");
7966 }
7967 break;
7968 default:
7969 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7970 break;
7971 }
7972 break;
7973 case 6: /* D6 vblank/vline */
7974 switch (src_data) {
7975 case 0: /* D6 vblank */
7976 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
7977 if (rdev->irq.crtc_vblank_int[5]) {
7978 drm_handle_vblank(rdev->ddev, 5);
7979 rdev->pm.vblank_sync = true;
7980 wake_up(&rdev->irq.vblank_queue);
7981 }
7982 if (atomic_read(&rdev->irq.pflip[5]))
Christian König1a0e7912014-05-27 16:49:21 +02007983 radeon_crtc_handle_vblank(rdev, 5);
Alex Deuchera59781b2012-11-09 10:45:57 -05007984 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
7985 DRM_DEBUG("IH: D6 vblank\n");
7986 }
7987 break;
7988 case 1: /* D6 vline */
7989 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
7990 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
7991 DRM_DEBUG("IH: D6 vline\n");
7992 }
7993 break;
7994 default:
7995 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7996 break;
7997 }
7998 break;
Christian Königf5d636d2014-04-23 20:46:06 +02007999 case 8: /* D1 page flip */
8000 case 10: /* D2 page flip */
8001 case 12: /* D3 page flip */
8002 case 14: /* D4 page flip */
8003 case 16: /* D5 page flip */
8004 case 18: /* D6 page flip */
8005 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
Mario Kleiner39dc5452014-07-29 06:21:44 +02008006 if (radeon_use_pflipirq > 0)
8007 radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
Christian Königf5d636d2014-04-23 20:46:06 +02008008 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008009 case 42: /* HPD hotplug */
8010 switch (src_data) {
8011 case 0:
8012 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
8013 rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT;
8014 queue_hotplug = true;
8015 DRM_DEBUG("IH: HPD1\n");
8016 }
8017 break;
8018 case 1:
8019 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
8020 rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT;
8021 queue_hotplug = true;
8022 DRM_DEBUG("IH: HPD2\n");
8023 }
8024 break;
8025 case 2:
8026 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
8027 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
8028 queue_hotplug = true;
8029 DRM_DEBUG("IH: HPD3\n");
8030 }
8031 break;
8032 case 3:
8033 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
8034 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
8035 queue_hotplug = true;
8036 DRM_DEBUG("IH: HPD4\n");
8037 }
8038 break;
8039 case 4:
8040 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
8041 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
8042 queue_hotplug = true;
8043 DRM_DEBUG("IH: HPD5\n");
8044 }
8045 break;
8046 case 5:
8047 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
8048 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
8049 queue_hotplug = true;
8050 DRM_DEBUG("IH: HPD6\n");
8051 }
8052 break;
8053 default:
8054 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8055 break;
8056 }
8057 break;
Christian König6a3808b2013-08-30 11:10:33 +02008058 case 124: /* UVD */
8059 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
8060 radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
8061 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04008062 case 146:
8063 case 147:
Alex Deucher3ec7d112013-06-14 10:42:22 -04008064 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
8065 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
8066 mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
Christian König9b7d7862014-07-07 11:16:29 +02008067 /* reset addr and status */
8068 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
8069 if (addr == 0x0 && status == 0x0)
8070 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04008071 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
8072 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008073 addr);
Alex Deucher9d97c992012-09-06 14:24:48 -04008074 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04008075 status);
8076 cik_vm_decode_fault(rdev, status, addr, mc_client);
Alex Deucher9d97c992012-09-06 14:24:48 -04008077 break;
Christian Königd93f7932013-05-23 12:10:04 +02008078 case 167: /* VCE */
8079 DRM_DEBUG("IH: VCE int: 0x%08x\n", src_data);
8080 switch (src_data) {
8081 case 0:
8082 radeon_fence_process(rdev, TN_RING_TYPE_VCE1_INDEX);
8083 break;
8084 case 1:
8085 radeon_fence_process(rdev, TN_RING_TYPE_VCE2_INDEX);
8086 break;
8087 default:
8088 DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
8089 break;
8090 }
8091 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008092 case 176: /* GFX RB CP_INT */
8093 case 177: /* GFX IB CP_INT */
8094 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8095 break;
8096 case 181: /* CP EOP event */
8097 DRM_DEBUG("IH: CP EOP\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008098 /* XXX check the bitfield order! */
8099 me_id = (ring_id & 0x60) >> 5;
8100 pipe_id = (ring_id & 0x18) >> 3;
8101 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008102 switch (me_id) {
8103 case 0:
8104 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8105 break;
8106 case 1:
Alex Deuchera59781b2012-11-09 10:45:57 -05008107 case 2:
Alex Deucher2b0781a2013-04-09 14:26:16 -04008108 if ((cp1_ring->me == me_id) & (cp1_ring->pipe == pipe_id))
8109 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8110 if ((cp2_ring->me == me_id) & (cp2_ring->pipe == pipe_id))
8111 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
Alex Deuchera59781b2012-11-09 10:45:57 -05008112 break;
8113 }
8114 break;
8115 case 184: /* CP Privileged reg access */
8116 DRM_ERROR("Illegal register access in command stream\n");
8117 /* 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;
8121 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;
8138 case 185: /* CP Privileged inst */
8139 DRM_ERROR("Illegal instruction in command stream\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04008140 /* XXX check the bitfield order! */
8141 me_id = (ring_id & 0x60) >> 5;
8142 pipe_id = (ring_id & 0x18) >> 3;
8143 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05008144 switch (me_id) {
8145 case 0:
8146 /* This results in a full GPU reset, but all we need to do is soft
8147 * reset the CP for gfx
8148 */
8149 queue_reset = true;
8150 break;
8151 case 1:
8152 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008153 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008154 break;
8155 case 2:
8156 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04008157 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05008158 break;
8159 }
8160 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008161 case 224: /* SDMA trap event */
8162 /* XXX check the bitfield order! */
8163 me_id = (ring_id & 0x3) >> 0;
8164 queue_id = (ring_id & 0xc) >> 2;
8165 DRM_DEBUG("IH: SDMA trap\n");
8166 switch (me_id) {
8167 case 0:
8168 switch (queue_id) {
8169 case 0:
8170 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
8171 break;
8172 case 1:
8173 /* XXX compute */
8174 break;
8175 case 2:
8176 /* XXX compute */
8177 break;
8178 }
8179 break;
8180 case 1:
8181 switch (queue_id) {
8182 case 0:
8183 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8184 break;
8185 case 1:
8186 /* XXX compute */
8187 break;
8188 case 2:
8189 /* XXX compute */
8190 break;
8191 }
8192 break;
8193 }
8194 break;
Alex Deucher41a524a2013-08-14 01:01:40 -04008195 case 230: /* thermal low to high */
8196 DRM_DEBUG("IH: thermal low to high\n");
8197 rdev->pm.dpm.thermal.high_to_low = false;
8198 queue_thermal = true;
8199 break;
8200 case 231: /* thermal high to low */
8201 DRM_DEBUG("IH: thermal high to low\n");
8202 rdev->pm.dpm.thermal.high_to_low = true;
8203 queue_thermal = true;
8204 break;
8205 case 233: /* GUI IDLE */
8206 DRM_DEBUG("IH: GUI idle\n");
8207 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04008208 case 241: /* SDMA Privileged inst */
8209 case 247: /* SDMA Privileged inst */
8210 DRM_ERROR("Illegal instruction in SDMA command stream\n");
8211 /* XXX check the bitfield order! */
8212 me_id = (ring_id & 0x3) >> 0;
8213 queue_id = (ring_id & 0xc) >> 2;
8214 switch (me_id) {
8215 case 0:
8216 switch (queue_id) {
8217 case 0:
8218 queue_reset = true;
8219 break;
8220 case 1:
8221 /* XXX compute */
8222 queue_reset = true;
8223 break;
8224 case 2:
8225 /* XXX compute */
8226 queue_reset = true;
8227 break;
8228 }
8229 break;
8230 case 1:
8231 switch (queue_id) {
8232 case 0:
8233 queue_reset = true;
8234 break;
8235 case 1:
8236 /* XXX compute */
8237 queue_reset = true;
8238 break;
8239 case 2:
8240 /* XXX compute */
8241 queue_reset = true;
8242 break;
8243 }
8244 break;
8245 }
8246 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05008247 default:
8248 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8249 break;
8250 }
8251
8252 /* wptr/rptr are in bytes! */
8253 rptr += 16;
8254 rptr &= rdev->ih.ptr_mask;
8255 }
8256 if (queue_hotplug)
8257 schedule_work(&rdev->hotplug_work);
Christian König3c036382014-08-27 15:22:01 +02008258 if (queue_reset) {
8259 rdev->needs_reset = true;
8260 wake_up_all(&rdev->fence_queue);
8261 }
Alex Deucher41a524a2013-08-14 01:01:40 -04008262 if (queue_thermal)
8263 schedule_work(&rdev->pm.dpm.thermal.work);
Alex Deuchera59781b2012-11-09 10:45:57 -05008264 rdev->ih.rptr = rptr;
8265 WREG32(IH_RB_RPTR, rdev->ih.rptr);
8266 atomic_set(&rdev->ih.lock, 0);
8267
8268 /* make sure wptr hasn't changed while processing */
8269 wptr = cik_get_ih_wptr(rdev);
8270 if (wptr != rptr)
8271 goto restart_ih;
8272
8273 return IRQ_HANDLED;
8274}
Alex Deucher7bf94a22012-08-17 11:48:29 -04008275
8276/*
8277 * startup/shutdown callbacks
8278 */
8279/**
8280 * cik_startup - program the asic to a functional state
8281 *
8282 * @rdev: radeon_device pointer
8283 *
8284 * Programs the asic to a functional state (CIK).
8285 * Called by cik_init() and cik_resume().
8286 * Returns 0 for success, error for failure.
8287 */
8288static int cik_startup(struct radeon_device *rdev)
8289{
8290 struct radeon_ring *ring;
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008291 u32 nop;
Alex Deucher7bf94a22012-08-17 11:48:29 -04008292 int r;
8293
Alex Deucher8a7cd272013-08-06 11:29:39 -04008294 /* enable pcie gen2/3 link */
8295 cik_pcie_gen3_enable(rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -04008296 /* enable aspm */
8297 cik_program_aspm(rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -04008298
Alex Deuchere5903d32013-08-30 08:58:20 -04008299 /* scratch needs to be initialized before MC */
8300 r = r600_vram_scratch_init(rdev);
8301 if (r)
8302 return r;
8303
Alex Deucher6fab3feb2013-08-04 12:13:17 -04008304 cik_mc_program(rdev);
8305
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008306 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
Alex Deucher7bf94a22012-08-17 11:48:29 -04008307 r = ci_mc_load_microcode(rdev);
8308 if (r) {
8309 DRM_ERROR("Failed to load MC firmware!\n");
8310 return r;
8311 }
8312 }
8313
Alex Deucher7bf94a22012-08-17 11:48:29 -04008314 r = cik_pcie_gart_enable(rdev);
8315 if (r)
8316 return r;
8317 cik_gpu_init(rdev);
8318
8319 /* allocate rlc buffers */
Alex Deucher22c775c2013-07-23 09:41:05 -04008320 if (rdev->flags & RADEON_IS_IGP) {
8321 if (rdev->family == CHIP_KAVERI) {
8322 rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
8323 rdev->rlc.reg_list_size =
8324 (u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
8325 } else {
8326 rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
8327 rdev->rlc.reg_list_size =
8328 (u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
8329 }
8330 }
8331 rdev->rlc.cs_data = ci_cs_data;
8332 rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
Alex Deucher1fd11772013-04-17 17:53:50 -04008333 r = sumo_rlc_init(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008334 if (r) {
8335 DRM_ERROR("Failed to init rlc BOs!\n");
8336 return r;
8337 }
8338
8339 /* allocate wb buffer */
8340 r = radeon_wb_init(rdev);
8341 if (r)
8342 return r;
8343
Alex Deucher963e81f2013-06-26 17:37:11 -04008344 /* allocate mec buffers */
8345 r = cik_mec_init(rdev);
8346 if (r) {
8347 DRM_ERROR("Failed to init MEC BOs!\n");
8348 return r;
8349 }
8350
Alex Deucher7bf94a22012-08-17 11:48:29 -04008351 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
8352 if (r) {
8353 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8354 return r;
8355 }
8356
Alex Deucher963e81f2013-06-26 17:37:11 -04008357 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8358 if (r) {
8359 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8360 return r;
8361 }
8362
8363 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
8364 if (r) {
8365 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8366 return r;
8367 }
8368
Alex Deucher7bf94a22012-08-17 11:48:29 -04008369 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
8370 if (r) {
8371 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8372 return r;
8373 }
8374
8375 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8376 if (r) {
8377 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8378 return r;
8379 }
8380
Alex Deucher2ce529d2013-08-28 18:12:59 -04008381 r = radeon_uvd_resume(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008382 if (!r) {
Alex Deucher2ce529d2013-08-28 18:12:59 -04008383 r = uvd_v4_2_resume(rdev);
8384 if (!r) {
8385 r = radeon_fence_driver_start_ring(rdev,
8386 R600_RING_TYPE_UVD_INDEX);
8387 if (r)
8388 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
8389 }
Christian König87167bb2013-04-09 13:39:21 -04008390 }
8391 if (r)
8392 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
8393
Christian Königd93f7932013-05-23 12:10:04 +02008394 r = radeon_vce_resume(rdev);
8395 if (!r) {
8396 r = vce_v2_0_resume(rdev);
8397 if (!r)
8398 r = radeon_fence_driver_start_ring(rdev,
8399 TN_RING_TYPE_VCE1_INDEX);
8400 if (!r)
8401 r = radeon_fence_driver_start_ring(rdev,
8402 TN_RING_TYPE_VCE2_INDEX);
8403 }
8404 if (r) {
8405 dev_err(rdev->dev, "VCE init error (%d).\n", r);
8406 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
8407 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
8408 }
8409
Alex Deucher7bf94a22012-08-17 11:48:29 -04008410 /* Enable IRQ */
8411 if (!rdev->irq.installed) {
8412 r = radeon_irq_kms_init(rdev);
8413 if (r)
8414 return r;
8415 }
8416
8417 r = cik_irq_init(rdev);
8418 if (r) {
8419 DRM_ERROR("radeon: IH init failed (%d).\n", r);
8420 radeon_irq_kms_fini(rdev);
8421 return r;
8422 }
8423 cik_irq_set(rdev);
8424
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008425 if (rdev->family == CHIP_HAWAII) {
Alex Deucher78cd3662014-08-01 20:05:31 +02008426 if (rdev->new_fw)
8427 nop = PACKET3(PACKET3_NOP, 0x3FFF);
8428 else
8429 nop = RADEON_CP_PACKET2;
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008430 } else {
8431 nop = PACKET3(PACKET3_NOP, 0x3FFF);
8432 }
8433
Alex Deucher7bf94a22012-08-17 11:48:29 -04008434 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8435 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008436 nop);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008437 if (r)
8438 return r;
8439
Alex Deucher963e81f2013-06-26 17:37:11 -04008440 /* set up the compute queues */
Alex Deucher2615b532013-06-03 11:21:58 -04008441 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008442 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8443 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008444 nop);
Alex Deucher963e81f2013-06-26 17:37:11 -04008445 if (r)
8446 return r;
8447 ring->me = 1; /* first MEC */
8448 ring->pipe = 0; /* first pipe */
8449 ring->queue = 0; /* first queue */
8450 ring->wptr_offs = CIK_WB_CP1_WPTR_OFFSET;
8451
Alex Deucher2615b532013-06-03 11:21:58 -04008452 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04008453 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8454 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
Alex Deucher0e16e4c2014-08-01 20:05:29 +02008455 nop);
Alex Deucher963e81f2013-06-26 17:37:11 -04008456 if (r)
8457 return r;
8458 /* dGPU only have 1 MEC */
8459 ring->me = 1; /* first MEC */
8460 ring->pipe = 0; /* first pipe */
8461 ring->queue = 1; /* second queue */
8462 ring->wptr_offs = CIK_WB_CP2_WPTR_OFFSET;
8463
Alex Deucher7bf94a22012-08-17 11:48:29 -04008464 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8465 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008466 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008467 if (r)
8468 return r;
8469
8470 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8471 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02008472 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04008473 if (r)
8474 return r;
8475
8476 r = cik_cp_resume(rdev);
8477 if (r)
8478 return r;
8479
8480 r = cik_sdma_resume(rdev);
8481 if (r)
8482 return r;
8483
Christian König87167bb2013-04-09 13:39:21 -04008484 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8485 if (ring->ring_size) {
Christian König02c9f7f2013-08-13 11:56:51 +02008486 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
Christian König2e1e6da2013-08-13 11:56:52 +02008487 RADEON_CP_PACKET2);
Christian König87167bb2013-04-09 13:39:21 -04008488 if (!r)
Christian Könige409b122013-08-13 11:56:53 +02008489 r = uvd_v1_0_init(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008490 if (r)
8491 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
8492 }
8493
Christian Königd93f7932013-05-23 12:10:04 +02008494 r = -ENOENT;
8495
8496 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8497 if (ring->ring_size)
8498 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8499 VCE_CMD_NO_OP);
8500
8501 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8502 if (ring->ring_size)
8503 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8504 VCE_CMD_NO_OP);
8505
8506 if (!r)
8507 r = vce_v1_0_init(rdev);
8508 else if (r != -ENOENT)
8509 DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
8510
Alex Deucher7bf94a22012-08-17 11:48:29 -04008511 r = radeon_ib_pool_init(rdev);
8512 if (r) {
8513 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
8514 return r;
8515 }
8516
8517 r = radeon_vm_manager_init(rdev);
8518 if (r) {
8519 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
8520 return r;
8521 }
8522
Alex Deucherb5306022013-07-31 16:51:33 -04008523 r = dce6_audio_init(rdev);
8524 if (r)
8525 return r;
8526
Alex Deucher7bf94a22012-08-17 11:48:29 -04008527 return 0;
8528}
8529
8530/**
8531 * cik_resume - resume the asic to a functional state
8532 *
8533 * @rdev: radeon_device pointer
8534 *
8535 * Programs the asic to a functional state (CIK).
8536 * Called at resume.
8537 * Returns 0 for success, error for failure.
8538 */
8539int cik_resume(struct radeon_device *rdev)
8540{
8541 int r;
8542
8543 /* post card */
8544 atom_asic_init(rdev->mode_info.atom_context);
8545
Alex Deucher0aafd312013-04-09 14:43:30 -04008546 /* init golden registers */
8547 cik_init_golden_registers(rdev);
8548
Alex Deucherbc6a6292014-02-25 12:01:28 -05008549 if (rdev->pm.pm_method == PM_METHOD_DPM)
8550 radeon_pm_resume(rdev);
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008551
Alex Deucher7bf94a22012-08-17 11:48:29 -04008552 rdev->accel_working = true;
8553 r = cik_startup(rdev);
8554 if (r) {
8555 DRM_ERROR("cik startup failed on resume\n");
8556 rdev->accel_working = false;
8557 return r;
8558 }
8559
8560 return r;
8561
8562}
8563
8564/**
8565 * cik_suspend - suspend the asic
8566 *
8567 * @rdev: radeon_device pointer
8568 *
8569 * Bring the chip into a state suitable for suspend (CIK).
8570 * Called at suspend.
8571 * Returns 0 for success.
8572 */
8573int cik_suspend(struct radeon_device *rdev)
8574{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008575 radeon_pm_suspend(rdev);
Alex Deucherb5306022013-07-31 16:51:33 -04008576 dce6_audio_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008577 radeon_vm_manager_fini(rdev);
8578 cik_cp_enable(rdev, false);
8579 cik_sdma_enable(rdev, false);
Christian Könige409b122013-08-13 11:56:53 +02008580 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008581 radeon_uvd_suspend(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008582 radeon_vce_suspend(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008583 cik_fini_pg(rdev);
8584 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008585 cik_irq_suspend(rdev);
8586 radeon_wb_disable(rdev);
8587 cik_pcie_gart_disable(rdev);
8588 return 0;
8589}
8590
8591/* Plan is to move initialization in that function and use
8592 * helper function so that radeon_device_init pretty much
8593 * do nothing more than calling asic specific function. This
8594 * should also allow to remove a bunch of callback function
8595 * like vram_info.
8596 */
8597/**
8598 * cik_init - asic specific driver and hw init
8599 *
8600 * @rdev: radeon_device pointer
8601 *
8602 * Setup asic specific driver variables and program the hw
8603 * to a functional state (CIK).
8604 * Called at driver startup.
8605 * Returns 0 for success, errors for failure.
8606 */
8607int cik_init(struct radeon_device *rdev)
8608{
8609 struct radeon_ring *ring;
8610 int r;
8611
8612 /* Read BIOS */
8613 if (!radeon_get_bios(rdev)) {
8614 if (ASIC_IS_AVIVO(rdev))
8615 return -EINVAL;
8616 }
8617 /* Must be an ATOMBIOS */
8618 if (!rdev->is_atom_bios) {
8619 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
8620 return -EINVAL;
8621 }
8622 r = radeon_atombios_init(rdev);
8623 if (r)
8624 return r;
8625
8626 /* Post card if necessary */
8627 if (!radeon_card_posted(rdev)) {
8628 if (!rdev->bios) {
8629 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
8630 return -EINVAL;
8631 }
8632 DRM_INFO("GPU not posted. posting now...\n");
8633 atom_asic_init(rdev->mode_info.atom_context);
8634 }
Alex Deucher0aafd312013-04-09 14:43:30 -04008635 /* init golden registers */
8636 cik_init_golden_registers(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008637 /* Initialize scratch registers */
8638 cik_scratch_init(rdev);
8639 /* Initialize surface registers */
8640 radeon_surface_init(rdev);
8641 /* Initialize clocks */
8642 radeon_get_clock_info(rdev->ddev);
8643
8644 /* Fence driver */
8645 r = radeon_fence_driver_init(rdev);
8646 if (r)
8647 return r;
8648
8649 /* initialize memory controller */
8650 r = cik_mc_init(rdev);
8651 if (r)
8652 return r;
8653 /* Memory manager */
8654 r = radeon_bo_init(rdev);
8655 if (r)
8656 return r;
8657
Alex Deucher01ac8792013-12-18 19:11:27 -05008658 if (rdev->flags & RADEON_IS_IGP) {
8659 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8660 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
8661 r = cik_init_microcode(rdev);
8662 if (r) {
8663 DRM_ERROR("Failed to load firmware!\n");
8664 return r;
8665 }
8666 }
8667 } else {
8668 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8669 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
8670 !rdev->mc_fw) {
8671 r = cik_init_microcode(rdev);
8672 if (r) {
8673 DRM_ERROR("Failed to load firmware!\n");
8674 return r;
8675 }
8676 }
8677 }
8678
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008679 /* Initialize power management */
8680 radeon_pm_init(rdev);
8681
Alex Deucher7bf94a22012-08-17 11:48:29 -04008682 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8683 ring->ring_obj = NULL;
8684 r600_ring_init(rdev, ring, 1024 * 1024);
8685
Alex Deucher963e81f2013-06-26 17:37:11 -04008686 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8687 ring->ring_obj = NULL;
8688 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008689 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008690 if (r)
8691 return r;
8692
8693 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8694 ring->ring_obj = NULL;
8695 r600_ring_init(rdev, ring, 1024 * 1024);
Andrew Lewyckyd5754ab2013-11-13 15:54:17 -05008696 r = radeon_doorbell_get(rdev, &ring->doorbell_index);
Alex Deucher963e81f2013-06-26 17:37:11 -04008697 if (r)
8698 return r;
8699
Alex Deucher7bf94a22012-08-17 11:48:29 -04008700 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8701 ring->ring_obj = NULL;
8702 r600_ring_init(rdev, ring, 256 * 1024);
8703
8704 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8705 ring->ring_obj = NULL;
8706 r600_ring_init(rdev, ring, 256 * 1024);
8707
Christian König87167bb2013-04-09 13:39:21 -04008708 r = radeon_uvd_init(rdev);
8709 if (!r) {
8710 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8711 ring->ring_obj = NULL;
8712 r600_ring_init(rdev, ring, 4096);
8713 }
8714
Christian Königd93f7932013-05-23 12:10:04 +02008715 r = radeon_vce_init(rdev);
8716 if (!r) {
8717 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8718 ring->ring_obj = NULL;
8719 r600_ring_init(rdev, ring, 4096);
8720
8721 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8722 ring->ring_obj = NULL;
8723 r600_ring_init(rdev, ring, 4096);
8724 }
8725
Alex Deucher7bf94a22012-08-17 11:48:29 -04008726 rdev->ih.ring_obj = NULL;
8727 r600_ih_ring_init(rdev, 64 * 1024);
8728
8729 r = r600_pcie_gart_init(rdev);
8730 if (r)
8731 return r;
8732
8733 rdev->accel_working = true;
8734 r = cik_startup(rdev);
8735 if (r) {
8736 dev_err(rdev->dev, "disabling GPU acceleration\n");
8737 cik_cp_fini(rdev);
8738 cik_sdma_fini(rdev);
8739 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008740 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008741 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008742 radeon_wb_fini(rdev);
8743 radeon_ib_pool_fini(rdev);
8744 radeon_vm_manager_fini(rdev);
8745 radeon_irq_kms_fini(rdev);
8746 cik_pcie_gart_fini(rdev);
8747 rdev->accel_working = false;
8748 }
8749
8750 /* Don't start up if the MC ucode is missing.
8751 * The default clocks and voltages before the MC ucode
8752 * is loaded are not suffient for advanced operations.
8753 */
8754 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
8755 DRM_ERROR("radeon: MC ucode required for NI+.\n");
8756 return -EINVAL;
8757 }
8758
8759 return 0;
8760}
8761
8762/**
8763 * cik_fini - asic specific driver and hw fini
8764 *
8765 * @rdev: radeon_device pointer
8766 *
8767 * Tear down the asic specific driver variables and program the hw
8768 * to an idle state (CIK).
8769 * Called at driver unload.
8770 */
8771void cik_fini(struct radeon_device *rdev)
8772{
Alex Deucher6c7bcce2013-12-18 14:07:14 -05008773 radeon_pm_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008774 cik_cp_fini(rdev);
8775 cik_sdma_fini(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04008776 cik_fini_pg(rdev);
8777 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008778 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04008779 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04008780 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008781 radeon_wb_fini(rdev);
8782 radeon_vm_manager_fini(rdev);
8783 radeon_ib_pool_fini(rdev);
8784 radeon_irq_kms_fini(rdev);
Christian Könige409b122013-08-13 11:56:53 +02008785 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04008786 radeon_uvd_fini(rdev);
Christian Königd93f7932013-05-23 12:10:04 +02008787 radeon_vce_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04008788 cik_pcie_gart_fini(rdev);
8789 r600_vram_scratch_fini(rdev);
8790 radeon_gem_fini(rdev);
8791 radeon_fence_driver_fini(rdev);
8792 radeon_bo_fini(rdev);
8793 radeon_atombios_fini(rdev);
8794 kfree(rdev->bios);
8795 rdev->bios = NULL;
8796}
Alex Deuchercd84a272012-07-20 17:13:13 -04008797
Alex Deucher134b4802013-09-23 12:22:11 -04008798void dce8_program_fmt(struct drm_encoder *encoder)
8799{
8800 struct drm_device *dev = encoder->dev;
8801 struct radeon_device *rdev = dev->dev_private;
8802 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
8803 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
8804 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
8805 int bpc = 0;
8806 u32 tmp = 0;
Alex Deucher6214bb72013-09-24 17:26:26 -04008807 enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
Alex Deucher134b4802013-09-23 12:22:11 -04008808
Alex Deucher6214bb72013-09-24 17:26:26 -04008809 if (connector) {
8810 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
Alex Deucher134b4802013-09-23 12:22:11 -04008811 bpc = radeon_get_monitor_bpc(connector);
Alex Deucher6214bb72013-09-24 17:26:26 -04008812 dither = radeon_connector->dither;
8813 }
Alex Deucher134b4802013-09-23 12:22:11 -04008814
8815 /* LVDS/eDP FMT is set up by atom */
8816 if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
8817 return;
8818
8819 /* not needed for analog */
8820 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
8821 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
8822 return;
8823
8824 if (bpc == 0)
8825 return;
8826
8827 switch (bpc) {
8828 case 6:
Alex Deucher6214bb72013-09-24 17:26:26 -04008829 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008830 /* XXX sort out optimal dither settings */
8831 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8832 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(0));
8833 else
8834 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(0));
8835 break;
8836 case 8:
Alex Deucher6214bb72013-09-24 17:26:26 -04008837 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008838 /* XXX sort out optimal dither settings */
8839 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8840 FMT_RGB_RANDOM_ENABLE |
8841 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(1));
8842 else
8843 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(1));
8844 break;
8845 case 10:
Alex Deucher6214bb72013-09-24 17:26:26 -04008846 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04008847 /* XXX sort out optimal dither settings */
8848 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8849 FMT_RGB_RANDOM_ENABLE |
8850 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(2));
8851 else
8852 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(2));
8853 break;
8854 default:
8855 /* not needed */
8856 break;
8857 }
8858
8859 WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
8860}
8861
Alex Deuchercd84a272012-07-20 17:13:13 -04008862/* display watermark setup */
8863/**
8864 * dce8_line_buffer_adjust - Set up the line buffer
8865 *
8866 * @rdev: radeon_device pointer
8867 * @radeon_crtc: the selected display controller
8868 * @mode: the current display mode on the selected display
8869 * controller
8870 *
8871 * Setup up the line buffer allocation for
8872 * the selected display controller (CIK).
8873 * Returns the line buffer size in pixels.
8874 */
8875static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
8876 struct radeon_crtc *radeon_crtc,
8877 struct drm_display_mode *mode)
8878{
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008879 u32 tmp, buffer_alloc, i;
8880 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
Alex Deuchercd84a272012-07-20 17:13:13 -04008881 /*
8882 * Line Buffer Setup
8883 * There are 6 line buffers, one for each display controllers.
8884 * There are 3 partitions per LB. Select the number of partitions
8885 * to enable based on the display width. For display widths larger
8886 * than 4096, you need use to use 2 display controllers and combine
8887 * them using the stereo blender.
8888 */
8889 if (radeon_crtc->base.enabled && mode) {
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008890 if (mode->crtc_hdisplay < 1920) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008891 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008892 buffer_alloc = 2;
8893 } else if (mode->crtc_hdisplay < 2560) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008894 tmp = 2;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008895 buffer_alloc = 2;
8896 } else if (mode->crtc_hdisplay < 4096) {
Alex Deuchercd84a272012-07-20 17:13:13 -04008897 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008898 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
8899 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008900 DRM_DEBUG_KMS("Mode too big for LB!\n");
8901 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008902 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
Alex Deuchercd84a272012-07-20 17:13:13 -04008903 }
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008904 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04008905 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008906 buffer_alloc = 0;
8907 }
Alex Deuchercd84a272012-07-20 17:13:13 -04008908
8909 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
8910 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
8911
Alex Deucherbc01a8c2013-08-19 11:39:27 -04008912 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
8913 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
8914 for (i = 0; i < rdev->usec_timeout; i++) {
8915 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
8916 DMIF_BUFFERS_ALLOCATED_COMPLETED)
8917 break;
8918 udelay(1);
8919 }
8920
Alex Deuchercd84a272012-07-20 17:13:13 -04008921 if (radeon_crtc->base.enabled && mode) {
8922 switch (tmp) {
8923 case 0:
8924 default:
8925 return 4096 * 2;
8926 case 1:
8927 return 1920 * 2;
8928 case 2:
8929 return 2560 * 2;
8930 }
8931 }
8932
8933 /* controller not enabled, so no lb used */
8934 return 0;
8935}
8936
8937/**
8938 * cik_get_number_of_dram_channels - get the number of dram channels
8939 *
8940 * @rdev: radeon_device pointer
8941 *
8942 * Look up the number of video ram channels (CIK).
8943 * Used for display watermark bandwidth calculations
8944 * Returns the number of dram channels
8945 */
8946static u32 cik_get_number_of_dram_channels(struct radeon_device *rdev)
8947{
8948 u32 tmp = RREG32(MC_SHARED_CHMAP);
8949
8950 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
8951 case 0:
8952 default:
8953 return 1;
8954 case 1:
8955 return 2;
8956 case 2:
8957 return 4;
8958 case 3:
8959 return 8;
8960 case 4:
8961 return 3;
8962 case 5:
8963 return 6;
8964 case 6:
8965 return 10;
8966 case 7:
8967 return 12;
8968 case 8:
8969 return 16;
8970 }
8971}
8972
8973struct dce8_wm_params {
8974 u32 dram_channels; /* number of dram channels */
8975 u32 yclk; /* bandwidth per dram data pin in kHz */
8976 u32 sclk; /* engine clock in kHz */
8977 u32 disp_clk; /* display clock in kHz */
8978 u32 src_width; /* viewport width */
8979 u32 active_time; /* active display time in ns */
8980 u32 blank_time; /* blank time in ns */
8981 bool interlaced; /* mode is interlaced */
8982 fixed20_12 vsc; /* vertical scale ratio */
8983 u32 num_heads; /* number of active crtcs */
8984 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
8985 u32 lb_size; /* line buffer allocated to pipe */
8986 u32 vtaps; /* vertical scaler taps */
8987};
8988
8989/**
8990 * dce8_dram_bandwidth - get the dram bandwidth
8991 *
8992 * @wm: watermark calculation data
8993 *
8994 * Calculate the raw dram bandwidth (CIK).
8995 * Used for display watermark bandwidth calculations
8996 * Returns the dram bandwidth in MBytes/s
8997 */
8998static u32 dce8_dram_bandwidth(struct dce8_wm_params *wm)
8999{
9000 /* Calculate raw DRAM Bandwidth */
9001 fixed20_12 dram_efficiency; /* 0.7 */
9002 fixed20_12 yclk, dram_channels, bandwidth;
9003 fixed20_12 a;
9004
9005 a.full = dfixed_const(1000);
9006 yclk.full = dfixed_const(wm->yclk);
9007 yclk.full = dfixed_div(yclk, a);
9008 dram_channels.full = dfixed_const(wm->dram_channels * 4);
9009 a.full = dfixed_const(10);
9010 dram_efficiency.full = dfixed_const(7);
9011 dram_efficiency.full = dfixed_div(dram_efficiency, a);
9012 bandwidth.full = dfixed_mul(dram_channels, yclk);
9013 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
9014
9015 return dfixed_trunc(bandwidth);
9016}
9017
9018/**
9019 * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
9020 *
9021 * @wm: watermark calculation data
9022 *
9023 * Calculate the dram bandwidth used for display (CIK).
9024 * Used for display watermark bandwidth calculations
9025 * Returns the dram bandwidth for display in MBytes/s
9026 */
9027static u32 dce8_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9028{
9029 /* Calculate DRAM Bandwidth and the part allocated to display. */
9030 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
9031 fixed20_12 yclk, dram_channels, bandwidth;
9032 fixed20_12 a;
9033
9034 a.full = dfixed_const(1000);
9035 yclk.full = dfixed_const(wm->yclk);
9036 yclk.full = dfixed_div(yclk, a);
9037 dram_channels.full = dfixed_const(wm->dram_channels * 4);
9038 a.full = dfixed_const(10);
9039 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
9040 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
9041 bandwidth.full = dfixed_mul(dram_channels, yclk);
9042 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
9043
9044 return dfixed_trunc(bandwidth);
9045}
9046
9047/**
9048 * dce8_data_return_bandwidth - get the data return bandwidth
9049 *
9050 * @wm: watermark calculation data
9051 *
9052 * Calculate the data return bandwidth used for display (CIK).
9053 * Used for display watermark bandwidth calculations
9054 * Returns the data return bandwidth in MBytes/s
9055 */
9056static u32 dce8_data_return_bandwidth(struct dce8_wm_params *wm)
9057{
9058 /* Calculate the display Data return Bandwidth */
9059 fixed20_12 return_efficiency; /* 0.8 */
9060 fixed20_12 sclk, bandwidth;
9061 fixed20_12 a;
9062
9063 a.full = dfixed_const(1000);
9064 sclk.full = dfixed_const(wm->sclk);
9065 sclk.full = dfixed_div(sclk, a);
9066 a.full = dfixed_const(10);
9067 return_efficiency.full = dfixed_const(8);
9068 return_efficiency.full = dfixed_div(return_efficiency, a);
9069 a.full = dfixed_const(32);
9070 bandwidth.full = dfixed_mul(a, sclk);
9071 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
9072
9073 return dfixed_trunc(bandwidth);
9074}
9075
9076/**
9077 * dce8_dmif_request_bandwidth - get the dmif bandwidth
9078 *
9079 * @wm: watermark calculation data
9080 *
9081 * Calculate the dmif bandwidth used for display (CIK).
9082 * Used for display watermark bandwidth calculations
9083 * Returns the dmif bandwidth in MBytes/s
9084 */
9085static u32 dce8_dmif_request_bandwidth(struct dce8_wm_params *wm)
9086{
9087 /* Calculate the DMIF Request Bandwidth */
9088 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
9089 fixed20_12 disp_clk, bandwidth;
9090 fixed20_12 a, b;
9091
9092 a.full = dfixed_const(1000);
9093 disp_clk.full = dfixed_const(wm->disp_clk);
9094 disp_clk.full = dfixed_div(disp_clk, a);
9095 a.full = dfixed_const(32);
9096 b.full = dfixed_mul(a, disp_clk);
9097
9098 a.full = dfixed_const(10);
9099 disp_clk_request_efficiency.full = dfixed_const(8);
9100 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
9101
9102 bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
9103
9104 return dfixed_trunc(bandwidth);
9105}
9106
9107/**
9108 * dce8_available_bandwidth - get the min available bandwidth
9109 *
9110 * @wm: watermark calculation data
9111 *
9112 * Calculate the min available bandwidth used for display (CIK).
9113 * Used for display watermark bandwidth calculations
9114 * Returns the min available bandwidth in MBytes/s
9115 */
9116static u32 dce8_available_bandwidth(struct dce8_wm_params *wm)
9117{
9118 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
9119 u32 dram_bandwidth = dce8_dram_bandwidth(wm);
9120 u32 data_return_bandwidth = dce8_data_return_bandwidth(wm);
9121 u32 dmif_req_bandwidth = dce8_dmif_request_bandwidth(wm);
9122
9123 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
9124}
9125
9126/**
9127 * dce8_average_bandwidth - get the average available bandwidth
9128 *
9129 * @wm: watermark calculation data
9130 *
9131 * Calculate the average available bandwidth used for display (CIK).
9132 * Used for display watermark bandwidth calculations
9133 * Returns the average available bandwidth in MBytes/s
9134 */
9135static u32 dce8_average_bandwidth(struct dce8_wm_params *wm)
9136{
9137 /* Calculate the display mode Average Bandwidth
9138 * DisplayMode should contain the source and destination dimensions,
9139 * timing, etc.
9140 */
9141 fixed20_12 bpp;
9142 fixed20_12 line_time;
9143 fixed20_12 src_width;
9144 fixed20_12 bandwidth;
9145 fixed20_12 a;
9146
9147 a.full = dfixed_const(1000);
9148 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
9149 line_time.full = dfixed_div(line_time, a);
9150 bpp.full = dfixed_const(wm->bytes_per_pixel);
9151 src_width.full = dfixed_const(wm->src_width);
9152 bandwidth.full = dfixed_mul(src_width, bpp);
9153 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
9154 bandwidth.full = dfixed_div(bandwidth, line_time);
9155
9156 return dfixed_trunc(bandwidth);
9157}
9158
9159/**
9160 * dce8_latency_watermark - get the latency watermark
9161 *
9162 * @wm: watermark calculation data
9163 *
9164 * Calculate the latency watermark (CIK).
9165 * Used for display watermark bandwidth calculations
9166 * Returns the latency watermark in ns
9167 */
9168static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
9169{
9170 /* First calculate the latency in ns */
9171 u32 mc_latency = 2000; /* 2000 ns. */
9172 u32 available_bandwidth = dce8_available_bandwidth(wm);
9173 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
9174 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
9175 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
9176 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
9177 (wm->num_heads * cursor_line_pair_return_time);
9178 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
9179 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
9180 u32 tmp, dmif_size = 12288;
9181 fixed20_12 a, b, c;
9182
9183 if (wm->num_heads == 0)
9184 return 0;
9185
9186 a.full = dfixed_const(2);
9187 b.full = dfixed_const(1);
9188 if ((wm->vsc.full > a.full) ||
9189 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
9190 (wm->vtaps >= 5) ||
9191 ((wm->vsc.full >= a.full) && wm->interlaced))
9192 max_src_lines_per_dst_line = 4;
9193 else
9194 max_src_lines_per_dst_line = 2;
9195
9196 a.full = dfixed_const(available_bandwidth);
9197 b.full = dfixed_const(wm->num_heads);
9198 a.full = dfixed_div(a, b);
9199
9200 b.full = dfixed_const(mc_latency + 512);
9201 c.full = dfixed_const(wm->disp_clk);
9202 b.full = dfixed_div(b, c);
9203
9204 c.full = dfixed_const(dmif_size);
9205 b.full = dfixed_div(c, b);
9206
9207 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
9208
9209 b.full = dfixed_const(1000);
9210 c.full = dfixed_const(wm->disp_clk);
9211 b.full = dfixed_div(c, b);
9212 c.full = dfixed_const(wm->bytes_per_pixel);
9213 b.full = dfixed_mul(b, c);
9214
9215 lb_fill_bw = min(tmp, dfixed_trunc(b));
9216
9217 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
9218 b.full = dfixed_const(1000);
9219 c.full = dfixed_const(lb_fill_bw);
9220 b.full = dfixed_div(c, b);
9221 a.full = dfixed_div(a, b);
9222 line_fill_time = dfixed_trunc(a);
9223
9224 if (line_fill_time < wm->active_time)
9225 return latency;
9226 else
9227 return latency + (line_fill_time - wm->active_time);
9228
9229}
9230
9231/**
9232 * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
9233 * average and available dram bandwidth
9234 *
9235 * @wm: watermark calculation data
9236 *
9237 * Check if the display average bandwidth fits in the display
9238 * dram bandwidth (CIK).
9239 * Used for display watermark bandwidth calculations
9240 * Returns true if the display fits, false if not.
9241 */
9242static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9243{
9244 if (dce8_average_bandwidth(wm) <=
9245 (dce8_dram_bandwidth_for_display(wm) / wm->num_heads))
9246 return true;
9247 else
9248 return false;
9249}
9250
9251/**
9252 * dce8_average_bandwidth_vs_available_bandwidth - check
9253 * average and available bandwidth
9254 *
9255 * @wm: watermark calculation data
9256 *
9257 * Check if the display average bandwidth fits in the display
9258 * available bandwidth (CIK).
9259 * Used for display watermark bandwidth calculations
9260 * Returns true if the display fits, false if not.
9261 */
9262static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params *wm)
9263{
9264 if (dce8_average_bandwidth(wm) <=
9265 (dce8_available_bandwidth(wm) / wm->num_heads))
9266 return true;
9267 else
9268 return false;
9269}
9270
9271/**
9272 * dce8_check_latency_hiding - check latency hiding
9273 *
9274 * @wm: watermark calculation data
9275 *
9276 * Check latency hiding (CIK).
9277 * Used for display watermark bandwidth calculations
9278 * Returns true if the display fits, false if not.
9279 */
9280static bool dce8_check_latency_hiding(struct dce8_wm_params *wm)
9281{
9282 u32 lb_partitions = wm->lb_size / wm->src_width;
9283 u32 line_time = wm->active_time + wm->blank_time;
9284 u32 latency_tolerant_lines;
9285 u32 latency_hiding;
9286 fixed20_12 a;
9287
9288 a.full = dfixed_const(1);
9289 if (wm->vsc.full > a.full)
9290 latency_tolerant_lines = 1;
9291 else {
9292 if (lb_partitions <= (wm->vtaps + 1))
9293 latency_tolerant_lines = 1;
9294 else
9295 latency_tolerant_lines = 2;
9296 }
9297
9298 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
9299
9300 if (dce8_latency_watermark(wm) <= latency_hiding)
9301 return true;
9302 else
9303 return false;
9304}
9305
9306/**
9307 * dce8_program_watermarks - program display watermarks
9308 *
9309 * @rdev: radeon_device pointer
9310 * @radeon_crtc: the selected display controller
9311 * @lb_size: line buffer size
9312 * @num_heads: number of display controllers in use
9313 *
9314 * Calculate and program the display watermarks for the
9315 * selected display controller (CIK).
9316 */
9317static void dce8_program_watermarks(struct radeon_device *rdev,
9318 struct radeon_crtc *radeon_crtc,
9319 u32 lb_size, u32 num_heads)
9320{
9321 struct drm_display_mode *mode = &radeon_crtc->base.mode;
Alex Deucher58ea2de2013-01-24 10:03:39 -05009322 struct dce8_wm_params wm_low, wm_high;
Alex Deuchercd84a272012-07-20 17:13:13 -04009323 u32 pixel_period;
9324 u32 line_time = 0;
9325 u32 latency_watermark_a = 0, latency_watermark_b = 0;
9326 u32 tmp, wm_mask;
9327
9328 if (radeon_crtc->base.enabled && num_heads && mode) {
9329 pixel_period = 1000000 / (u32)mode->clock;
9330 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
9331
Alex Deucher58ea2de2013-01-24 10:03:39 -05009332 /* watermark for high clocks */
9333 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9334 rdev->pm.dpm_enabled) {
9335 wm_high.yclk =
9336 radeon_dpm_get_mclk(rdev, false) * 10;
9337 wm_high.sclk =
9338 radeon_dpm_get_sclk(rdev, false) * 10;
9339 } else {
9340 wm_high.yclk = rdev->pm.current_mclk * 10;
9341 wm_high.sclk = rdev->pm.current_sclk * 10;
9342 }
9343
9344 wm_high.disp_clk = mode->clock;
9345 wm_high.src_width = mode->crtc_hdisplay;
9346 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
9347 wm_high.blank_time = line_time - wm_high.active_time;
9348 wm_high.interlaced = false;
Alex Deuchercd84a272012-07-20 17:13:13 -04009349 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009350 wm_high.interlaced = true;
9351 wm_high.vsc = radeon_crtc->vsc;
9352 wm_high.vtaps = 1;
Alex Deuchercd84a272012-07-20 17:13:13 -04009353 if (radeon_crtc->rmx_type != RMX_OFF)
Alex Deucher58ea2de2013-01-24 10:03:39 -05009354 wm_high.vtaps = 2;
9355 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
9356 wm_high.lb_size = lb_size;
9357 wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
9358 wm_high.num_heads = num_heads;
Alex Deuchercd84a272012-07-20 17:13:13 -04009359
9360 /* set for high clocks */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009361 latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
Alex Deuchercd84a272012-07-20 17:13:13 -04009362
9363 /* possibly force display priority to high */
9364 /* should really do this at mode validation time... */
Alex Deucher58ea2de2013-01-24 10:03:39 -05009365 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
9366 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
9367 !dce8_check_latency_hiding(&wm_high) ||
9368 (rdev->disp_priority == 2)) {
9369 DRM_DEBUG_KMS("force priority to high\n");
9370 }
9371
9372 /* watermark for low clocks */
9373 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9374 rdev->pm.dpm_enabled) {
9375 wm_low.yclk =
9376 radeon_dpm_get_mclk(rdev, true) * 10;
9377 wm_low.sclk =
9378 radeon_dpm_get_sclk(rdev, true) * 10;
9379 } else {
9380 wm_low.yclk = rdev->pm.current_mclk * 10;
9381 wm_low.sclk = rdev->pm.current_sclk * 10;
9382 }
9383
9384 wm_low.disp_clk = mode->clock;
9385 wm_low.src_width = mode->crtc_hdisplay;
9386 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
9387 wm_low.blank_time = line_time - wm_low.active_time;
9388 wm_low.interlaced = false;
9389 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
9390 wm_low.interlaced = true;
9391 wm_low.vsc = radeon_crtc->vsc;
9392 wm_low.vtaps = 1;
9393 if (radeon_crtc->rmx_type != RMX_OFF)
9394 wm_low.vtaps = 2;
9395 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
9396 wm_low.lb_size = lb_size;
9397 wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
9398 wm_low.num_heads = num_heads;
9399
9400 /* set for low clocks */
9401 latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
9402
9403 /* possibly force display priority to high */
9404 /* should really do this at mode validation time... */
9405 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
9406 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
9407 !dce8_check_latency_hiding(&wm_low) ||
Alex Deuchercd84a272012-07-20 17:13:13 -04009408 (rdev->disp_priority == 2)) {
9409 DRM_DEBUG_KMS("force priority to high\n");
9410 }
9411 }
9412
9413 /* select wm A */
9414 wm_mask = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9415 tmp = wm_mask;
9416 tmp &= ~LATENCY_WATERMARK_MASK(3);
9417 tmp |= LATENCY_WATERMARK_MASK(1);
9418 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9419 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9420 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
9421 LATENCY_HIGH_WATERMARK(line_time)));
9422 /* select wm B */
9423 tmp = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9424 tmp &= ~LATENCY_WATERMARK_MASK(3);
9425 tmp |= LATENCY_WATERMARK_MASK(2);
9426 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9427 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9428 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
9429 LATENCY_HIGH_WATERMARK(line_time)));
9430 /* restore original selection */
9431 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
Alex Deucher58ea2de2013-01-24 10:03:39 -05009432
9433 /* save values for DPM */
9434 radeon_crtc->line_time = line_time;
9435 radeon_crtc->wm_high = latency_watermark_a;
9436 radeon_crtc->wm_low = latency_watermark_b;
Alex Deuchercd84a272012-07-20 17:13:13 -04009437}
9438
9439/**
9440 * dce8_bandwidth_update - program display watermarks
9441 *
9442 * @rdev: radeon_device pointer
9443 *
9444 * Calculate and program the display watermarks and line
9445 * buffer allocation (CIK).
9446 */
9447void dce8_bandwidth_update(struct radeon_device *rdev)
9448{
9449 struct drm_display_mode *mode = NULL;
9450 u32 num_heads = 0, lb_size;
9451 int i;
9452
9453 radeon_update_display_priority(rdev);
9454
9455 for (i = 0; i < rdev->num_crtc; i++) {
9456 if (rdev->mode_info.crtcs[i]->base.enabled)
9457 num_heads++;
9458 }
9459 for (i = 0; i < rdev->num_crtc; i++) {
9460 mode = &rdev->mode_info.crtcs[i]->base.mode;
9461 lb_size = dce8_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode);
9462 dce8_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
9463 }
9464}
Alex Deucher44fa3462012-12-18 22:17:00 -05009465
9466/**
9467 * cik_get_gpu_clock_counter - return GPU clock counter snapshot
9468 *
9469 * @rdev: radeon_device pointer
9470 *
9471 * Fetches a GPU clock counter snapshot (SI).
9472 * Returns the 64 bit clock counter snapshot.
9473 */
9474uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
9475{
9476 uint64_t clock;
9477
9478 mutex_lock(&rdev->gpu_clock_mutex);
9479 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
9480 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
9481 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
9482 mutex_unlock(&rdev->gpu_clock_mutex);
9483 return clock;
9484}
9485
Christian König87167bb2013-04-09 13:39:21 -04009486static int cik_set_uvd_clock(struct radeon_device *rdev, u32 clock,
9487 u32 cntl_reg, u32 status_reg)
9488{
9489 int r, i;
9490 struct atom_clock_dividers dividers;
9491 uint32_t tmp;
9492
9493 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9494 clock, false, &dividers);
9495 if (r)
9496 return r;
9497
9498 tmp = RREG32_SMC(cntl_reg);
9499 tmp &= ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK);
9500 tmp |= dividers.post_divider;
9501 WREG32_SMC(cntl_reg, tmp);
9502
9503 for (i = 0; i < 100; i++) {
9504 if (RREG32_SMC(status_reg) & DCLK_STATUS)
9505 break;
9506 mdelay(10);
9507 }
9508 if (i == 100)
9509 return -ETIMEDOUT;
9510
9511 return 0;
9512}
9513
9514int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
9515{
9516 int r = 0;
9517
9518 r = cik_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
9519 if (r)
9520 return r;
9521
9522 r = cik_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
9523 return r;
9524}
9525
Alex Deucher5ad6bf92013-08-22 17:09:06 -04009526int cik_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
9527{
9528 int r, i;
9529 struct atom_clock_dividers dividers;
9530 u32 tmp;
9531
9532 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9533 ecclk, false, &dividers);
9534 if (r)
9535 return r;
9536
9537 for (i = 0; i < 100; i++) {
9538 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9539 break;
9540 mdelay(10);
9541 }
9542 if (i == 100)
9543 return -ETIMEDOUT;
9544
9545 tmp = RREG32_SMC(CG_ECLK_CNTL);
9546 tmp &= ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK);
9547 tmp |= dividers.post_divider;
9548 WREG32_SMC(CG_ECLK_CNTL, tmp);
9549
9550 for (i = 0; i < 100; i++) {
9551 if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9552 break;
9553 mdelay(10);
9554 }
9555 if (i == 100)
9556 return -ETIMEDOUT;
9557
9558 return 0;
9559}
9560
Alex Deucher8a7cd272013-08-06 11:29:39 -04009561static void cik_pcie_gen3_enable(struct radeon_device *rdev)
Christian König87167bb2013-04-09 13:39:21 -04009562{
Alex Deucher8a7cd272013-08-06 11:29:39 -04009563 struct pci_dev *root = rdev->pdev->bus->self;
9564 int bridge_pos, gpu_pos;
9565 u32 speed_cntl, mask, current_data_rate;
9566 int ret, i;
9567 u16 tmp16;
Christian König87167bb2013-04-09 13:39:21 -04009568
Alex Williamson0bd252d2014-08-27 13:01:35 -06009569 if (pci_is_root_bus(rdev->pdev->bus))
9570 return;
9571
Alex Deucher8a7cd272013-08-06 11:29:39 -04009572 if (radeon_pcie_gen2 == 0)
9573 return;
Christian König87167bb2013-04-09 13:39:21 -04009574
Alex Deucher8a7cd272013-08-06 11:29:39 -04009575 if (rdev->flags & RADEON_IS_IGP)
9576 return;
Christian König87167bb2013-04-09 13:39:21 -04009577
Alex Deucher8a7cd272013-08-06 11:29:39 -04009578 if (!(rdev->flags & RADEON_IS_PCIE))
9579 return;
Christian König87167bb2013-04-09 13:39:21 -04009580
Alex Deucher8a7cd272013-08-06 11:29:39 -04009581 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
9582 if (ret != 0)
9583 return;
Christian König87167bb2013-04-09 13:39:21 -04009584
Alex Deucher8a7cd272013-08-06 11:29:39 -04009585 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
9586 return;
Christian König87167bb2013-04-09 13:39:21 -04009587
Alex Deucher8a7cd272013-08-06 11:29:39 -04009588 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9589 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
9590 LC_CURRENT_DATA_RATE_SHIFT;
9591 if (mask & DRM_PCIE_SPEED_80) {
9592 if (current_data_rate == 2) {
9593 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
9594 return;
9595 }
9596 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
9597 } else if (mask & DRM_PCIE_SPEED_50) {
9598 if (current_data_rate == 1) {
9599 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
9600 return;
9601 }
9602 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
9603 }
Christian König87167bb2013-04-09 13:39:21 -04009604
Alex Deucher8a7cd272013-08-06 11:29:39 -04009605 bridge_pos = pci_pcie_cap(root);
9606 if (!bridge_pos)
9607 return;
9608
9609 gpu_pos = pci_pcie_cap(rdev->pdev);
9610 if (!gpu_pos)
9611 return;
9612
9613 if (mask & DRM_PCIE_SPEED_80) {
9614 /* re-try equalization if gen3 is not already enabled */
9615 if (current_data_rate != 2) {
9616 u16 bridge_cfg, gpu_cfg;
9617 u16 bridge_cfg2, gpu_cfg2;
9618 u32 max_lw, current_lw, tmp;
9619
9620 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9621 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9622
9623 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
9624 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9625
9626 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
9627 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9628
9629 tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9630 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
9631 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
9632
9633 if (current_lw < max_lw) {
9634 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9635 if (tmp & LC_RENEGOTIATION_SUPPORT) {
9636 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
9637 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
9638 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
9639 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
9640 }
9641 }
9642
9643 for (i = 0; i < 10; i++) {
9644 /* check status */
9645 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
9646 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
9647 break;
9648
9649 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9650 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9651
9652 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
9653 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
9654
9655 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9656 tmp |= LC_SET_QUIESCE;
9657 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9658
9659 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9660 tmp |= LC_REDO_EQ;
9661 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9662
9663 mdelay(100);
9664
9665 /* linkctl */
9666 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
9667 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9668 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
9669 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9670
9671 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
9672 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9673 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
9674 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9675
9676 /* linkctl2 */
9677 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
9678 tmp16 &= ~((1 << 4) | (7 << 9));
9679 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
9680 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
9681
9682 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9683 tmp16 &= ~((1 << 4) | (7 << 9));
9684 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
9685 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9686
9687 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9688 tmp &= ~LC_SET_QUIESCE;
9689 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9690 }
9691 }
9692 }
9693
9694 /* set the link speed */
9695 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
9696 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
9697 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9698
9699 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9700 tmp16 &= ~0xf;
9701 if (mask & DRM_PCIE_SPEED_80)
9702 tmp16 |= 3; /* gen3 */
9703 else if (mask & DRM_PCIE_SPEED_50)
9704 tmp16 |= 2; /* gen2 */
9705 else
9706 tmp16 |= 1; /* gen1 */
9707 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9708
9709 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9710 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
9711 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9712
9713 for (i = 0; i < rdev->usec_timeout; i++) {
9714 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9715 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
9716 break;
9717 udelay(1);
9718 }
9719}
Alex Deucher7235711a42013-04-04 13:58:09 -04009720
9721static void cik_program_aspm(struct radeon_device *rdev)
9722{
9723 u32 data, orig;
9724 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
9725 bool disable_clkreq = false;
9726
9727 if (radeon_aspm == 0)
9728 return;
9729
9730 /* XXX double check IGPs */
9731 if (rdev->flags & RADEON_IS_IGP)
9732 return;
9733
9734 if (!(rdev->flags & RADEON_IS_PCIE))
9735 return;
9736
9737 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9738 data &= ~LC_XMIT_N_FTS_MASK;
9739 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
9740 if (orig != data)
9741 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
9742
9743 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
9744 data |= LC_GO_TO_RECOVERY;
9745 if (orig != data)
9746 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
9747
9748 orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
9749 data |= P_IGNORE_EDB_ERR;
9750 if (orig != data)
9751 WREG32_PCIE_PORT(PCIE_P_CNTL, data);
9752
9753 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9754 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
9755 data |= LC_PMI_TO_L1_DIS;
9756 if (!disable_l0s)
9757 data |= LC_L0S_INACTIVITY(7);
9758
9759 if (!disable_l1) {
9760 data |= LC_L1_INACTIVITY(7);
9761 data &= ~LC_PMI_TO_L1_DIS;
9762 if (orig != data)
9763 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9764
9765 if (!disable_plloff_in_l1) {
9766 bool clk_req_support;
9767
9768 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
9769 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9770 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9771 if (orig != data)
9772 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
9773
9774 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
9775 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9776 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9777 if (orig != data)
9778 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
9779
9780 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
9781 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9782 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9783 if (orig != data)
9784 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
9785
9786 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
9787 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9788 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9789 if (orig != data)
9790 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
9791
9792 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9793 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
9794 data |= LC_DYN_LANES_PWR_STATE(3);
9795 if (orig != data)
9796 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
9797
Alex Williamson0bd252d2014-08-27 13:01:35 -06009798 if (!disable_clkreq &&
9799 !pci_is_root_bus(rdev->pdev->bus)) {
Alex Deucher7235711a42013-04-04 13:58:09 -04009800 struct pci_dev *root = rdev->pdev->bus->self;
9801 u32 lnkcap;
9802
9803 clk_req_support = false;
9804 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
9805 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
9806 clk_req_support = true;
9807 } else {
9808 clk_req_support = false;
9809 }
9810
9811 if (clk_req_support) {
9812 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
9813 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
9814 if (orig != data)
9815 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
9816
9817 orig = data = RREG32_SMC(THM_CLK_CNTL);
9818 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
9819 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
9820 if (orig != data)
9821 WREG32_SMC(THM_CLK_CNTL, data);
9822
9823 orig = data = RREG32_SMC(MISC_CLK_CTRL);
9824 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
9825 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
9826 if (orig != data)
9827 WREG32_SMC(MISC_CLK_CTRL, data);
9828
9829 orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
9830 data &= ~BCLK_AS_XCLK;
9831 if (orig != data)
9832 WREG32_SMC(CG_CLKPIN_CNTL, data);
9833
9834 orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
9835 data &= ~FORCE_BIF_REFCLK_EN;
9836 if (orig != data)
9837 WREG32_SMC(CG_CLKPIN_CNTL_2, data);
9838
9839 orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
9840 data &= ~MPLL_CLKOUT_SEL_MASK;
9841 data |= MPLL_CLKOUT_SEL(4);
9842 if (orig != data)
9843 WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
9844 }
9845 }
9846 } else {
9847 if (orig != data)
9848 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9849 }
9850
9851 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
9852 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
9853 if (orig != data)
9854 WREG32_PCIE_PORT(PCIE_CNTL2, data);
9855
9856 if (!disable_l0s) {
9857 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9858 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
9859 data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9860 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
9861 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9862 data &= ~LC_L0S_INACTIVITY_MASK;
9863 if (orig != data)
9864 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9865 }
9866 }
9867 }
Christian König87167bb2013-04-09 13:39:21 -04009868}