blob: a2a30061172fed6f6da4b17907896807269ef643 [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");
41MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040042MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -040043MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
Alex Deucher02c81322012-12-18 21:43:07 -050044MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
45MODULE_FIRMWARE("radeon/KAVERI_me.bin");
46MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
47MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
48MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040049MODULE_FIRMWARE("radeon/KAVERI_sdma.bin");
Alex Deucher02c81322012-12-18 21:43:07 -050050MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
51MODULE_FIRMWARE("radeon/KABINI_me.bin");
52MODULE_FIRMWARE("radeon/KABINI_ce.bin");
53MODULE_FIRMWARE("radeon/KABINI_mec.bin");
54MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
Alex Deucher21a93e12013-04-09 12:47:11 -040055MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
Alex Deucher02c81322012-12-18 21:43:07 -050056
Alex Deuchera59781b2012-11-09 10:45:57 -050057extern int r600_ih_ring_alloc(struct radeon_device *rdev);
58extern void r600_ih_ring_fini(struct radeon_device *rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -040059extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
60extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
Alex Deuchercc066712013-04-09 12:59:51 -040061extern bool evergreen_is_display_hung(struct radeon_device *rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -040062extern void sumo_rlc_fini(struct radeon_device *rdev);
63extern int sumo_rlc_init(struct radeon_device *rdev);
Alex Deucher1c491652013-04-09 12:45:26 -040064extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
Alex Deucher866d83d2013-04-15 17:13:29 -040065extern void si_rlc_reset(struct radeon_device *rdev);
Alex Deucher22c775c2013-07-23 09:41:05 -040066extern void si_init_uvd_internal_cg(struct radeon_device *rdev);
Christian König2483b4e2013-08-13 11:56:54 +020067extern int cik_sdma_resume(struct radeon_device *rdev);
68extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
69extern void cik_sdma_fini(struct radeon_device *rdev);
Alex Deuchercc066712013-04-09 12:59:51 -040070static void cik_rlc_stop(struct radeon_device *rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -040071static void cik_pcie_gen3_enable(struct radeon_device *rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -040072static void cik_program_aspm(struct radeon_device *rdev);
Alex Deucher22c775c2013-07-23 09:41:05 -040073static void cik_init_pg(struct radeon_device *rdev);
74static void cik_init_cg(struct radeon_device *rdev);
Alex Deucherfb2c7f42013-10-02 14:54:44 -040075static void cik_fini_pg(struct radeon_device *rdev);
76static void cik_fini_cg(struct radeon_device *rdev);
Alex Deucher4214faf2013-09-03 10:17:13 -040077static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
78 bool enable);
Alex Deucher6f2043c2013-04-09 12:43:41 -040079
Alex Deucher286d9cc2013-06-21 15:50:47 -040080/* get temperature in millidegrees */
81int ci_get_temp(struct radeon_device *rdev)
82{
83 u32 temp;
84 int actual_temp = 0;
85
86 temp = (RREG32_SMC(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
87 CTF_TEMP_SHIFT;
88
89 if (temp & 0x200)
90 actual_temp = 255;
91 else
92 actual_temp = temp & 0x1ff;
93
94 actual_temp = actual_temp * 1000;
95
96 return actual_temp;
97}
98
99/* get temperature in millidegrees */
100int kv_get_temp(struct radeon_device *rdev)
101{
102 u32 temp;
103 int actual_temp = 0;
104
105 temp = RREG32_SMC(0xC0300E0C);
106
107 if (temp)
108 actual_temp = (temp / 8) - 49;
109 else
110 actual_temp = 0;
111
112 actual_temp = actual_temp * 1000;
113
114 return actual_temp;
115}
Alex Deucher8cc1a532013-04-09 12:41:24 -0400116
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400117/*
118 * Indirect registers accessor
119 */
120u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
121{
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400122 unsigned long flags;
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400123 u32 r;
124
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400125 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400126 WREG32(PCIE_INDEX, reg);
127 (void)RREG32(PCIE_INDEX);
128 r = RREG32(PCIE_DATA);
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400129 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400130 return r;
131}
132
133void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
134{
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400135 unsigned long flags;
136
137 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400138 WREG32(PCIE_INDEX, reg);
139 (void)RREG32(PCIE_INDEX);
140 WREG32(PCIE_DATA, v);
141 (void)RREG32(PCIE_DATA);
Alex Deucher0a5b7b02013-09-03 19:00:09 -0400142 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
Alex Deucher6e2c3c02013-04-03 19:28:32 -0400143}
144
Alex Deucher22c775c2013-07-23 09:41:05 -0400145static const u32 spectre_rlc_save_restore_register_list[] =
146{
147 (0x0e00 << 16) | (0xc12c >> 2),
148 0x00000000,
149 (0x0e00 << 16) | (0xc140 >> 2),
150 0x00000000,
151 (0x0e00 << 16) | (0xc150 >> 2),
152 0x00000000,
153 (0x0e00 << 16) | (0xc15c >> 2),
154 0x00000000,
155 (0x0e00 << 16) | (0xc168 >> 2),
156 0x00000000,
157 (0x0e00 << 16) | (0xc170 >> 2),
158 0x00000000,
159 (0x0e00 << 16) | (0xc178 >> 2),
160 0x00000000,
161 (0x0e00 << 16) | (0xc204 >> 2),
162 0x00000000,
163 (0x0e00 << 16) | (0xc2b4 >> 2),
164 0x00000000,
165 (0x0e00 << 16) | (0xc2b8 >> 2),
166 0x00000000,
167 (0x0e00 << 16) | (0xc2bc >> 2),
168 0x00000000,
169 (0x0e00 << 16) | (0xc2c0 >> 2),
170 0x00000000,
171 (0x0e00 << 16) | (0x8228 >> 2),
172 0x00000000,
173 (0x0e00 << 16) | (0x829c >> 2),
174 0x00000000,
175 (0x0e00 << 16) | (0x869c >> 2),
176 0x00000000,
177 (0x0600 << 16) | (0x98f4 >> 2),
178 0x00000000,
179 (0x0e00 << 16) | (0x98f8 >> 2),
180 0x00000000,
181 (0x0e00 << 16) | (0x9900 >> 2),
182 0x00000000,
183 (0x0e00 << 16) | (0xc260 >> 2),
184 0x00000000,
185 (0x0e00 << 16) | (0x90e8 >> 2),
186 0x00000000,
187 (0x0e00 << 16) | (0x3c000 >> 2),
188 0x00000000,
189 (0x0e00 << 16) | (0x3c00c >> 2),
190 0x00000000,
191 (0x0e00 << 16) | (0x8c1c >> 2),
192 0x00000000,
193 (0x0e00 << 16) | (0x9700 >> 2),
194 0x00000000,
195 (0x0e00 << 16) | (0xcd20 >> 2),
196 0x00000000,
197 (0x4e00 << 16) | (0xcd20 >> 2),
198 0x00000000,
199 (0x5e00 << 16) | (0xcd20 >> 2),
200 0x00000000,
201 (0x6e00 << 16) | (0xcd20 >> 2),
202 0x00000000,
203 (0x7e00 << 16) | (0xcd20 >> 2),
204 0x00000000,
205 (0x8e00 << 16) | (0xcd20 >> 2),
206 0x00000000,
207 (0x9e00 << 16) | (0xcd20 >> 2),
208 0x00000000,
209 (0xae00 << 16) | (0xcd20 >> 2),
210 0x00000000,
211 (0xbe00 << 16) | (0xcd20 >> 2),
212 0x00000000,
213 (0x0e00 << 16) | (0x89bc >> 2),
214 0x00000000,
215 (0x0e00 << 16) | (0x8900 >> 2),
216 0x00000000,
217 0x3,
218 (0x0e00 << 16) | (0xc130 >> 2),
219 0x00000000,
220 (0x0e00 << 16) | (0xc134 >> 2),
221 0x00000000,
222 (0x0e00 << 16) | (0xc1fc >> 2),
223 0x00000000,
224 (0x0e00 << 16) | (0xc208 >> 2),
225 0x00000000,
226 (0x0e00 << 16) | (0xc264 >> 2),
227 0x00000000,
228 (0x0e00 << 16) | (0xc268 >> 2),
229 0x00000000,
230 (0x0e00 << 16) | (0xc26c >> 2),
231 0x00000000,
232 (0x0e00 << 16) | (0xc270 >> 2),
233 0x00000000,
234 (0x0e00 << 16) | (0xc274 >> 2),
235 0x00000000,
236 (0x0e00 << 16) | (0xc278 >> 2),
237 0x00000000,
238 (0x0e00 << 16) | (0xc27c >> 2),
239 0x00000000,
240 (0x0e00 << 16) | (0xc280 >> 2),
241 0x00000000,
242 (0x0e00 << 16) | (0xc284 >> 2),
243 0x00000000,
244 (0x0e00 << 16) | (0xc288 >> 2),
245 0x00000000,
246 (0x0e00 << 16) | (0xc28c >> 2),
247 0x00000000,
248 (0x0e00 << 16) | (0xc290 >> 2),
249 0x00000000,
250 (0x0e00 << 16) | (0xc294 >> 2),
251 0x00000000,
252 (0x0e00 << 16) | (0xc298 >> 2),
253 0x00000000,
254 (0x0e00 << 16) | (0xc29c >> 2),
255 0x00000000,
256 (0x0e00 << 16) | (0xc2a0 >> 2),
257 0x00000000,
258 (0x0e00 << 16) | (0xc2a4 >> 2),
259 0x00000000,
260 (0x0e00 << 16) | (0xc2a8 >> 2),
261 0x00000000,
262 (0x0e00 << 16) | (0xc2ac >> 2),
263 0x00000000,
264 (0x0e00 << 16) | (0xc2b0 >> 2),
265 0x00000000,
266 (0x0e00 << 16) | (0x301d0 >> 2),
267 0x00000000,
268 (0x0e00 << 16) | (0x30238 >> 2),
269 0x00000000,
270 (0x0e00 << 16) | (0x30250 >> 2),
271 0x00000000,
272 (0x0e00 << 16) | (0x30254 >> 2),
273 0x00000000,
274 (0x0e00 << 16) | (0x30258 >> 2),
275 0x00000000,
276 (0x0e00 << 16) | (0x3025c >> 2),
277 0x00000000,
278 (0x4e00 << 16) | (0xc900 >> 2),
279 0x00000000,
280 (0x5e00 << 16) | (0xc900 >> 2),
281 0x00000000,
282 (0x6e00 << 16) | (0xc900 >> 2),
283 0x00000000,
284 (0x7e00 << 16) | (0xc900 >> 2),
285 0x00000000,
286 (0x8e00 << 16) | (0xc900 >> 2),
287 0x00000000,
288 (0x9e00 << 16) | (0xc900 >> 2),
289 0x00000000,
290 (0xae00 << 16) | (0xc900 >> 2),
291 0x00000000,
292 (0xbe00 << 16) | (0xc900 >> 2),
293 0x00000000,
294 (0x4e00 << 16) | (0xc904 >> 2),
295 0x00000000,
296 (0x5e00 << 16) | (0xc904 >> 2),
297 0x00000000,
298 (0x6e00 << 16) | (0xc904 >> 2),
299 0x00000000,
300 (0x7e00 << 16) | (0xc904 >> 2),
301 0x00000000,
302 (0x8e00 << 16) | (0xc904 >> 2),
303 0x00000000,
304 (0x9e00 << 16) | (0xc904 >> 2),
305 0x00000000,
306 (0xae00 << 16) | (0xc904 >> 2),
307 0x00000000,
308 (0xbe00 << 16) | (0xc904 >> 2),
309 0x00000000,
310 (0x4e00 << 16) | (0xc908 >> 2),
311 0x00000000,
312 (0x5e00 << 16) | (0xc908 >> 2),
313 0x00000000,
314 (0x6e00 << 16) | (0xc908 >> 2),
315 0x00000000,
316 (0x7e00 << 16) | (0xc908 >> 2),
317 0x00000000,
318 (0x8e00 << 16) | (0xc908 >> 2),
319 0x00000000,
320 (0x9e00 << 16) | (0xc908 >> 2),
321 0x00000000,
322 (0xae00 << 16) | (0xc908 >> 2),
323 0x00000000,
324 (0xbe00 << 16) | (0xc908 >> 2),
325 0x00000000,
326 (0x4e00 << 16) | (0xc90c >> 2),
327 0x00000000,
328 (0x5e00 << 16) | (0xc90c >> 2),
329 0x00000000,
330 (0x6e00 << 16) | (0xc90c >> 2),
331 0x00000000,
332 (0x7e00 << 16) | (0xc90c >> 2),
333 0x00000000,
334 (0x8e00 << 16) | (0xc90c >> 2),
335 0x00000000,
336 (0x9e00 << 16) | (0xc90c >> 2),
337 0x00000000,
338 (0xae00 << 16) | (0xc90c >> 2),
339 0x00000000,
340 (0xbe00 << 16) | (0xc90c >> 2),
341 0x00000000,
342 (0x4e00 << 16) | (0xc910 >> 2),
343 0x00000000,
344 (0x5e00 << 16) | (0xc910 >> 2),
345 0x00000000,
346 (0x6e00 << 16) | (0xc910 >> 2),
347 0x00000000,
348 (0x7e00 << 16) | (0xc910 >> 2),
349 0x00000000,
350 (0x8e00 << 16) | (0xc910 >> 2),
351 0x00000000,
352 (0x9e00 << 16) | (0xc910 >> 2),
353 0x00000000,
354 (0xae00 << 16) | (0xc910 >> 2),
355 0x00000000,
356 (0xbe00 << 16) | (0xc910 >> 2),
357 0x00000000,
358 (0x0e00 << 16) | (0xc99c >> 2),
359 0x00000000,
360 (0x0e00 << 16) | (0x9834 >> 2),
361 0x00000000,
362 (0x0000 << 16) | (0x30f00 >> 2),
363 0x00000000,
364 (0x0001 << 16) | (0x30f00 >> 2),
365 0x00000000,
366 (0x0000 << 16) | (0x30f04 >> 2),
367 0x00000000,
368 (0x0001 << 16) | (0x30f04 >> 2),
369 0x00000000,
370 (0x0000 << 16) | (0x30f08 >> 2),
371 0x00000000,
372 (0x0001 << 16) | (0x30f08 >> 2),
373 0x00000000,
374 (0x0000 << 16) | (0x30f0c >> 2),
375 0x00000000,
376 (0x0001 << 16) | (0x30f0c >> 2),
377 0x00000000,
378 (0x0600 << 16) | (0x9b7c >> 2),
379 0x00000000,
380 (0x0e00 << 16) | (0x8a14 >> 2),
381 0x00000000,
382 (0x0e00 << 16) | (0x8a18 >> 2),
383 0x00000000,
384 (0x0600 << 16) | (0x30a00 >> 2),
385 0x00000000,
386 (0x0e00 << 16) | (0x8bf0 >> 2),
387 0x00000000,
388 (0x0e00 << 16) | (0x8bcc >> 2),
389 0x00000000,
390 (0x0e00 << 16) | (0x8b24 >> 2),
391 0x00000000,
392 (0x0e00 << 16) | (0x30a04 >> 2),
393 0x00000000,
394 (0x0600 << 16) | (0x30a10 >> 2),
395 0x00000000,
396 (0x0600 << 16) | (0x30a14 >> 2),
397 0x00000000,
398 (0x0600 << 16) | (0x30a18 >> 2),
399 0x00000000,
400 (0x0600 << 16) | (0x30a2c >> 2),
401 0x00000000,
402 (0x0e00 << 16) | (0xc700 >> 2),
403 0x00000000,
404 (0x0e00 << 16) | (0xc704 >> 2),
405 0x00000000,
406 (0x0e00 << 16) | (0xc708 >> 2),
407 0x00000000,
408 (0x0e00 << 16) | (0xc768 >> 2),
409 0x00000000,
410 (0x0400 << 16) | (0xc770 >> 2),
411 0x00000000,
412 (0x0400 << 16) | (0xc774 >> 2),
413 0x00000000,
414 (0x0400 << 16) | (0xc778 >> 2),
415 0x00000000,
416 (0x0400 << 16) | (0xc77c >> 2),
417 0x00000000,
418 (0x0400 << 16) | (0xc780 >> 2),
419 0x00000000,
420 (0x0400 << 16) | (0xc784 >> 2),
421 0x00000000,
422 (0x0400 << 16) | (0xc788 >> 2),
423 0x00000000,
424 (0x0400 << 16) | (0xc78c >> 2),
425 0x00000000,
426 (0x0400 << 16) | (0xc798 >> 2),
427 0x00000000,
428 (0x0400 << 16) | (0xc79c >> 2),
429 0x00000000,
430 (0x0400 << 16) | (0xc7a0 >> 2),
431 0x00000000,
432 (0x0400 << 16) | (0xc7a4 >> 2),
433 0x00000000,
434 (0x0400 << 16) | (0xc7a8 >> 2),
435 0x00000000,
436 (0x0400 << 16) | (0xc7ac >> 2),
437 0x00000000,
438 (0x0400 << 16) | (0xc7b0 >> 2),
439 0x00000000,
440 (0x0400 << 16) | (0xc7b4 >> 2),
441 0x00000000,
442 (0x0e00 << 16) | (0x9100 >> 2),
443 0x00000000,
444 (0x0e00 << 16) | (0x3c010 >> 2),
445 0x00000000,
446 (0x0e00 << 16) | (0x92a8 >> 2),
447 0x00000000,
448 (0x0e00 << 16) | (0x92ac >> 2),
449 0x00000000,
450 (0x0e00 << 16) | (0x92b4 >> 2),
451 0x00000000,
452 (0x0e00 << 16) | (0x92b8 >> 2),
453 0x00000000,
454 (0x0e00 << 16) | (0x92bc >> 2),
455 0x00000000,
456 (0x0e00 << 16) | (0x92c0 >> 2),
457 0x00000000,
458 (0x0e00 << 16) | (0x92c4 >> 2),
459 0x00000000,
460 (0x0e00 << 16) | (0x92c8 >> 2),
461 0x00000000,
462 (0x0e00 << 16) | (0x92cc >> 2),
463 0x00000000,
464 (0x0e00 << 16) | (0x92d0 >> 2),
465 0x00000000,
466 (0x0e00 << 16) | (0x8c00 >> 2),
467 0x00000000,
468 (0x0e00 << 16) | (0x8c04 >> 2),
469 0x00000000,
470 (0x0e00 << 16) | (0x8c20 >> 2),
471 0x00000000,
472 (0x0e00 << 16) | (0x8c38 >> 2),
473 0x00000000,
474 (0x0e00 << 16) | (0x8c3c >> 2),
475 0x00000000,
476 (0x0e00 << 16) | (0xae00 >> 2),
477 0x00000000,
478 (0x0e00 << 16) | (0x9604 >> 2),
479 0x00000000,
480 (0x0e00 << 16) | (0xac08 >> 2),
481 0x00000000,
482 (0x0e00 << 16) | (0xac0c >> 2),
483 0x00000000,
484 (0x0e00 << 16) | (0xac10 >> 2),
485 0x00000000,
486 (0x0e00 << 16) | (0xac14 >> 2),
487 0x00000000,
488 (0x0e00 << 16) | (0xac58 >> 2),
489 0x00000000,
490 (0x0e00 << 16) | (0xac68 >> 2),
491 0x00000000,
492 (0x0e00 << 16) | (0xac6c >> 2),
493 0x00000000,
494 (0x0e00 << 16) | (0xac70 >> 2),
495 0x00000000,
496 (0x0e00 << 16) | (0xac74 >> 2),
497 0x00000000,
498 (0x0e00 << 16) | (0xac78 >> 2),
499 0x00000000,
500 (0x0e00 << 16) | (0xac7c >> 2),
501 0x00000000,
502 (0x0e00 << 16) | (0xac80 >> 2),
503 0x00000000,
504 (0x0e00 << 16) | (0xac84 >> 2),
505 0x00000000,
506 (0x0e00 << 16) | (0xac88 >> 2),
507 0x00000000,
508 (0x0e00 << 16) | (0xac8c >> 2),
509 0x00000000,
510 (0x0e00 << 16) | (0x970c >> 2),
511 0x00000000,
512 (0x0e00 << 16) | (0x9714 >> 2),
513 0x00000000,
514 (0x0e00 << 16) | (0x9718 >> 2),
515 0x00000000,
516 (0x0e00 << 16) | (0x971c >> 2),
517 0x00000000,
518 (0x0e00 << 16) | (0x31068 >> 2),
519 0x00000000,
520 (0x4e00 << 16) | (0x31068 >> 2),
521 0x00000000,
522 (0x5e00 << 16) | (0x31068 >> 2),
523 0x00000000,
524 (0x6e00 << 16) | (0x31068 >> 2),
525 0x00000000,
526 (0x7e00 << 16) | (0x31068 >> 2),
527 0x00000000,
528 (0x8e00 << 16) | (0x31068 >> 2),
529 0x00000000,
530 (0x9e00 << 16) | (0x31068 >> 2),
531 0x00000000,
532 (0xae00 << 16) | (0x31068 >> 2),
533 0x00000000,
534 (0xbe00 << 16) | (0x31068 >> 2),
535 0x00000000,
536 (0x0e00 << 16) | (0xcd10 >> 2),
537 0x00000000,
538 (0x0e00 << 16) | (0xcd14 >> 2),
539 0x00000000,
540 (0x0e00 << 16) | (0x88b0 >> 2),
541 0x00000000,
542 (0x0e00 << 16) | (0x88b4 >> 2),
543 0x00000000,
544 (0x0e00 << 16) | (0x88b8 >> 2),
545 0x00000000,
546 (0x0e00 << 16) | (0x88bc >> 2),
547 0x00000000,
548 (0x0400 << 16) | (0x89c0 >> 2),
549 0x00000000,
550 (0x0e00 << 16) | (0x88c4 >> 2),
551 0x00000000,
552 (0x0e00 << 16) | (0x88c8 >> 2),
553 0x00000000,
554 (0x0e00 << 16) | (0x88d0 >> 2),
555 0x00000000,
556 (0x0e00 << 16) | (0x88d4 >> 2),
557 0x00000000,
558 (0x0e00 << 16) | (0x88d8 >> 2),
559 0x00000000,
560 (0x0e00 << 16) | (0x8980 >> 2),
561 0x00000000,
562 (0x0e00 << 16) | (0x30938 >> 2),
563 0x00000000,
564 (0x0e00 << 16) | (0x3093c >> 2),
565 0x00000000,
566 (0x0e00 << 16) | (0x30940 >> 2),
567 0x00000000,
568 (0x0e00 << 16) | (0x89a0 >> 2),
569 0x00000000,
570 (0x0e00 << 16) | (0x30900 >> 2),
571 0x00000000,
572 (0x0e00 << 16) | (0x30904 >> 2),
573 0x00000000,
574 (0x0e00 << 16) | (0x89b4 >> 2),
575 0x00000000,
576 (0x0e00 << 16) | (0x3c210 >> 2),
577 0x00000000,
578 (0x0e00 << 16) | (0x3c214 >> 2),
579 0x00000000,
580 (0x0e00 << 16) | (0x3c218 >> 2),
581 0x00000000,
582 (0x0e00 << 16) | (0x8904 >> 2),
583 0x00000000,
584 0x5,
585 (0x0e00 << 16) | (0x8c28 >> 2),
586 (0x0e00 << 16) | (0x8c2c >> 2),
587 (0x0e00 << 16) | (0x8c30 >> 2),
588 (0x0e00 << 16) | (0x8c34 >> 2),
589 (0x0e00 << 16) | (0x9600 >> 2),
590};
591
592static const u32 kalindi_rlc_save_restore_register_list[] =
593{
594 (0x0e00 << 16) | (0xc12c >> 2),
595 0x00000000,
596 (0x0e00 << 16) | (0xc140 >> 2),
597 0x00000000,
598 (0x0e00 << 16) | (0xc150 >> 2),
599 0x00000000,
600 (0x0e00 << 16) | (0xc15c >> 2),
601 0x00000000,
602 (0x0e00 << 16) | (0xc168 >> 2),
603 0x00000000,
604 (0x0e00 << 16) | (0xc170 >> 2),
605 0x00000000,
606 (0x0e00 << 16) | (0xc204 >> 2),
607 0x00000000,
608 (0x0e00 << 16) | (0xc2b4 >> 2),
609 0x00000000,
610 (0x0e00 << 16) | (0xc2b8 >> 2),
611 0x00000000,
612 (0x0e00 << 16) | (0xc2bc >> 2),
613 0x00000000,
614 (0x0e00 << 16) | (0xc2c0 >> 2),
615 0x00000000,
616 (0x0e00 << 16) | (0x8228 >> 2),
617 0x00000000,
618 (0x0e00 << 16) | (0x829c >> 2),
619 0x00000000,
620 (0x0e00 << 16) | (0x869c >> 2),
621 0x00000000,
622 (0x0600 << 16) | (0x98f4 >> 2),
623 0x00000000,
624 (0x0e00 << 16) | (0x98f8 >> 2),
625 0x00000000,
626 (0x0e00 << 16) | (0x9900 >> 2),
627 0x00000000,
628 (0x0e00 << 16) | (0xc260 >> 2),
629 0x00000000,
630 (0x0e00 << 16) | (0x90e8 >> 2),
631 0x00000000,
632 (0x0e00 << 16) | (0x3c000 >> 2),
633 0x00000000,
634 (0x0e00 << 16) | (0x3c00c >> 2),
635 0x00000000,
636 (0x0e00 << 16) | (0x8c1c >> 2),
637 0x00000000,
638 (0x0e00 << 16) | (0x9700 >> 2),
639 0x00000000,
640 (0x0e00 << 16) | (0xcd20 >> 2),
641 0x00000000,
642 (0x4e00 << 16) | (0xcd20 >> 2),
643 0x00000000,
644 (0x5e00 << 16) | (0xcd20 >> 2),
645 0x00000000,
646 (0x6e00 << 16) | (0xcd20 >> 2),
647 0x00000000,
648 (0x7e00 << 16) | (0xcd20 >> 2),
649 0x00000000,
650 (0x0e00 << 16) | (0x89bc >> 2),
651 0x00000000,
652 (0x0e00 << 16) | (0x8900 >> 2),
653 0x00000000,
654 0x3,
655 (0x0e00 << 16) | (0xc130 >> 2),
656 0x00000000,
657 (0x0e00 << 16) | (0xc134 >> 2),
658 0x00000000,
659 (0x0e00 << 16) | (0xc1fc >> 2),
660 0x00000000,
661 (0x0e00 << 16) | (0xc208 >> 2),
662 0x00000000,
663 (0x0e00 << 16) | (0xc264 >> 2),
664 0x00000000,
665 (0x0e00 << 16) | (0xc268 >> 2),
666 0x00000000,
667 (0x0e00 << 16) | (0xc26c >> 2),
668 0x00000000,
669 (0x0e00 << 16) | (0xc270 >> 2),
670 0x00000000,
671 (0x0e00 << 16) | (0xc274 >> 2),
672 0x00000000,
673 (0x0e00 << 16) | (0xc28c >> 2),
674 0x00000000,
675 (0x0e00 << 16) | (0xc290 >> 2),
676 0x00000000,
677 (0x0e00 << 16) | (0xc294 >> 2),
678 0x00000000,
679 (0x0e00 << 16) | (0xc298 >> 2),
680 0x00000000,
681 (0x0e00 << 16) | (0xc2a0 >> 2),
682 0x00000000,
683 (0x0e00 << 16) | (0xc2a4 >> 2),
684 0x00000000,
685 (0x0e00 << 16) | (0xc2a8 >> 2),
686 0x00000000,
687 (0x0e00 << 16) | (0xc2ac >> 2),
688 0x00000000,
689 (0x0e00 << 16) | (0x301d0 >> 2),
690 0x00000000,
691 (0x0e00 << 16) | (0x30238 >> 2),
692 0x00000000,
693 (0x0e00 << 16) | (0x30250 >> 2),
694 0x00000000,
695 (0x0e00 << 16) | (0x30254 >> 2),
696 0x00000000,
697 (0x0e00 << 16) | (0x30258 >> 2),
698 0x00000000,
699 (0x0e00 << 16) | (0x3025c >> 2),
700 0x00000000,
701 (0x4e00 << 16) | (0xc900 >> 2),
702 0x00000000,
703 (0x5e00 << 16) | (0xc900 >> 2),
704 0x00000000,
705 (0x6e00 << 16) | (0xc900 >> 2),
706 0x00000000,
707 (0x7e00 << 16) | (0xc900 >> 2),
708 0x00000000,
709 (0x4e00 << 16) | (0xc904 >> 2),
710 0x00000000,
711 (0x5e00 << 16) | (0xc904 >> 2),
712 0x00000000,
713 (0x6e00 << 16) | (0xc904 >> 2),
714 0x00000000,
715 (0x7e00 << 16) | (0xc904 >> 2),
716 0x00000000,
717 (0x4e00 << 16) | (0xc908 >> 2),
718 0x00000000,
719 (0x5e00 << 16) | (0xc908 >> 2),
720 0x00000000,
721 (0x6e00 << 16) | (0xc908 >> 2),
722 0x00000000,
723 (0x7e00 << 16) | (0xc908 >> 2),
724 0x00000000,
725 (0x4e00 << 16) | (0xc90c >> 2),
726 0x00000000,
727 (0x5e00 << 16) | (0xc90c >> 2),
728 0x00000000,
729 (0x6e00 << 16) | (0xc90c >> 2),
730 0x00000000,
731 (0x7e00 << 16) | (0xc90c >> 2),
732 0x00000000,
733 (0x4e00 << 16) | (0xc910 >> 2),
734 0x00000000,
735 (0x5e00 << 16) | (0xc910 >> 2),
736 0x00000000,
737 (0x6e00 << 16) | (0xc910 >> 2),
738 0x00000000,
739 (0x7e00 << 16) | (0xc910 >> 2),
740 0x00000000,
741 (0x0e00 << 16) | (0xc99c >> 2),
742 0x00000000,
743 (0x0e00 << 16) | (0x9834 >> 2),
744 0x00000000,
745 (0x0000 << 16) | (0x30f00 >> 2),
746 0x00000000,
747 (0x0000 << 16) | (0x30f04 >> 2),
748 0x00000000,
749 (0x0000 << 16) | (0x30f08 >> 2),
750 0x00000000,
751 (0x0000 << 16) | (0x30f0c >> 2),
752 0x00000000,
753 (0x0600 << 16) | (0x9b7c >> 2),
754 0x00000000,
755 (0x0e00 << 16) | (0x8a14 >> 2),
756 0x00000000,
757 (0x0e00 << 16) | (0x8a18 >> 2),
758 0x00000000,
759 (0x0600 << 16) | (0x30a00 >> 2),
760 0x00000000,
761 (0x0e00 << 16) | (0x8bf0 >> 2),
762 0x00000000,
763 (0x0e00 << 16) | (0x8bcc >> 2),
764 0x00000000,
765 (0x0e00 << 16) | (0x8b24 >> 2),
766 0x00000000,
767 (0x0e00 << 16) | (0x30a04 >> 2),
768 0x00000000,
769 (0x0600 << 16) | (0x30a10 >> 2),
770 0x00000000,
771 (0x0600 << 16) | (0x30a14 >> 2),
772 0x00000000,
773 (0x0600 << 16) | (0x30a18 >> 2),
774 0x00000000,
775 (0x0600 << 16) | (0x30a2c >> 2),
776 0x00000000,
777 (0x0e00 << 16) | (0xc700 >> 2),
778 0x00000000,
779 (0x0e00 << 16) | (0xc704 >> 2),
780 0x00000000,
781 (0x0e00 << 16) | (0xc708 >> 2),
782 0x00000000,
783 (0x0e00 << 16) | (0xc768 >> 2),
784 0x00000000,
785 (0x0400 << 16) | (0xc770 >> 2),
786 0x00000000,
787 (0x0400 << 16) | (0xc774 >> 2),
788 0x00000000,
789 (0x0400 << 16) | (0xc798 >> 2),
790 0x00000000,
791 (0x0400 << 16) | (0xc79c >> 2),
792 0x00000000,
793 (0x0e00 << 16) | (0x9100 >> 2),
794 0x00000000,
795 (0x0e00 << 16) | (0x3c010 >> 2),
796 0x00000000,
797 (0x0e00 << 16) | (0x8c00 >> 2),
798 0x00000000,
799 (0x0e00 << 16) | (0x8c04 >> 2),
800 0x00000000,
801 (0x0e00 << 16) | (0x8c20 >> 2),
802 0x00000000,
803 (0x0e00 << 16) | (0x8c38 >> 2),
804 0x00000000,
805 (0x0e00 << 16) | (0x8c3c >> 2),
806 0x00000000,
807 (0x0e00 << 16) | (0xae00 >> 2),
808 0x00000000,
809 (0x0e00 << 16) | (0x9604 >> 2),
810 0x00000000,
811 (0x0e00 << 16) | (0xac08 >> 2),
812 0x00000000,
813 (0x0e00 << 16) | (0xac0c >> 2),
814 0x00000000,
815 (0x0e00 << 16) | (0xac10 >> 2),
816 0x00000000,
817 (0x0e00 << 16) | (0xac14 >> 2),
818 0x00000000,
819 (0x0e00 << 16) | (0xac58 >> 2),
820 0x00000000,
821 (0x0e00 << 16) | (0xac68 >> 2),
822 0x00000000,
823 (0x0e00 << 16) | (0xac6c >> 2),
824 0x00000000,
825 (0x0e00 << 16) | (0xac70 >> 2),
826 0x00000000,
827 (0x0e00 << 16) | (0xac74 >> 2),
828 0x00000000,
829 (0x0e00 << 16) | (0xac78 >> 2),
830 0x00000000,
831 (0x0e00 << 16) | (0xac7c >> 2),
832 0x00000000,
833 (0x0e00 << 16) | (0xac80 >> 2),
834 0x00000000,
835 (0x0e00 << 16) | (0xac84 >> 2),
836 0x00000000,
837 (0x0e00 << 16) | (0xac88 >> 2),
838 0x00000000,
839 (0x0e00 << 16) | (0xac8c >> 2),
840 0x00000000,
841 (0x0e00 << 16) | (0x970c >> 2),
842 0x00000000,
843 (0x0e00 << 16) | (0x9714 >> 2),
844 0x00000000,
845 (0x0e00 << 16) | (0x9718 >> 2),
846 0x00000000,
847 (0x0e00 << 16) | (0x971c >> 2),
848 0x00000000,
849 (0x0e00 << 16) | (0x31068 >> 2),
850 0x00000000,
851 (0x4e00 << 16) | (0x31068 >> 2),
852 0x00000000,
853 (0x5e00 << 16) | (0x31068 >> 2),
854 0x00000000,
855 (0x6e00 << 16) | (0x31068 >> 2),
856 0x00000000,
857 (0x7e00 << 16) | (0x31068 >> 2),
858 0x00000000,
859 (0x0e00 << 16) | (0xcd10 >> 2),
860 0x00000000,
861 (0x0e00 << 16) | (0xcd14 >> 2),
862 0x00000000,
863 (0x0e00 << 16) | (0x88b0 >> 2),
864 0x00000000,
865 (0x0e00 << 16) | (0x88b4 >> 2),
866 0x00000000,
867 (0x0e00 << 16) | (0x88b8 >> 2),
868 0x00000000,
869 (0x0e00 << 16) | (0x88bc >> 2),
870 0x00000000,
871 (0x0400 << 16) | (0x89c0 >> 2),
872 0x00000000,
873 (0x0e00 << 16) | (0x88c4 >> 2),
874 0x00000000,
875 (0x0e00 << 16) | (0x88c8 >> 2),
876 0x00000000,
877 (0x0e00 << 16) | (0x88d0 >> 2),
878 0x00000000,
879 (0x0e00 << 16) | (0x88d4 >> 2),
880 0x00000000,
881 (0x0e00 << 16) | (0x88d8 >> 2),
882 0x00000000,
883 (0x0e00 << 16) | (0x8980 >> 2),
884 0x00000000,
885 (0x0e00 << 16) | (0x30938 >> 2),
886 0x00000000,
887 (0x0e00 << 16) | (0x3093c >> 2),
888 0x00000000,
889 (0x0e00 << 16) | (0x30940 >> 2),
890 0x00000000,
891 (0x0e00 << 16) | (0x89a0 >> 2),
892 0x00000000,
893 (0x0e00 << 16) | (0x30900 >> 2),
894 0x00000000,
895 (0x0e00 << 16) | (0x30904 >> 2),
896 0x00000000,
897 (0x0e00 << 16) | (0x89b4 >> 2),
898 0x00000000,
899 (0x0e00 << 16) | (0x3e1fc >> 2),
900 0x00000000,
901 (0x0e00 << 16) | (0x3c210 >> 2),
902 0x00000000,
903 (0x0e00 << 16) | (0x3c214 >> 2),
904 0x00000000,
905 (0x0e00 << 16) | (0x3c218 >> 2),
906 0x00000000,
907 (0x0e00 << 16) | (0x8904 >> 2),
908 0x00000000,
909 0x5,
910 (0x0e00 << 16) | (0x8c28 >> 2),
911 (0x0e00 << 16) | (0x8c2c >> 2),
912 (0x0e00 << 16) | (0x8c30 >> 2),
913 (0x0e00 << 16) | (0x8c34 >> 2),
914 (0x0e00 << 16) | (0x9600 >> 2),
915};
916
Alex Deucher0aafd312013-04-09 14:43:30 -0400917static const u32 bonaire_golden_spm_registers[] =
918{
919 0x30800, 0xe0ffffff, 0xe0000000
920};
921
922static const u32 bonaire_golden_common_registers[] =
923{
924 0xc770, 0xffffffff, 0x00000800,
925 0xc774, 0xffffffff, 0x00000800,
926 0xc798, 0xffffffff, 0x00007fbf,
927 0xc79c, 0xffffffff, 0x00007faf
928};
929
930static const u32 bonaire_golden_registers[] =
931{
932 0x3354, 0x00000333, 0x00000333,
933 0x3350, 0x000c0fc0, 0x00040200,
934 0x9a10, 0x00010000, 0x00058208,
935 0x3c000, 0xffff1fff, 0x00140000,
936 0x3c200, 0xfdfc0fff, 0x00000100,
937 0x3c234, 0x40000000, 0x40000200,
938 0x9830, 0xffffffff, 0x00000000,
939 0x9834, 0xf00fffff, 0x00000400,
940 0x9838, 0x0002021c, 0x00020200,
941 0xc78, 0x00000080, 0x00000000,
942 0x5bb0, 0x000000f0, 0x00000070,
943 0x5bc0, 0xf0311fff, 0x80300000,
944 0x98f8, 0x73773777, 0x12010001,
945 0x350c, 0x00810000, 0x408af000,
946 0x7030, 0x31000111, 0x00000011,
947 0x2f48, 0x73773777, 0x12010001,
948 0x220c, 0x00007fb6, 0x0021a1b1,
949 0x2210, 0x00007fb6, 0x002021b1,
950 0x2180, 0x00007fb6, 0x00002191,
951 0x2218, 0x00007fb6, 0x002121b1,
952 0x221c, 0x00007fb6, 0x002021b1,
953 0x21dc, 0x00007fb6, 0x00002191,
954 0x21e0, 0x00007fb6, 0x00002191,
955 0x3628, 0x0000003f, 0x0000000a,
956 0x362c, 0x0000003f, 0x0000000a,
957 0x2ae4, 0x00073ffe, 0x000022a2,
958 0x240c, 0x000007ff, 0x00000000,
959 0x8a14, 0xf000003f, 0x00000007,
960 0x8bf0, 0x00002001, 0x00000001,
961 0x8b24, 0xffffffff, 0x00ffffff,
962 0x30a04, 0x0000ff0f, 0x00000000,
963 0x28a4c, 0x07ffffff, 0x06000000,
964 0x4d8, 0x00000fff, 0x00000100,
965 0x3e78, 0x00000001, 0x00000002,
966 0x9100, 0x03000000, 0x0362c688,
967 0x8c00, 0x000000ff, 0x00000001,
968 0xe40, 0x00001fff, 0x00001fff,
969 0x9060, 0x0000007f, 0x00000020,
970 0x9508, 0x00010000, 0x00010000,
971 0xac14, 0x000003ff, 0x000000f3,
972 0xac0c, 0xffffffff, 0x00001032
973};
974
975static const u32 bonaire_mgcg_cgcg_init[] =
976{
977 0xc420, 0xffffffff, 0xfffffffc,
978 0x30800, 0xffffffff, 0xe0000000,
979 0x3c2a0, 0xffffffff, 0x00000100,
980 0x3c208, 0xffffffff, 0x00000100,
981 0x3c2c0, 0xffffffff, 0xc0000100,
982 0x3c2c8, 0xffffffff, 0xc0000100,
983 0x3c2c4, 0xffffffff, 0xc0000100,
984 0x55e4, 0xffffffff, 0x00600100,
985 0x3c280, 0xffffffff, 0x00000100,
986 0x3c214, 0xffffffff, 0x06000100,
987 0x3c220, 0xffffffff, 0x00000100,
988 0x3c218, 0xffffffff, 0x06000100,
989 0x3c204, 0xffffffff, 0x00000100,
990 0x3c2e0, 0xffffffff, 0x00000100,
991 0x3c224, 0xffffffff, 0x00000100,
992 0x3c200, 0xffffffff, 0x00000100,
993 0x3c230, 0xffffffff, 0x00000100,
994 0x3c234, 0xffffffff, 0x00000100,
995 0x3c250, 0xffffffff, 0x00000100,
996 0x3c254, 0xffffffff, 0x00000100,
997 0x3c258, 0xffffffff, 0x00000100,
998 0x3c25c, 0xffffffff, 0x00000100,
999 0x3c260, 0xffffffff, 0x00000100,
1000 0x3c27c, 0xffffffff, 0x00000100,
1001 0x3c278, 0xffffffff, 0x00000100,
1002 0x3c210, 0xffffffff, 0x06000100,
1003 0x3c290, 0xffffffff, 0x00000100,
1004 0x3c274, 0xffffffff, 0x00000100,
1005 0x3c2b4, 0xffffffff, 0x00000100,
1006 0x3c2b0, 0xffffffff, 0x00000100,
1007 0x3c270, 0xffffffff, 0x00000100,
1008 0x30800, 0xffffffff, 0xe0000000,
1009 0x3c020, 0xffffffff, 0x00010000,
1010 0x3c024, 0xffffffff, 0x00030002,
1011 0x3c028, 0xffffffff, 0x00040007,
1012 0x3c02c, 0xffffffff, 0x00060005,
1013 0x3c030, 0xffffffff, 0x00090008,
1014 0x3c034, 0xffffffff, 0x00010000,
1015 0x3c038, 0xffffffff, 0x00030002,
1016 0x3c03c, 0xffffffff, 0x00040007,
1017 0x3c040, 0xffffffff, 0x00060005,
1018 0x3c044, 0xffffffff, 0x00090008,
1019 0x3c048, 0xffffffff, 0x00010000,
1020 0x3c04c, 0xffffffff, 0x00030002,
1021 0x3c050, 0xffffffff, 0x00040007,
1022 0x3c054, 0xffffffff, 0x00060005,
1023 0x3c058, 0xffffffff, 0x00090008,
1024 0x3c05c, 0xffffffff, 0x00010000,
1025 0x3c060, 0xffffffff, 0x00030002,
1026 0x3c064, 0xffffffff, 0x00040007,
1027 0x3c068, 0xffffffff, 0x00060005,
1028 0x3c06c, 0xffffffff, 0x00090008,
1029 0x3c070, 0xffffffff, 0x00010000,
1030 0x3c074, 0xffffffff, 0x00030002,
1031 0x3c078, 0xffffffff, 0x00040007,
1032 0x3c07c, 0xffffffff, 0x00060005,
1033 0x3c080, 0xffffffff, 0x00090008,
1034 0x3c084, 0xffffffff, 0x00010000,
1035 0x3c088, 0xffffffff, 0x00030002,
1036 0x3c08c, 0xffffffff, 0x00040007,
1037 0x3c090, 0xffffffff, 0x00060005,
1038 0x3c094, 0xffffffff, 0x00090008,
1039 0x3c098, 0xffffffff, 0x00010000,
1040 0x3c09c, 0xffffffff, 0x00030002,
1041 0x3c0a0, 0xffffffff, 0x00040007,
1042 0x3c0a4, 0xffffffff, 0x00060005,
1043 0x3c0a8, 0xffffffff, 0x00090008,
1044 0x3c000, 0xffffffff, 0x96e00200,
1045 0x8708, 0xffffffff, 0x00900100,
1046 0xc424, 0xffffffff, 0x0020003f,
1047 0x38, 0xffffffff, 0x0140001c,
1048 0x3c, 0x000f0000, 0x000f0000,
1049 0x220, 0xffffffff, 0xC060000C,
1050 0x224, 0xc0000fff, 0x00000100,
1051 0xf90, 0xffffffff, 0x00000100,
1052 0xf98, 0x00000101, 0x00000000,
1053 0x20a8, 0xffffffff, 0x00000104,
1054 0x55e4, 0xff000fff, 0x00000100,
1055 0x30cc, 0xc0000fff, 0x00000104,
1056 0xc1e4, 0x00000001, 0x00000001,
1057 0xd00c, 0xff000ff0, 0x00000100,
1058 0xd80c, 0xff000ff0, 0x00000100
1059};
1060
1061static const u32 spectre_golden_spm_registers[] =
1062{
1063 0x30800, 0xe0ffffff, 0xe0000000
1064};
1065
1066static const u32 spectre_golden_common_registers[] =
1067{
1068 0xc770, 0xffffffff, 0x00000800,
1069 0xc774, 0xffffffff, 0x00000800,
1070 0xc798, 0xffffffff, 0x00007fbf,
1071 0xc79c, 0xffffffff, 0x00007faf
1072};
1073
1074static const u32 spectre_golden_registers[] =
1075{
1076 0x3c000, 0xffff1fff, 0x96940200,
1077 0x3c00c, 0xffff0001, 0xff000000,
1078 0x3c200, 0xfffc0fff, 0x00000100,
1079 0x6ed8, 0x00010101, 0x00010000,
1080 0x9834, 0xf00fffff, 0x00000400,
1081 0x9838, 0xfffffffc, 0x00020200,
1082 0x5bb0, 0x000000f0, 0x00000070,
1083 0x5bc0, 0xf0311fff, 0x80300000,
1084 0x98f8, 0x73773777, 0x12010001,
1085 0x9b7c, 0x00ff0000, 0x00fc0000,
1086 0x2f48, 0x73773777, 0x12010001,
1087 0x8a14, 0xf000003f, 0x00000007,
1088 0x8b24, 0xffffffff, 0x00ffffff,
1089 0x28350, 0x3f3f3fff, 0x00000082,
1090 0x28355, 0x0000003f, 0x00000000,
1091 0x3e78, 0x00000001, 0x00000002,
1092 0x913c, 0xffff03df, 0x00000004,
1093 0xc768, 0x00000008, 0x00000008,
1094 0x8c00, 0x000008ff, 0x00000800,
1095 0x9508, 0x00010000, 0x00010000,
1096 0xac0c, 0xffffffff, 0x54763210,
1097 0x214f8, 0x01ff01ff, 0x00000002,
1098 0x21498, 0x007ff800, 0x00200000,
1099 0x2015c, 0xffffffff, 0x00000f40,
1100 0x30934, 0xffffffff, 0x00000001
1101};
1102
1103static const u32 spectre_mgcg_cgcg_init[] =
1104{
1105 0xc420, 0xffffffff, 0xfffffffc,
1106 0x30800, 0xffffffff, 0xe0000000,
1107 0x3c2a0, 0xffffffff, 0x00000100,
1108 0x3c208, 0xffffffff, 0x00000100,
1109 0x3c2c0, 0xffffffff, 0x00000100,
1110 0x3c2c8, 0xffffffff, 0x00000100,
1111 0x3c2c4, 0xffffffff, 0x00000100,
1112 0x55e4, 0xffffffff, 0x00600100,
1113 0x3c280, 0xffffffff, 0x00000100,
1114 0x3c214, 0xffffffff, 0x06000100,
1115 0x3c220, 0xffffffff, 0x00000100,
1116 0x3c218, 0xffffffff, 0x06000100,
1117 0x3c204, 0xffffffff, 0x00000100,
1118 0x3c2e0, 0xffffffff, 0x00000100,
1119 0x3c224, 0xffffffff, 0x00000100,
1120 0x3c200, 0xffffffff, 0x00000100,
1121 0x3c230, 0xffffffff, 0x00000100,
1122 0x3c234, 0xffffffff, 0x00000100,
1123 0x3c250, 0xffffffff, 0x00000100,
1124 0x3c254, 0xffffffff, 0x00000100,
1125 0x3c258, 0xffffffff, 0x00000100,
1126 0x3c25c, 0xffffffff, 0x00000100,
1127 0x3c260, 0xffffffff, 0x00000100,
1128 0x3c27c, 0xffffffff, 0x00000100,
1129 0x3c278, 0xffffffff, 0x00000100,
1130 0x3c210, 0xffffffff, 0x06000100,
1131 0x3c290, 0xffffffff, 0x00000100,
1132 0x3c274, 0xffffffff, 0x00000100,
1133 0x3c2b4, 0xffffffff, 0x00000100,
1134 0x3c2b0, 0xffffffff, 0x00000100,
1135 0x3c270, 0xffffffff, 0x00000100,
1136 0x30800, 0xffffffff, 0xe0000000,
1137 0x3c020, 0xffffffff, 0x00010000,
1138 0x3c024, 0xffffffff, 0x00030002,
1139 0x3c028, 0xffffffff, 0x00040007,
1140 0x3c02c, 0xffffffff, 0x00060005,
1141 0x3c030, 0xffffffff, 0x00090008,
1142 0x3c034, 0xffffffff, 0x00010000,
1143 0x3c038, 0xffffffff, 0x00030002,
1144 0x3c03c, 0xffffffff, 0x00040007,
1145 0x3c040, 0xffffffff, 0x00060005,
1146 0x3c044, 0xffffffff, 0x00090008,
1147 0x3c048, 0xffffffff, 0x00010000,
1148 0x3c04c, 0xffffffff, 0x00030002,
1149 0x3c050, 0xffffffff, 0x00040007,
1150 0x3c054, 0xffffffff, 0x00060005,
1151 0x3c058, 0xffffffff, 0x00090008,
1152 0x3c05c, 0xffffffff, 0x00010000,
1153 0x3c060, 0xffffffff, 0x00030002,
1154 0x3c064, 0xffffffff, 0x00040007,
1155 0x3c068, 0xffffffff, 0x00060005,
1156 0x3c06c, 0xffffffff, 0x00090008,
1157 0x3c070, 0xffffffff, 0x00010000,
1158 0x3c074, 0xffffffff, 0x00030002,
1159 0x3c078, 0xffffffff, 0x00040007,
1160 0x3c07c, 0xffffffff, 0x00060005,
1161 0x3c080, 0xffffffff, 0x00090008,
1162 0x3c084, 0xffffffff, 0x00010000,
1163 0x3c088, 0xffffffff, 0x00030002,
1164 0x3c08c, 0xffffffff, 0x00040007,
1165 0x3c090, 0xffffffff, 0x00060005,
1166 0x3c094, 0xffffffff, 0x00090008,
1167 0x3c098, 0xffffffff, 0x00010000,
1168 0x3c09c, 0xffffffff, 0x00030002,
1169 0x3c0a0, 0xffffffff, 0x00040007,
1170 0x3c0a4, 0xffffffff, 0x00060005,
1171 0x3c0a8, 0xffffffff, 0x00090008,
1172 0x3c0ac, 0xffffffff, 0x00010000,
1173 0x3c0b0, 0xffffffff, 0x00030002,
1174 0x3c0b4, 0xffffffff, 0x00040007,
1175 0x3c0b8, 0xffffffff, 0x00060005,
1176 0x3c0bc, 0xffffffff, 0x00090008,
1177 0x3c000, 0xffffffff, 0x96e00200,
1178 0x8708, 0xffffffff, 0x00900100,
1179 0xc424, 0xffffffff, 0x0020003f,
1180 0x38, 0xffffffff, 0x0140001c,
1181 0x3c, 0x000f0000, 0x000f0000,
1182 0x220, 0xffffffff, 0xC060000C,
1183 0x224, 0xc0000fff, 0x00000100,
1184 0xf90, 0xffffffff, 0x00000100,
1185 0xf98, 0x00000101, 0x00000000,
1186 0x20a8, 0xffffffff, 0x00000104,
1187 0x55e4, 0xff000fff, 0x00000100,
1188 0x30cc, 0xc0000fff, 0x00000104,
1189 0xc1e4, 0x00000001, 0x00000001,
1190 0xd00c, 0xff000ff0, 0x00000100,
1191 0xd80c, 0xff000ff0, 0x00000100
1192};
1193
1194static const u32 kalindi_golden_spm_registers[] =
1195{
1196 0x30800, 0xe0ffffff, 0xe0000000
1197};
1198
1199static const u32 kalindi_golden_common_registers[] =
1200{
1201 0xc770, 0xffffffff, 0x00000800,
1202 0xc774, 0xffffffff, 0x00000800,
1203 0xc798, 0xffffffff, 0x00007fbf,
1204 0xc79c, 0xffffffff, 0x00007faf
1205};
1206
1207static const u32 kalindi_golden_registers[] =
1208{
1209 0x3c000, 0xffffdfff, 0x6e944040,
1210 0x55e4, 0xff607fff, 0xfc000100,
1211 0x3c220, 0xff000fff, 0x00000100,
1212 0x3c224, 0xff000fff, 0x00000100,
1213 0x3c200, 0xfffc0fff, 0x00000100,
1214 0x6ed8, 0x00010101, 0x00010000,
1215 0x9830, 0xffffffff, 0x00000000,
1216 0x9834, 0xf00fffff, 0x00000400,
1217 0x5bb0, 0x000000f0, 0x00000070,
1218 0x5bc0, 0xf0311fff, 0x80300000,
1219 0x98f8, 0x73773777, 0x12010001,
1220 0x98fc, 0xffffffff, 0x00000010,
1221 0x9b7c, 0x00ff0000, 0x00fc0000,
1222 0x8030, 0x00001f0f, 0x0000100a,
1223 0x2f48, 0x73773777, 0x12010001,
1224 0x2408, 0x000fffff, 0x000c007f,
1225 0x8a14, 0xf000003f, 0x00000007,
1226 0x8b24, 0x3fff3fff, 0x00ffcfff,
1227 0x30a04, 0x0000ff0f, 0x00000000,
1228 0x28a4c, 0x07ffffff, 0x06000000,
1229 0x4d8, 0x00000fff, 0x00000100,
1230 0x3e78, 0x00000001, 0x00000002,
1231 0xc768, 0x00000008, 0x00000008,
1232 0x8c00, 0x000000ff, 0x00000003,
1233 0x214f8, 0x01ff01ff, 0x00000002,
1234 0x21498, 0x007ff800, 0x00200000,
1235 0x2015c, 0xffffffff, 0x00000f40,
1236 0x88c4, 0x001f3ae3, 0x00000082,
1237 0x88d4, 0x0000001f, 0x00000010,
1238 0x30934, 0xffffffff, 0x00000000
1239};
1240
1241static const u32 kalindi_mgcg_cgcg_init[] =
1242{
1243 0xc420, 0xffffffff, 0xfffffffc,
1244 0x30800, 0xffffffff, 0xe0000000,
1245 0x3c2a0, 0xffffffff, 0x00000100,
1246 0x3c208, 0xffffffff, 0x00000100,
1247 0x3c2c0, 0xffffffff, 0x00000100,
1248 0x3c2c8, 0xffffffff, 0x00000100,
1249 0x3c2c4, 0xffffffff, 0x00000100,
1250 0x55e4, 0xffffffff, 0x00600100,
1251 0x3c280, 0xffffffff, 0x00000100,
1252 0x3c214, 0xffffffff, 0x06000100,
1253 0x3c220, 0xffffffff, 0x00000100,
1254 0x3c218, 0xffffffff, 0x06000100,
1255 0x3c204, 0xffffffff, 0x00000100,
1256 0x3c2e0, 0xffffffff, 0x00000100,
1257 0x3c224, 0xffffffff, 0x00000100,
1258 0x3c200, 0xffffffff, 0x00000100,
1259 0x3c230, 0xffffffff, 0x00000100,
1260 0x3c234, 0xffffffff, 0x00000100,
1261 0x3c250, 0xffffffff, 0x00000100,
1262 0x3c254, 0xffffffff, 0x00000100,
1263 0x3c258, 0xffffffff, 0x00000100,
1264 0x3c25c, 0xffffffff, 0x00000100,
1265 0x3c260, 0xffffffff, 0x00000100,
1266 0x3c27c, 0xffffffff, 0x00000100,
1267 0x3c278, 0xffffffff, 0x00000100,
1268 0x3c210, 0xffffffff, 0x06000100,
1269 0x3c290, 0xffffffff, 0x00000100,
1270 0x3c274, 0xffffffff, 0x00000100,
1271 0x3c2b4, 0xffffffff, 0x00000100,
1272 0x3c2b0, 0xffffffff, 0x00000100,
1273 0x3c270, 0xffffffff, 0x00000100,
1274 0x30800, 0xffffffff, 0xe0000000,
1275 0x3c020, 0xffffffff, 0x00010000,
1276 0x3c024, 0xffffffff, 0x00030002,
1277 0x3c028, 0xffffffff, 0x00040007,
1278 0x3c02c, 0xffffffff, 0x00060005,
1279 0x3c030, 0xffffffff, 0x00090008,
1280 0x3c034, 0xffffffff, 0x00010000,
1281 0x3c038, 0xffffffff, 0x00030002,
1282 0x3c03c, 0xffffffff, 0x00040007,
1283 0x3c040, 0xffffffff, 0x00060005,
1284 0x3c044, 0xffffffff, 0x00090008,
1285 0x3c000, 0xffffffff, 0x96e00200,
1286 0x8708, 0xffffffff, 0x00900100,
1287 0xc424, 0xffffffff, 0x0020003f,
1288 0x38, 0xffffffff, 0x0140001c,
1289 0x3c, 0x000f0000, 0x000f0000,
1290 0x220, 0xffffffff, 0xC060000C,
1291 0x224, 0xc0000fff, 0x00000100,
1292 0x20a8, 0xffffffff, 0x00000104,
1293 0x55e4, 0xff000fff, 0x00000100,
1294 0x30cc, 0xc0000fff, 0x00000104,
1295 0xc1e4, 0x00000001, 0x00000001,
1296 0xd00c, 0xff000ff0, 0x00000100,
1297 0xd80c, 0xff000ff0, 0x00000100
1298};
1299
1300static void cik_init_golden_registers(struct radeon_device *rdev)
1301{
1302 switch (rdev->family) {
1303 case CHIP_BONAIRE:
1304 radeon_program_register_sequence(rdev,
1305 bonaire_mgcg_cgcg_init,
1306 (const u32)ARRAY_SIZE(bonaire_mgcg_cgcg_init));
1307 radeon_program_register_sequence(rdev,
1308 bonaire_golden_registers,
1309 (const u32)ARRAY_SIZE(bonaire_golden_registers));
1310 radeon_program_register_sequence(rdev,
1311 bonaire_golden_common_registers,
1312 (const u32)ARRAY_SIZE(bonaire_golden_common_registers));
1313 radeon_program_register_sequence(rdev,
1314 bonaire_golden_spm_registers,
1315 (const u32)ARRAY_SIZE(bonaire_golden_spm_registers));
1316 break;
1317 case CHIP_KABINI:
1318 radeon_program_register_sequence(rdev,
1319 kalindi_mgcg_cgcg_init,
1320 (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
1321 radeon_program_register_sequence(rdev,
1322 kalindi_golden_registers,
1323 (const u32)ARRAY_SIZE(kalindi_golden_registers));
1324 radeon_program_register_sequence(rdev,
1325 kalindi_golden_common_registers,
1326 (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
1327 radeon_program_register_sequence(rdev,
1328 kalindi_golden_spm_registers,
1329 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
1330 break;
1331 case CHIP_KAVERI:
1332 radeon_program_register_sequence(rdev,
1333 spectre_mgcg_cgcg_init,
1334 (const u32)ARRAY_SIZE(spectre_mgcg_cgcg_init));
1335 radeon_program_register_sequence(rdev,
1336 spectre_golden_registers,
1337 (const u32)ARRAY_SIZE(spectre_golden_registers));
1338 radeon_program_register_sequence(rdev,
1339 spectre_golden_common_registers,
1340 (const u32)ARRAY_SIZE(spectre_golden_common_registers));
1341 radeon_program_register_sequence(rdev,
1342 spectre_golden_spm_registers,
1343 (const u32)ARRAY_SIZE(spectre_golden_spm_registers));
1344 break;
1345 default:
1346 break;
1347 }
1348}
1349
Alex Deucher2c679122013-04-09 13:32:18 -04001350/**
1351 * cik_get_xclk - get the xclk
1352 *
1353 * @rdev: radeon_device pointer
1354 *
1355 * Returns the reference clock used by the gfx engine
1356 * (CIK).
1357 */
1358u32 cik_get_xclk(struct radeon_device *rdev)
1359{
1360 u32 reference_clock = rdev->clock.spll.reference_freq;
1361
1362 if (rdev->flags & RADEON_IS_IGP) {
1363 if (RREG32_SMC(GENERAL_PWRMGT) & GPU_COUNTER_CLK)
1364 return reference_clock / 2;
1365 } else {
1366 if (RREG32_SMC(CG_CLKPIN_CNTL) & XTALIN_DIVIDE)
1367 return reference_clock / 4;
1368 }
1369 return reference_clock;
1370}
1371
Alex Deucher75efdee2013-03-04 12:47:46 -05001372/**
1373 * cik_mm_rdoorbell - read a doorbell dword
1374 *
1375 * @rdev: radeon_device pointer
1376 * @offset: byte offset into the aperture
1377 *
1378 * Returns the value in the doorbell aperture at the
1379 * requested offset (CIK).
1380 */
1381u32 cik_mm_rdoorbell(struct radeon_device *rdev, u32 offset)
1382{
1383 if (offset < rdev->doorbell.size) {
1384 return readl(((void __iomem *)rdev->doorbell.ptr) + offset);
1385 } else {
1386 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", offset);
1387 return 0;
1388 }
1389}
1390
1391/**
1392 * cik_mm_wdoorbell - write a doorbell dword
1393 *
1394 * @rdev: radeon_device pointer
1395 * @offset: byte offset into the aperture
1396 * @v: value to write
1397 *
1398 * Writes @v to the doorbell aperture at the
1399 * requested offset (CIK).
1400 */
1401void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v)
1402{
1403 if (offset < rdev->doorbell.size) {
1404 writel(v, ((void __iomem *)rdev->doorbell.ptr) + offset);
1405 } else {
1406 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", offset);
1407 }
1408}
1409
Alex Deucherbc8273f2012-06-29 19:44:04 -04001410#define BONAIRE_IO_MC_REGS_SIZE 36
1411
1412static const u32 bonaire_io_mc_regs[BONAIRE_IO_MC_REGS_SIZE][2] =
1413{
1414 {0x00000070, 0x04400000},
1415 {0x00000071, 0x80c01803},
1416 {0x00000072, 0x00004004},
1417 {0x00000073, 0x00000100},
1418 {0x00000074, 0x00ff0000},
1419 {0x00000075, 0x34000000},
1420 {0x00000076, 0x08000014},
1421 {0x00000077, 0x00cc08ec},
1422 {0x00000078, 0x00000400},
1423 {0x00000079, 0x00000000},
1424 {0x0000007a, 0x04090000},
1425 {0x0000007c, 0x00000000},
1426 {0x0000007e, 0x4408a8e8},
1427 {0x0000007f, 0x00000304},
1428 {0x00000080, 0x00000000},
1429 {0x00000082, 0x00000001},
1430 {0x00000083, 0x00000002},
1431 {0x00000084, 0xf3e4f400},
1432 {0x00000085, 0x052024e3},
1433 {0x00000087, 0x00000000},
1434 {0x00000088, 0x01000000},
1435 {0x0000008a, 0x1c0a0000},
1436 {0x0000008b, 0xff010000},
1437 {0x0000008d, 0xffffefff},
1438 {0x0000008e, 0xfff3efff},
1439 {0x0000008f, 0xfff3efbf},
1440 {0x00000092, 0xf7ffffff},
1441 {0x00000093, 0xffffff7f},
1442 {0x00000095, 0x00101101},
1443 {0x00000096, 0x00000fff},
1444 {0x00000097, 0x00116fff},
1445 {0x00000098, 0x60010000},
1446 {0x00000099, 0x10010000},
1447 {0x0000009a, 0x00006000},
1448 {0x0000009b, 0x00001000},
1449 {0x0000009f, 0x00b48000}
1450};
1451
Alex Deucherb556b122013-01-29 10:44:22 -05001452/**
1453 * cik_srbm_select - select specific register instances
1454 *
1455 * @rdev: radeon_device pointer
1456 * @me: selected ME (micro engine)
1457 * @pipe: pipe
1458 * @queue: queue
1459 * @vmid: VMID
1460 *
1461 * Switches the currently active registers instances. Some
1462 * registers are instanced per VMID, others are instanced per
1463 * me/pipe/queue combination.
1464 */
1465static void cik_srbm_select(struct radeon_device *rdev,
1466 u32 me, u32 pipe, u32 queue, u32 vmid)
1467{
1468 u32 srbm_gfx_cntl = (PIPEID(pipe & 0x3) |
1469 MEID(me & 0x3) |
1470 VMID(vmid & 0xf) |
1471 QUEUEID(queue & 0x7));
1472 WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl);
1473}
1474
Alex Deucherbc8273f2012-06-29 19:44:04 -04001475/* ucode loading */
1476/**
1477 * ci_mc_load_microcode - load MC ucode into the hw
1478 *
1479 * @rdev: radeon_device pointer
1480 *
1481 * Load the GDDR MC ucode into the hw (CIK).
1482 * Returns 0 on success, error on failure.
1483 */
1484static int ci_mc_load_microcode(struct radeon_device *rdev)
1485{
1486 const __be32 *fw_data;
1487 u32 running, blackout = 0;
1488 u32 *io_mc_regs;
1489 int i, ucode_size, regs_size;
1490
1491 if (!rdev->mc_fw)
1492 return -EINVAL;
1493
1494 switch (rdev->family) {
1495 case CHIP_BONAIRE:
1496 default:
1497 io_mc_regs = (u32 *)&bonaire_io_mc_regs;
1498 ucode_size = CIK_MC_UCODE_SIZE;
1499 regs_size = BONAIRE_IO_MC_REGS_SIZE;
1500 break;
1501 }
1502
1503 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1504
1505 if (running == 0) {
1506 if (running) {
1507 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
1508 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
1509 }
1510
1511 /* reset the engine and set to writable */
1512 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1513 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1514
1515 /* load mc io regs */
1516 for (i = 0; i < regs_size; i++) {
1517 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1518 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1519 }
1520 /* load the MC ucode */
1521 fw_data = (const __be32 *)rdev->mc_fw->data;
1522 for (i = 0; i < ucode_size; i++)
1523 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1524
1525 /* put the engine back into the active state */
1526 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1527 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1528 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1529
1530 /* wait for training to complete */
1531 for (i = 0; i < rdev->usec_timeout; i++) {
1532 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1533 break;
1534 udelay(1);
1535 }
1536 for (i = 0; i < rdev->usec_timeout; i++) {
1537 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1538 break;
1539 udelay(1);
1540 }
1541
1542 if (running)
1543 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1544 }
1545
1546 return 0;
1547}
1548
Alex Deucher02c81322012-12-18 21:43:07 -05001549/**
1550 * cik_init_microcode - load ucode images from disk
1551 *
1552 * @rdev: radeon_device pointer
1553 *
1554 * Use the firmware interface to load the ucode images into
1555 * the driver (not loaded into hw).
1556 * Returns 0 on success, error on failure.
1557 */
1558static int cik_init_microcode(struct radeon_device *rdev)
1559{
Alex Deucher02c81322012-12-18 21:43:07 -05001560 const char *chip_name;
1561 size_t pfp_req_size, me_req_size, ce_req_size,
Alex Deucher21a93e12013-04-09 12:47:11 -04001562 mec_req_size, rlc_req_size, mc_req_size,
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001563 sdma_req_size, smc_req_size;
Alex Deucher02c81322012-12-18 21:43:07 -05001564 char fw_name[30];
1565 int err;
1566
1567 DRM_DEBUG("\n");
1568
Alex Deucher02c81322012-12-18 21:43:07 -05001569 switch (rdev->family) {
1570 case CHIP_BONAIRE:
1571 chip_name = "BONAIRE";
1572 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1573 me_req_size = CIK_ME_UCODE_SIZE * 4;
1574 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1575 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1576 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
1577 mc_req_size = CIK_MC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001578 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001579 smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
Alex Deucher02c81322012-12-18 21:43:07 -05001580 break;
1581 case CHIP_KAVERI:
1582 chip_name = "KAVERI";
1583 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1584 me_req_size = CIK_ME_UCODE_SIZE * 4;
1585 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1586 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1587 rlc_req_size = KV_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001588 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucher02c81322012-12-18 21:43:07 -05001589 break;
1590 case CHIP_KABINI:
1591 chip_name = "KABINI";
1592 pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1593 me_req_size = CIK_ME_UCODE_SIZE * 4;
1594 ce_req_size = CIK_CE_UCODE_SIZE * 4;
1595 mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1596 rlc_req_size = KB_RLC_UCODE_SIZE * 4;
Alex Deucher21a93e12013-04-09 12:47:11 -04001597 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
Alex Deucher02c81322012-12-18 21:43:07 -05001598 break;
1599 default: BUG();
1600 }
1601
1602 DRM_INFO("Loading %s Microcode\n", chip_name);
1603
1604 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001605 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001606 if (err)
1607 goto out;
1608 if (rdev->pfp_fw->size != pfp_req_size) {
1609 printk(KERN_ERR
1610 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
1611 rdev->pfp_fw->size, fw_name);
1612 err = -EINVAL;
1613 goto out;
1614 }
1615
1616 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001617 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001618 if (err)
1619 goto out;
1620 if (rdev->me_fw->size != me_req_size) {
1621 printk(KERN_ERR
1622 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
1623 rdev->me_fw->size, fw_name);
1624 err = -EINVAL;
1625 }
1626
1627 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001628 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001629 if (err)
1630 goto out;
1631 if (rdev->ce_fw->size != ce_req_size) {
1632 printk(KERN_ERR
1633 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
1634 rdev->ce_fw->size, fw_name);
1635 err = -EINVAL;
1636 }
1637
1638 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001639 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001640 if (err)
1641 goto out;
1642 if (rdev->mec_fw->size != mec_req_size) {
1643 printk(KERN_ERR
1644 "cik_cp: Bogus length %zu in firmware \"%s\"\n",
1645 rdev->mec_fw->size, fw_name);
1646 err = -EINVAL;
1647 }
1648
1649 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001650 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001651 if (err)
1652 goto out;
1653 if (rdev->rlc_fw->size != rlc_req_size) {
1654 printk(KERN_ERR
1655 "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
1656 rdev->rlc_fw->size, fw_name);
1657 err = -EINVAL;
1658 }
1659
Alex Deucher21a93e12013-04-09 12:47:11 -04001660 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001661 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
Alex Deucher21a93e12013-04-09 12:47:11 -04001662 if (err)
1663 goto out;
1664 if (rdev->sdma_fw->size != sdma_req_size) {
1665 printk(KERN_ERR
1666 "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
1667 rdev->sdma_fw->size, fw_name);
1668 err = -EINVAL;
1669 }
1670
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001671 /* No SMC, MC ucode on APUs */
Alex Deucher02c81322012-12-18 21:43:07 -05001672 if (!(rdev->flags & RADEON_IS_IGP)) {
1673 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
Jerome Glisse0a168932013-07-11 15:53:01 -04001674 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
Alex Deucher02c81322012-12-18 21:43:07 -05001675 if (err)
1676 goto out;
1677 if (rdev->mc_fw->size != mc_req_size) {
1678 printk(KERN_ERR
1679 "cik_mc: Bogus length %zu in firmware \"%s\"\n",
1680 rdev->mc_fw->size, fw_name);
1681 err = -EINVAL;
1682 }
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001683
1684 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
1685 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1686 if (err) {
1687 printk(KERN_ERR
1688 "smc: error loading firmware \"%s\"\n",
1689 fw_name);
1690 release_firmware(rdev->smc_fw);
1691 rdev->smc_fw = NULL;
Alex Deucherd30d71e2013-10-16 11:40:48 -04001692 err = 0;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001693 } else if (rdev->smc_fw->size != smc_req_size) {
1694 printk(KERN_ERR
1695 "cik_smc: Bogus length %zu in firmware \"%s\"\n",
1696 rdev->smc_fw->size, fw_name);
1697 err = -EINVAL;
1698 }
Alex Deucher02c81322012-12-18 21:43:07 -05001699 }
1700
1701out:
Alex Deucher02c81322012-12-18 21:43:07 -05001702 if (err) {
1703 if (err != -EINVAL)
1704 printk(KERN_ERR
1705 "cik_cp: Failed to load firmware \"%s\"\n",
1706 fw_name);
1707 release_firmware(rdev->pfp_fw);
1708 rdev->pfp_fw = NULL;
1709 release_firmware(rdev->me_fw);
1710 rdev->me_fw = NULL;
1711 release_firmware(rdev->ce_fw);
1712 rdev->ce_fw = NULL;
1713 release_firmware(rdev->rlc_fw);
1714 rdev->rlc_fw = NULL;
1715 release_firmware(rdev->mc_fw);
1716 rdev->mc_fw = NULL;
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04001717 release_firmware(rdev->smc_fw);
1718 rdev->smc_fw = NULL;
Alex Deucher02c81322012-12-18 21:43:07 -05001719 }
1720 return err;
1721}
1722
Alex Deucher8cc1a532013-04-09 12:41:24 -04001723/*
1724 * Core functions
1725 */
1726/**
1727 * cik_tiling_mode_table_init - init the hw tiling table
1728 *
1729 * @rdev: radeon_device pointer
1730 *
1731 * Starting with SI, the tiling setup is done globally in a
1732 * set of 32 tiling modes. Rather than selecting each set of
1733 * parameters per surface as on older asics, we just select
1734 * which index in the tiling table we want to use, and the
1735 * surface uses those parameters (CIK).
1736 */
1737static void cik_tiling_mode_table_init(struct radeon_device *rdev)
1738{
1739 const u32 num_tile_mode_states = 32;
1740 const u32 num_secondary_tile_mode_states = 16;
1741 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
1742 u32 num_pipe_configs;
1743 u32 num_rbs = rdev->config.cik.max_backends_per_se *
1744 rdev->config.cik.max_shader_engines;
1745
1746 switch (rdev->config.cik.mem_row_size_in_kb) {
1747 case 1:
1748 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
1749 break;
1750 case 2:
1751 default:
1752 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
1753 break;
1754 case 4:
1755 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
1756 break;
1757 }
1758
1759 num_pipe_configs = rdev->config.cik.max_tile_pipes;
1760 if (num_pipe_configs > 8)
1761 num_pipe_configs = 8; /* ??? */
1762
1763 if (num_pipe_configs == 8) {
1764 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
1765 switch (reg_offset) {
1766 case 0:
1767 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1768 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1769 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1770 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
1771 break;
1772 case 1:
1773 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1774 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1775 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1776 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
1777 break;
1778 case 2:
1779 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1780 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1781 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1782 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
1783 break;
1784 case 3:
1785 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1786 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1787 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1788 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
1789 break;
1790 case 4:
1791 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1792 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1793 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1794 TILE_SPLIT(split_equal_to_row_size));
1795 break;
1796 case 5:
1797 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1798 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1799 break;
1800 case 6:
1801 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
1802 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1803 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1804 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
1805 break;
1806 case 7:
1807 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
1808 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1809 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1810 TILE_SPLIT(split_equal_to_row_size));
1811 break;
1812 case 8:
1813 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
1814 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
1815 break;
1816 case 9:
1817 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1818 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
1819 break;
1820 case 10:
1821 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1822 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1823 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1824 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1825 break;
1826 case 11:
1827 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1828 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1829 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1830 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1831 break;
1832 case 12:
1833 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
1834 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1835 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1836 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1837 break;
1838 case 13:
1839 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1840 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
1841 break;
1842 case 14:
1843 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1844 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1845 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1846 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1847 break;
1848 case 16:
1849 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1850 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1851 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1852 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1853 break;
1854 case 17:
1855 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
1856 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1857 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1858 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1859 break;
1860 case 27:
1861 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1862 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
1863 break;
1864 case 28:
1865 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1866 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
1867 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1868 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1869 break;
1870 case 29:
1871 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1872 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
1873 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1874 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1875 break;
1876 case 30:
1877 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
1878 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
1879 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
1880 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1881 break;
1882 default:
1883 gb_tile_moden = 0;
1884 break;
1885 }
Alex Deucher39aee492013-04-10 13:41:25 -04001886 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04001887 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
1888 }
1889 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
1890 switch (reg_offset) {
1891 case 0:
1892 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1893 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1894 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
1895 NUM_BANKS(ADDR_SURF_16_BANK));
1896 break;
1897 case 1:
1898 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1899 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1900 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
1901 NUM_BANKS(ADDR_SURF_16_BANK));
1902 break;
1903 case 2:
1904 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1905 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1906 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
1907 NUM_BANKS(ADDR_SURF_16_BANK));
1908 break;
1909 case 3:
1910 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1911 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1912 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
1913 NUM_BANKS(ADDR_SURF_16_BANK));
1914 break;
1915 case 4:
1916 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1917 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1918 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1919 NUM_BANKS(ADDR_SURF_8_BANK));
1920 break;
1921 case 5:
1922 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1923 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1924 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1925 NUM_BANKS(ADDR_SURF_4_BANK));
1926 break;
1927 case 6:
1928 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1929 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1930 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1931 NUM_BANKS(ADDR_SURF_2_BANK));
1932 break;
1933 case 8:
1934 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1935 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
1936 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
1937 NUM_BANKS(ADDR_SURF_16_BANK));
1938 break;
1939 case 9:
1940 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1941 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1942 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
1943 NUM_BANKS(ADDR_SURF_16_BANK));
1944 break;
1945 case 10:
1946 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1947 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1948 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
1949 NUM_BANKS(ADDR_SURF_16_BANK));
1950 break;
1951 case 11:
1952 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1953 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1954 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
1955 NUM_BANKS(ADDR_SURF_16_BANK));
1956 break;
1957 case 12:
1958 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1959 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1960 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1961 NUM_BANKS(ADDR_SURF_8_BANK));
1962 break;
1963 case 13:
1964 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1965 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1966 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1967 NUM_BANKS(ADDR_SURF_4_BANK));
1968 break;
1969 case 14:
1970 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1971 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1972 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
1973 NUM_BANKS(ADDR_SURF_2_BANK));
1974 break;
1975 default:
1976 gb_tile_moden = 0;
1977 break;
1978 }
1979 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
1980 }
1981 } else if (num_pipe_configs == 4) {
1982 if (num_rbs == 4) {
1983 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
1984 switch (reg_offset) {
1985 case 0:
1986 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1987 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1988 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
1989 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
1990 break;
1991 case 1:
1992 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1993 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
1994 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
1995 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
1996 break;
1997 case 2:
1998 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1999 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2000 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2001 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2002 break;
2003 case 3:
2004 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2005 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2006 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2007 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2008 break;
2009 case 4:
2010 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2011 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2012 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2013 TILE_SPLIT(split_equal_to_row_size));
2014 break;
2015 case 5:
2016 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2017 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2018 break;
2019 case 6:
2020 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2021 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2022 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2023 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2024 break;
2025 case 7:
2026 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2027 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2028 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2029 TILE_SPLIT(split_equal_to_row_size));
2030 break;
2031 case 8:
2032 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2033 PIPE_CONFIG(ADDR_SURF_P4_16x16));
2034 break;
2035 case 9:
2036 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2037 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2038 break;
2039 case 10:
2040 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2041 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2042 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2043 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2044 break;
2045 case 11:
2046 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2047 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2048 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2049 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2050 break;
2051 case 12:
2052 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2053 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2054 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2055 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2056 break;
2057 case 13:
2058 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2059 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2060 break;
2061 case 14:
2062 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2063 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2064 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2065 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2066 break;
2067 case 16:
2068 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2069 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2070 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2071 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2072 break;
2073 case 17:
2074 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2075 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2076 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2077 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2078 break;
2079 case 27:
2080 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2081 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2082 break;
2083 case 28:
2084 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2085 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2086 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2087 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2088 break;
2089 case 29:
2090 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2091 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2092 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2093 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2094 break;
2095 case 30:
2096 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2097 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2098 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2099 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2100 break;
2101 default:
2102 gb_tile_moden = 0;
2103 break;
2104 }
Alex Deucher39aee492013-04-10 13:41:25 -04002105 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002106 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2107 }
2108 } else if (num_rbs < 4) {
2109 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2110 switch (reg_offset) {
2111 case 0:
2112 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2113 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2114 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2115 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2116 break;
2117 case 1:
2118 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2119 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2120 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2121 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2122 break;
2123 case 2:
2124 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2125 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2126 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2127 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2128 break;
2129 case 3:
2130 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2131 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2132 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2133 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2134 break;
2135 case 4:
2136 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2137 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2138 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2139 TILE_SPLIT(split_equal_to_row_size));
2140 break;
2141 case 5:
2142 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2143 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2144 break;
2145 case 6:
2146 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2147 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2148 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2149 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2150 break;
2151 case 7:
2152 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2153 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2154 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2155 TILE_SPLIT(split_equal_to_row_size));
2156 break;
2157 case 8:
2158 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2159 PIPE_CONFIG(ADDR_SURF_P4_8x16));
2160 break;
2161 case 9:
2162 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2163 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2164 break;
2165 case 10:
2166 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2167 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2168 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2169 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2170 break;
2171 case 11:
2172 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2173 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2174 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2175 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2176 break;
2177 case 12:
2178 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2179 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2180 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2181 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2182 break;
2183 case 13:
2184 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2185 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2186 break;
2187 case 14:
2188 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2189 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2190 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2191 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2192 break;
2193 case 16:
2194 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2195 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2196 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2197 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2198 break;
2199 case 17:
2200 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2201 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2202 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2203 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2204 break;
2205 case 27:
2206 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2207 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2208 break;
2209 case 28:
2210 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2211 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2212 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2213 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2214 break;
2215 case 29:
2216 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2217 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2218 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2219 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2220 break;
2221 case 30:
2222 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2223 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2224 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2225 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2226 break;
2227 default:
2228 gb_tile_moden = 0;
2229 break;
2230 }
Alex Deucher39aee492013-04-10 13:41:25 -04002231 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002232 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2233 }
2234 }
2235 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2236 switch (reg_offset) {
2237 case 0:
2238 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2239 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2240 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2241 NUM_BANKS(ADDR_SURF_16_BANK));
2242 break;
2243 case 1:
2244 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2245 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2246 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2247 NUM_BANKS(ADDR_SURF_16_BANK));
2248 break;
2249 case 2:
2250 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2251 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2252 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2253 NUM_BANKS(ADDR_SURF_16_BANK));
2254 break;
2255 case 3:
2256 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2257 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2258 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2259 NUM_BANKS(ADDR_SURF_16_BANK));
2260 break;
2261 case 4:
2262 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2263 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2264 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2265 NUM_BANKS(ADDR_SURF_16_BANK));
2266 break;
2267 case 5:
2268 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2269 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2270 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2271 NUM_BANKS(ADDR_SURF_8_BANK));
2272 break;
2273 case 6:
2274 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2275 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2276 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2277 NUM_BANKS(ADDR_SURF_4_BANK));
2278 break;
2279 case 8:
2280 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2281 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2282 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2283 NUM_BANKS(ADDR_SURF_16_BANK));
2284 break;
2285 case 9:
2286 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2287 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2288 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2289 NUM_BANKS(ADDR_SURF_16_BANK));
2290 break;
2291 case 10:
2292 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2293 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2294 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2295 NUM_BANKS(ADDR_SURF_16_BANK));
2296 break;
2297 case 11:
2298 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2299 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2300 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2301 NUM_BANKS(ADDR_SURF_16_BANK));
2302 break;
2303 case 12:
2304 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2305 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2306 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2307 NUM_BANKS(ADDR_SURF_16_BANK));
2308 break;
2309 case 13:
2310 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2311 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2312 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2313 NUM_BANKS(ADDR_SURF_8_BANK));
2314 break;
2315 case 14:
2316 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2317 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2318 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2319 NUM_BANKS(ADDR_SURF_4_BANK));
2320 break;
2321 default:
2322 gb_tile_moden = 0;
2323 break;
2324 }
2325 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2326 }
2327 } else if (num_pipe_configs == 2) {
2328 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2329 switch (reg_offset) {
2330 case 0:
2331 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2332 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2333 PIPE_CONFIG(ADDR_SURF_P2) |
2334 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2335 break;
2336 case 1:
2337 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2338 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2339 PIPE_CONFIG(ADDR_SURF_P2) |
2340 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2341 break;
2342 case 2:
2343 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2344 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2345 PIPE_CONFIG(ADDR_SURF_P2) |
2346 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2347 break;
2348 case 3:
2349 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2350 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2351 PIPE_CONFIG(ADDR_SURF_P2) |
2352 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2353 break;
2354 case 4:
2355 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2356 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2357 PIPE_CONFIG(ADDR_SURF_P2) |
2358 TILE_SPLIT(split_equal_to_row_size));
2359 break;
2360 case 5:
2361 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2362 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2363 break;
2364 case 6:
2365 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2366 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2367 PIPE_CONFIG(ADDR_SURF_P2) |
2368 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2369 break;
2370 case 7:
2371 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2372 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2373 PIPE_CONFIG(ADDR_SURF_P2) |
2374 TILE_SPLIT(split_equal_to_row_size));
2375 break;
2376 case 8:
2377 gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
2378 break;
2379 case 9:
2380 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2381 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2382 break;
2383 case 10:
2384 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2385 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2386 PIPE_CONFIG(ADDR_SURF_P2) |
2387 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2388 break;
2389 case 11:
2390 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2391 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2392 PIPE_CONFIG(ADDR_SURF_P2) |
2393 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2394 break;
2395 case 12:
2396 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2397 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2398 PIPE_CONFIG(ADDR_SURF_P2) |
2399 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2400 break;
2401 case 13:
2402 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2403 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2404 break;
2405 case 14:
2406 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2407 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2408 PIPE_CONFIG(ADDR_SURF_P2) |
2409 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2410 break;
2411 case 16:
2412 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2413 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2414 PIPE_CONFIG(ADDR_SURF_P2) |
2415 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2416 break;
2417 case 17:
2418 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2419 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2420 PIPE_CONFIG(ADDR_SURF_P2) |
2421 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2422 break;
2423 case 27:
2424 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2425 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2426 break;
2427 case 28:
2428 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2429 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2430 PIPE_CONFIG(ADDR_SURF_P2) |
2431 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2432 break;
2433 case 29:
2434 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2435 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2436 PIPE_CONFIG(ADDR_SURF_P2) |
2437 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2438 break;
2439 case 30:
2440 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2441 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2442 PIPE_CONFIG(ADDR_SURF_P2) |
2443 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2444 break;
2445 default:
2446 gb_tile_moden = 0;
2447 break;
2448 }
Alex Deucher39aee492013-04-10 13:41:25 -04002449 rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002450 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2451 }
2452 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2453 switch (reg_offset) {
2454 case 0:
2455 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2456 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2457 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2458 NUM_BANKS(ADDR_SURF_16_BANK));
2459 break;
2460 case 1:
2461 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2462 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2463 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2464 NUM_BANKS(ADDR_SURF_16_BANK));
2465 break;
2466 case 2:
2467 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2468 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2469 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2470 NUM_BANKS(ADDR_SURF_16_BANK));
2471 break;
2472 case 3:
2473 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2474 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2475 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2476 NUM_BANKS(ADDR_SURF_16_BANK));
2477 break;
2478 case 4:
2479 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2480 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2481 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2482 NUM_BANKS(ADDR_SURF_16_BANK));
2483 break;
2484 case 5:
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_4) |
2488 NUM_BANKS(ADDR_SURF_16_BANK));
2489 break;
2490 case 6:
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_2) |
2494 NUM_BANKS(ADDR_SURF_8_BANK));
2495 break;
2496 case 8:
2497 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2498 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2499 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2500 NUM_BANKS(ADDR_SURF_16_BANK));
2501 break;
2502 case 9:
2503 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2504 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2505 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2506 NUM_BANKS(ADDR_SURF_16_BANK));
2507 break;
2508 case 10:
2509 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2510 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2511 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2512 NUM_BANKS(ADDR_SURF_16_BANK));
2513 break;
2514 case 11:
2515 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2516 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2517 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2518 NUM_BANKS(ADDR_SURF_16_BANK));
2519 break;
2520 case 12:
2521 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2522 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2523 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2524 NUM_BANKS(ADDR_SURF_16_BANK));
2525 break;
2526 case 13:
2527 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2528 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2529 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2530 NUM_BANKS(ADDR_SURF_16_BANK));
2531 break;
2532 case 14:
2533 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2534 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2535 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2536 NUM_BANKS(ADDR_SURF_8_BANK));
2537 break;
2538 default:
2539 gb_tile_moden = 0;
2540 break;
2541 }
2542 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2543 }
2544 } else
2545 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
2546}
2547
2548/**
2549 * cik_select_se_sh - select which SE, SH to address
2550 *
2551 * @rdev: radeon_device pointer
2552 * @se_num: shader engine to address
2553 * @sh_num: sh block to address
2554 *
2555 * Select which SE, SH combinations to address. Certain
2556 * registers are instanced per SE or SH. 0xffffffff means
2557 * broadcast to all SEs or SHs (CIK).
2558 */
2559static void cik_select_se_sh(struct radeon_device *rdev,
2560 u32 se_num, u32 sh_num)
2561{
2562 u32 data = INSTANCE_BROADCAST_WRITES;
2563
2564 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
Alex Deucherb0fe3d32013-04-18 16:25:47 -04002565 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002566 else if (se_num == 0xffffffff)
2567 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
2568 else if (sh_num == 0xffffffff)
2569 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
2570 else
2571 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
2572 WREG32(GRBM_GFX_INDEX, data);
2573}
2574
2575/**
2576 * cik_create_bitmask - create a bitmask
2577 *
2578 * @bit_width: length of the mask
2579 *
2580 * create a variable length bit mask (CIK).
2581 * Returns the bitmask.
2582 */
2583static u32 cik_create_bitmask(u32 bit_width)
2584{
2585 u32 i, mask = 0;
2586
2587 for (i = 0; i < bit_width; i++) {
2588 mask <<= 1;
2589 mask |= 1;
2590 }
2591 return mask;
2592}
2593
2594/**
2595 * cik_select_se_sh - select which SE, SH to address
2596 *
2597 * @rdev: radeon_device pointer
2598 * @max_rb_num: max RBs (render backends) for the asic
2599 * @se_num: number of SEs (shader engines) for the asic
2600 * @sh_per_se: number of SH blocks per SE for the asic
2601 *
2602 * Calculates the bitmask of disabled RBs (CIK).
2603 * Returns the disabled RB bitmask.
2604 */
2605static u32 cik_get_rb_disabled(struct radeon_device *rdev,
2606 u32 max_rb_num, u32 se_num,
2607 u32 sh_per_se)
2608{
2609 u32 data, mask;
2610
2611 data = RREG32(CC_RB_BACKEND_DISABLE);
2612 if (data & 1)
2613 data &= BACKEND_DISABLE_MASK;
2614 else
2615 data = 0;
2616 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
2617
2618 data >>= BACKEND_DISABLE_SHIFT;
2619
2620 mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
2621
2622 return data & mask;
2623}
2624
2625/**
2626 * cik_setup_rb - setup the RBs on the asic
2627 *
2628 * @rdev: radeon_device pointer
2629 * @se_num: number of SEs (shader engines) for the asic
2630 * @sh_per_se: number of SH blocks per SE for the asic
2631 * @max_rb_num: max RBs (render backends) for the asic
2632 *
2633 * Configures per-SE/SH RB registers (CIK).
2634 */
2635static void cik_setup_rb(struct radeon_device *rdev,
2636 u32 se_num, u32 sh_per_se,
2637 u32 max_rb_num)
2638{
2639 int i, j;
2640 u32 data, mask;
2641 u32 disabled_rbs = 0;
2642 u32 enabled_rbs = 0;
2643
2644 for (i = 0; i < se_num; i++) {
2645 for (j = 0; j < sh_per_se; j++) {
2646 cik_select_se_sh(rdev, i, j);
2647 data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
2648 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
2649 }
2650 }
2651 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2652
2653 mask = 1;
2654 for (i = 0; i < max_rb_num; i++) {
2655 if (!(disabled_rbs & mask))
2656 enabled_rbs |= mask;
2657 mask <<= 1;
2658 }
2659
2660 for (i = 0; i < se_num; i++) {
2661 cik_select_se_sh(rdev, i, 0xffffffff);
2662 data = 0;
2663 for (j = 0; j < sh_per_se; j++) {
2664 switch (enabled_rbs & 3) {
2665 case 1:
2666 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
2667 break;
2668 case 2:
2669 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
2670 break;
2671 case 3:
2672 default:
2673 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
2674 break;
2675 }
2676 enabled_rbs >>= 2;
2677 }
2678 WREG32(PA_SC_RASTER_CONFIG, data);
2679 }
2680 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2681}
2682
2683/**
2684 * cik_gpu_init - setup the 3D engine
2685 *
2686 * @rdev: radeon_device pointer
2687 *
2688 * Configures the 3D engine and tiling configuration
2689 * registers so that the 3D engine is usable.
2690 */
2691static void cik_gpu_init(struct radeon_device *rdev)
2692{
2693 u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
2694 u32 mc_shared_chmap, mc_arb_ramcfg;
2695 u32 hdp_host_path_cntl;
2696 u32 tmp;
2697 int i, j;
2698
2699 switch (rdev->family) {
2700 case CHIP_BONAIRE:
2701 rdev->config.cik.max_shader_engines = 2;
2702 rdev->config.cik.max_tile_pipes = 4;
2703 rdev->config.cik.max_cu_per_sh = 7;
2704 rdev->config.cik.max_sh_per_se = 1;
2705 rdev->config.cik.max_backends_per_se = 2;
2706 rdev->config.cik.max_texture_channel_caches = 4;
2707 rdev->config.cik.max_gprs = 256;
2708 rdev->config.cik.max_gs_threads = 32;
2709 rdev->config.cik.max_hw_contexts = 8;
2710
2711 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
2712 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
2713 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
2714 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
2715 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
2716 break;
Alex Deucherb4960382013-08-06 15:42:49 -04002717 case CHIP_HAWAII:
2718 rdev->config.cik.max_shader_engines = 4;
2719 rdev->config.cik.max_tile_pipes = 16;
2720 rdev->config.cik.max_cu_per_sh = 11;
2721 rdev->config.cik.max_sh_per_se = 1;
2722 rdev->config.cik.max_backends_per_se = 4;
2723 rdev->config.cik.max_texture_channel_caches = 16;
2724 rdev->config.cik.max_gprs = 256;
2725 rdev->config.cik.max_gs_threads = 32;
2726 rdev->config.cik.max_hw_contexts = 8;
2727
2728 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
2729 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
2730 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
2731 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
2732 gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
2733 break;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002734 case CHIP_KAVERI:
Alex Deucherb2e4c702013-06-10 15:18:26 -04002735 rdev->config.cik.max_shader_engines = 1;
2736 rdev->config.cik.max_tile_pipes = 4;
2737 if ((rdev->pdev->device == 0x1304) ||
2738 (rdev->pdev->device == 0x1305) ||
2739 (rdev->pdev->device == 0x130C) ||
2740 (rdev->pdev->device == 0x130F) ||
2741 (rdev->pdev->device == 0x1310) ||
2742 (rdev->pdev->device == 0x1311) ||
2743 (rdev->pdev->device == 0x131C)) {
2744 rdev->config.cik.max_cu_per_sh = 8;
2745 rdev->config.cik.max_backends_per_se = 2;
2746 } else if ((rdev->pdev->device == 0x1309) ||
2747 (rdev->pdev->device == 0x130A) ||
2748 (rdev->pdev->device == 0x130D) ||
Alex Deucher7c4622d2013-09-04 16:46:07 -04002749 (rdev->pdev->device == 0x1313) ||
2750 (rdev->pdev->device == 0x131D)) {
Alex Deucherb2e4c702013-06-10 15:18:26 -04002751 rdev->config.cik.max_cu_per_sh = 6;
2752 rdev->config.cik.max_backends_per_se = 2;
2753 } else if ((rdev->pdev->device == 0x1306) ||
2754 (rdev->pdev->device == 0x1307) ||
2755 (rdev->pdev->device == 0x130B) ||
2756 (rdev->pdev->device == 0x130E) ||
2757 (rdev->pdev->device == 0x1315) ||
2758 (rdev->pdev->device == 0x131B)) {
2759 rdev->config.cik.max_cu_per_sh = 4;
2760 rdev->config.cik.max_backends_per_se = 1;
2761 } else {
2762 rdev->config.cik.max_cu_per_sh = 3;
2763 rdev->config.cik.max_backends_per_se = 1;
2764 }
2765 rdev->config.cik.max_sh_per_se = 1;
2766 rdev->config.cik.max_texture_channel_caches = 4;
2767 rdev->config.cik.max_gprs = 256;
2768 rdev->config.cik.max_gs_threads = 16;
2769 rdev->config.cik.max_hw_contexts = 8;
2770
2771 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
2772 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
2773 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
2774 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
2775 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002776 break;
2777 case CHIP_KABINI:
2778 default:
2779 rdev->config.cik.max_shader_engines = 1;
2780 rdev->config.cik.max_tile_pipes = 2;
2781 rdev->config.cik.max_cu_per_sh = 2;
2782 rdev->config.cik.max_sh_per_se = 1;
2783 rdev->config.cik.max_backends_per_se = 1;
2784 rdev->config.cik.max_texture_channel_caches = 2;
2785 rdev->config.cik.max_gprs = 256;
2786 rdev->config.cik.max_gs_threads = 16;
2787 rdev->config.cik.max_hw_contexts = 8;
2788
2789 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
2790 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
2791 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
2792 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
2793 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
2794 break;
2795 }
2796
2797 /* Initialize HDP */
2798 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2799 WREG32((0x2c14 + j), 0x00000000);
2800 WREG32((0x2c18 + j), 0x00000000);
2801 WREG32((0x2c1c + j), 0x00000000);
2802 WREG32((0x2c20 + j), 0x00000000);
2803 WREG32((0x2c24 + j), 0x00000000);
2804 }
2805
2806 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
2807
2808 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2809
2810 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
2811 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
2812
2813 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
2814 rdev->config.cik.mem_max_burst_length_bytes = 256;
2815 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
2816 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
2817 if (rdev->config.cik.mem_row_size_in_kb > 4)
2818 rdev->config.cik.mem_row_size_in_kb = 4;
2819 /* XXX use MC settings? */
2820 rdev->config.cik.shader_engine_tile_size = 32;
2821 rdev->config.cik.num_gpus = 1;
2822 rdev->config.cik.multi_gpu_tile_size = 64;
2823
2824 /* fix up row size */
2825 gb_addr_config &= ~ROW_SIZE_MASK;
2826 switch (rdev->config.cik.mem_row_size_in_kb) {
2827 case 1:
2828 default:
2829 gb_addr_config |= ROW_SIZE(0);
2830 break;
2831 case 2:
2832 gb_addr_config |= ROW_SIZE(1);
2833 break;
2834 case 4:
2835 gb_addr_config |= ROW_SIZE(2);
2836 break;
2837 }
2838
2839 /* setup tiling info dword. gb_addr_config is not adequate since it does
2840 * not have bank info, so create a custom tiling dword.
2841 * bits 3:0 num_pipes
2842 * bits 7:4 num_banks
2843 * bits 11:8 group_size
2844 * bits 15:12 row_size
2845 */
2846 rdev->config.cik.tile_config = 0;
2847 switch (rdev->config.cik.num_tile_pipes) {
2848 case 1:
2849 rdev->config.cik.tile_config |= (0 << 0);
2850 break;
2851 case 2:
2852 rdev->config.cik.tile_config |= (1 << 0);
2853 break;
2854 case 4:
2855 rdev->config.cik.tile_config |= (2 << 0);
2856 break;
2857 case 8:
2858 default:
2859 /* XXX what about 12? */
2860 rdev->config.cik.tile_config |= (3 << 0);
2861 break;
2862 }
Michel Dänzera5373142013-09-18 15:39:41 +02002863 rdev->config.cik.tile_config |=
2864 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
Alex Deucher8cc1a532013-04-09 12:41:24 -04002865 rdev->config.cik.tile_config |=
2866 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
2867 rdev->config.cik.tile_config |=
2868 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
2869
2870 WREG32(GB_ADDR_CONFIG, gb_addr_config);
2871 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
2872 WREG32(DMIF_ADDR_CALC, gb_addr_config);
Alex Deucher21a93e12013-04-09 12:47:11 -04002873 WREG32(SDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
2874 WREG32(SDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
Christian König87167bb2013-04-09 13:39:21 -04002875 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
2876 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
2877 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
Alex Deucher8cc1a532013-04-09 12:41:24 -04002878
2879 cik_tiling_mode_table_init(rdev);
2880
2881 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
2882 rdev->config.cik.max_sh_per_se,
2883 rdev->config.cik.max_backends_per_se);
2884
2885 /* set HW defaults for 3D engine */
2886 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
2887
2888 WREG32(SX_DEBUG_1, 0x20);
2889
2890 WREG32(TA_CNTL_AUX, 0x00010000);
2891
2892 tmp = RREG32(SPI_CONFIG_CNTL);
2893 tmp |= 0x03000000;
2894 WREG32(SPI_CONFIG_CNTL, tmp);
2895
2896 WREG32(SQ_CONFIG, 1);
2897
2898 WREG32(DB_DEBUG, 0);
2899
2900 tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
2901 tmp |= 0x00000400;
2902 WREG32(DB_DEBUG2, tmp);
2903
2904 tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
2905 tmp |= 0x00020200;
2906 WREG32(DB_DEBUG3, tmp);
2907
2908 tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
2909 tmp |= 0x00018208;
2910 WREG32(CB_HW_CONTROL, tmp);
2911
2912 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
2913
2914 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
2915 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
2916 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
2917 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
2918
2919 WREG32(VGT_NUM_INSTANCES, 1);
2920
2921 WREG32(CP_PERFMON_CNTL, 0);
2922
2923 WREG32(SQ_CONFIG, 0);
2924
2925 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
2926 FORCE_EOV_MAX_REZ_CNT(255)));
2927
2928 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
2929 AUTO_INVLD_EN(ES_AND_GS_AUTO));
2930
2931 WREG32(VGT_GS_VERTEX_REUSE, 16);
2932 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
2933
2934 tmp = RREG32(HDP_MISC_CNTL);
2935 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
2936 WREG32(HDP_MISC_CNTL, tmp);
2937
2938 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
2939 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
2940
2941 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
2942 WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
2943
2944 udelay(50);
2945}
2946
Alex Deucher841cf442012-12-18 21:47:44 -05002947/*
Alex Deucher2cae3bc2012-07-05 11:45:40 -04002948 * GPU scratch registers helpers function.
2949 */
2950/**
2951 * cik_scratch_init - setup driver info for CP scratch regs
2952 *
2953 * @rdev: radeon_device pointer
2954 *
2955 * Set up the number and offset of the CP scratch registers.
2956 * NOTE: use of CP scratch registers is a legacy inferface and
2957 * is not used by default on newer asics (r6xx+). On newer asics,
2958 * memory buffers are used for fences rather than scratch regs.
2959 */
2960static void cik_scratch_init(struct radeon_device *rdev)
2961{
2962 int i;
2963
2964 rdev->scratch.num_reg = 7;
2965 rdev->scratch.reg_base = SCRATCH_REG0;
2966 for (i = 0; i < rdev->scratch.num_reg; i++) {
2967 rdev->scratch.free[i] = true;
2968 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
2969 }
2970}
2971
2972/**
Alex Deucherfbc832c2012-07-20 14:41:35 -04002973 * cik_ring_test - basic gfx ring test
2974 *
2975 * @rdev: radeon_device pointer
2976 * @ring: radeon_ring structure holding ring information
2977 *
2978 * Allocate a scratch register and write to it using the gfx ring (CIK).
2979 * Provides a basic gfx ring test to verify that the ring is working.
2980 * Used by cik_cp_gfx_resume();
2981 * Returns 0 on success, error on failure.
2982 */
2983int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
2984{
2985 uint32_t scratch;
2986 uint32_t tmp = 0;
2987 unsigned i;
2988 int r;
2989
2990 r = radeon_scratch_get(rdev, &scratch);
2991 if (r) {
2992 DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
2993 return r;
2994 }
2995 WREG32(scratch, 0xCAFEDEAD);
2996 r = radeon_ring_lock(rdev, ring, 3);
2997 if (r) {
2998 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
2999 radeon_scratch_free(rdev, scratch);
3000 return r;
3001 }
3002 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
3003 radeon_ring_write(ring, ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2));
3004 radeon_ring_write(ring, 0xDEADBEEF);
3005 radeon_ring_unlock_commit(rdev, ring);
Alex Deucher963e81f2013-06-26 17:37:11 -04003006
Alex Deucherfbc832c2012-07-20 14:41:35 -04003007 for (i = 0; i < rdev->usec_timeout; i++) {
3008 tmp = RREG32(scratch);
3009 if (tmp == 0xDEADBEEF)
3010 break;
3011 DRM_UDELAY(1);
3012 }
3013 if (i < rdev->usec_timeout) {
3014 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
3015 } else {
3016 DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
3017 ring->idx, scratch, tmp);
3018 r = -EINVAL;
3019 }
3020 radeon_scratch_free(rdev, scratch);
3021 return r;
3022}
3023
3024/**
Alex Deucherb07fdd32013-04-11 09:36:17 -04003025 * cik_fence_gfx_ring_emit - emit a fence on the gfx ring
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003026 *
3027 * @rdev: radeon_device pointer
3028 * @fence: radeon fence object
3029 *
3030 * Emits a fence sequnce number on the gfx ring and flushes
3031 * GPU caches.
3032 */
Alex Deucherb07fdd32013-04-11 09:36:17 -04003033void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
3034 struct radeon_fence *fence)
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003035{
3036 struct radeon_ring *ring = &rdev->ring[fence->ring];
3037 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3038
3039 /* EVENT_WRITE_EOP - flush caches, send int */
3040 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3041 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3042 EOP_TC_ACTION_EN |
3043 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3044 EVENT_INDEX(5)));
3045 radeon_ring_write(ring, addr & 0xfffffffc);
3046 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
3047 radeon_ring_write(ring, fence->seq);
3048 radeon_ring_write(ring, 0);
3049 /* HDP flush */
3050 /* We should be using the new WAIT_REG_MEM special op packet here
3051 * but it causes the CP to hang
3052 */
3053 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3054 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
3055 WRITE_DATA_DST_SEL(0)));
3056 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
3057 radeon_ring_write(ring, 0);
3058 radeon_ring_write(ring, 0);
3059}
3060
Alex Deucherb07fdd32013-04-11 09:36:17 -04003061/**
3062 * cik_fence_compute_ring_emit - emit a fence on the compute ring
3063 *
3064 * @rdev: radeon_device pointer
3065 * @fence: radeon fence object
3066 *
3067 * Emits a fence sequnce number on the compute ring and flushes
3068 * GPU caches.
3069 */
3070void cik_fence_compute_ring_emit(struct radeon_device *rdev,
3071 struct radeon_fence *fence)
3072{
3073 struct radeon_ring *ring = &rdev->ring[fence->ring];
3074 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3075
3076 /* RELEASE_MEM - flush caches, send int */
3077 radeon_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
3078 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3079 EOP_TC_ACTION_EN |
3080 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3081 EVENT_INDEX(5)));
3082 radeon_ring_write(ring, DATA_SEL(1) | INT_SEL(2));
3083 radeon_ring_write(ring, addr & 0xfffffffc);
3084 radeon_ring_write(ring, upper_32_bits(addr));
3085 radeon_ring_write(ring, fence->seq);
3086 radeon_ring_write(ring, 0);
3087 /* HDP flush */
3088 /* We should be using the new WAIT_REG_MEM special op packet here
3089 * but it causes the CP to hang
3090 */
3091 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3092 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
3093 WRITE_DATA_DST_SEL(0)));
3094 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
3095 radeon_ring_write(ring, 0);
3096 radeon_ring_write(ring, 0);
3097}
3098
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003099void cik_semaphore_ring_emit(struct radeon_device *rdev,
3100 struct radeon_ring *ring,
3101 struct radeon_semaphore *semaphore,
3102 bool emit_wait)
3103{
3104 uint64_t addr = semaphore->gpu_addr;
3105 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3106
3107 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
3108 radeon_ring_write(ring, addr & 0xffffffff);
3109 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
3110}
3111
Alex Deucherc9dbd702013-10-01 16:36:51 -04003112/**
3113 * cik_copy_cpdma - copy pages using the CP DMA engine
3114 *
3115 * @rdev: radeon_device pointer
3116 * @src_offset: src GPU address
3117 * @dst_offset: dst GPU address
3118 * @num_gpu_pages: number of GPU pages to xfer
3119 * @fence: radeon fence object
3120 *
3121 * Copy GPU paging using the CP DMA engine (CIK+).
3122 * Used by the radeon ttm implementation to move pages if
3123 * registered as the asic copy callback.
3124 */
3125int cik_copy_cpdma(struct radeon_device *rdev,
3126 uint64_t src_offset, uint64_t dst_offset,
3127 unsigned num_gpu_pages,
3128 struct radeon_fence **fence)
3129{
3130 struct radeon_semaphore *sem = NULL;
3131 int ring_index = rdev->asic->copy.blit_ring_index;
3132 struct radeon_ring *ring = &rdev->ring[ring_index];
3133 u32 size_in_bytes, cur_size_in_bytes, control;
3134 int i, num_loops;
3135 int r = 0;
3136
3137 r = radeon_semaphore_create(rdev, &sem);
3138 if (r) {
3139 DRM_ERROR("radeon: moving bo (%d).\n", r);
3140 return r;
3141 }
3142
3143 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3144 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
3145 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 18);
3146 if (r) {
3147 DRM_ERROR("radeon: moving bo (%d).\n", r);
3148 radeon_semaphore_free(rdev, &sem, NULL);
3149 return r;
3150 }
3151
3152 if (radeon_fence_need_sync(*fence, ring->idx)) {
3153 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
3154 ring->idx);
3155 radeon_fence_note_sync(*fence, ring->idx);
3156 } else {
3157 radeon_semaphore_free(rdev, &sem, NULL);
3158 }
3159
3160 for (i = 0; i < num_loops; i++) {
3161 cur_size_in_bytes = size_in_bytes;
3162 if (cur_size_in_bytes > 0x1fffff)
3163 cur_size_in_bytes = 0x1fffff;
3164 size_in_bytes -= cur_size_in_bytes;
3165 control = 0;
3166 if (size_in_bytes == 0)
3167 control |= PACKET3_DMA_DATA_CP_SYNC;
3168 radeon_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
3169 radeon_ring_write(ring, control);
3170 radeon_ring_write(ring, lower_32_bits(src_offset));
3171 radeon_ring_write(ring, upper_32_bits(src_offset));
3172 radeon_ring_write(ring, lower_32_bits(dst_offset));
3173 radeon_ring_write(ring, upper_32_bits(dst_offset));
3174 radeon_ring_write(ring, cur_size_in_bytes);
3175 src_offset += cur_size_in_bytes;
3176 dst_offset += cur_size_in_bytes;
3177 }
3178
3179 r = radeon_fence_emit(rdev, fence, ring->idx);
3180 if (r) {
3181 radeon_ring_unlock_undo(rdev, ring);
3182 return r;
3183 }
3184
3185 radeon_ring_unlock_commit(rdev, ring);
3186 radeon_semaphore_free(rdev, &sem, *fence);
3187
3188 return r;
3189}
3190
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003191/*
3192 * IB stuff
3193 */
3194/**
3195 * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
3196 *
3197 * @rdev: radeon_device pointer
3198 * @ib: radeon indirect buffer object
3199 *
3200 * Emits an DE (drawing engine) or CE (constant engine) IB
3201 * on the gfx ring. IBs are usually generated by userspace
3202 * acceleration drivers and submitted to the kernel for
3203 * sheduling on the ring. This function schedules the IB
3204 * on the gfx ring for execution by the GPU.
3205 */
3206void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3207{
3208 struct radeon_ring *ring = &rdev->ring[ib->ring];
3209 u32 header, control = INDIRECT_BUFFER_VALID;
3210
3211 if (ib->is_const_ib) {
3212 /* set switch buffer packet before const IB */
3213 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
3214 radeon_ring_write(ring, 0);
3215
3216 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
3217 } else {
3218 u32 next_rptr;
3219 if (ring->rptr_save_reg) {
3220 next_rptr = ring->wptr + 3 + 4;
3221 radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
3222 radeon_ring_write(ring, ((ring->rptr_save_reg -
3223 PACKET3_SET_UCONFIG_REG_START) >> 2));
3224 radeon_ring_write(ring, next_rptr);
3225 } else if (rdev->wb.enabled) {
3226 next_rptr = ring->wptr + 5 + 4;
3227 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3228 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
3229 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3230 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
3231 radeon_ring_write(ring, next_rptr);
3232 }
3233
3234 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
3235 }
3236
3237 control |= ib->length_dw |
3238 (ib->vm ? (ib->vm->id << 24) : 0);
3239
3240 radeon_ring_write(ring, header);
3241 radeon_ring_write(ring,
3242#ifdef __BIG_ENDIAN
3243 (2 << 0) |
3244#endif
3245 (ib->gpu_addr & 0xFFFFFFFC));
3246 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
3247 radeon_ring_write(ring, control);
3248}
3249
Alex Deucherfbc832c2012-07-20 14:41:35 -04003250/**
3251 * cik_ib_test - basic gfx ring IB test
3252 *
3253 * @rdev: radeon_device pointer
3254 * @ring: radeon_ring structure holding ring information
3255 *
3256 * Allocate an IB and execute it on the gfx ring (CIK).
3257 * Provides a basic gfx ring test to verify that IBs are working.
3258 * Returns 0 on success, error on failure.
3259 */
3260int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3261{
3262 struct radeon_ib ib;
3263 uint32_t scratch;
3264 uint32_t tmp = 0;
3265 unsigned i;
3266 int r;
3267
3268 r = radeon_scratch_get(rdev, &scratch);
3269 if (r) {
3270 DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
3271 return r;
3272 }
3273 WREG32(scratch, 0xCAFEDEAD);
3274 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
3275 if (r) {
3276 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02003277 radeon_scratch_free(rdev, scratch);
Alex Deucherfbc832c2012-07-20 14:41:35 -04003278 return r;
3279 }
3280 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
3281 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
3282 ib.ptr[2] = 0xDEADBEEF;
3283 ib.length_dw = 3;
3284 r = radeon_ib_schedule(rdev, &ib, NULL);
3285 if (r) {
3286 radeon_scratch_free(rdev, scratch);
3287 radeon_ib_free(rdev, &ib);
3288 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
3289 return r;
3290 }
3291 r = radeon_fence_wait(ib.fence, false);
3292 if (r) {
3293 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
Christian König5510f122013-10-14 11:32:28 +02003294 radeon_scratch_free(rdev, scratch);
3295 radeon_ib_free(rdev, &ib);
Alex Deucherfbc832c2012-07-20 14:41:35 -04003296 return r;
3297 }
3298 for (i = 0; i < rdev->usec_timeout; i++) {
3299 tmp = RREG32(scratch);
3300 if (tmp == 0xDEADBEEF)
3301 break;
3302 DRM_UDELAY(1);
3303 }
3304 if (i < rdev->usec_timeout) {
3305 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
3306 } else {
3307 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
3308 scratch, tmp);
3309 r = -EINVAL;
3310 }
3311 radeon_scratch_free(rdev, scratch);
3312 radeon_ib_free(rdev, &ib);
3313 return r;
3314}
3315
Alex Deucher2cae3bc2012-07-05 11:45:40 -04003316/*
Alex Deucher841cf442012-12-18 21:47:44 -05003317 * CP.
3318 * On CIK, gfx and compute now have independant command processors.
3319 *
3320 * GFX
3321 * Gfx consists of a single ring and can process both gfx jobs and
3322 * compute jobs. The gfx CP consists of three microengines (ME):
3323 * PFP - Pre-Fetch Parser
3324 * ME - Micro Engine
3325 * CE - Constant Engine
3326 * The PFP and ME make up what is considered the Drawing Engine (DE).
3327 * The CE is an asynchronous engine used for updating buffer desciptors
3328 * used by the DE so that they can be loaded into cache in parallel
3329 * while the DE is processing state update packets.
3330 *
3331 * Compute
3332 * The compute CP consists of two microengines (ME):
3333 * MEC1 - Compute MicroEngine 1
3334 * MEC2 - Compute MicroEngine 2
3335 * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
3336 * The queues are exposed to userspace and are programmed directly
3337 * by the compute runtime.
3338 */
3339/**
3340 * cik_cp_gfx_enable - enable/disable the gfx CP MEs
3341 *
3342 * @rdev: radeon_device pointer
3343 * @enable: enable or disable the MEs
3344 *
3345 * Halts or unhalts the gfx MEs.
3346 */
3347static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
3348{
3349 if (enable)
3350 WREG32(CP_ME_CNTL, 0);
3351 else {
3352 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
3353 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3354 }
3355 udelay(50);
3356}
3357
3358/**
3359 * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
3360 *
3361 * @rdev: radeon_device pointer
3362 *
3363 * Loads the gfx PFP, ME, and CE ucode.
3364 * Returns 0 for success, -EINVAL if the ucode is not available.
3365 */
3366static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
3367{
3368 const __be32 *fw_data;
3369 int i;
3370
3371 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
3372 return -EINVAL;
3373
3374 cik_cp_gfx_enable(rdev, false);
3375
3376 /* PFP */
3377 fw_data = (const __be32 *)rdev->pfp_fw->data;
3378 WREG32(CP_PFP_UCODE_ADDR, 0);
3379 for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
3380 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
3381 WREG32(CP_PFP_UCODE_ADDR, 0);
3382
3383 /* CE */
3384 fw_data = (const __be32 *)rdev->ce_fw->data;
3385 WREG32(CP_CE_UCODE_ADDR, 0);
3386 for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
3387 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
3388 WREG32(CP_CE_UCODE_ADDR, 0);
3389
3390 /* ME */
3391 fw_data = (const __be32 *)rdev->me_fw->data;
3392 WREG32(CP_ME_RAM_WADDR, 0);
3393 for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
3394 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
3395 WREG32(CP_ME_RAM_WADDR, 0);
3396
3397 WREG32(CP_PFP_UCODE_ADDR, 0);
3398 WREG32(CP_CE_UCODE_ADDR, 0);
3399 WREG32(CP_ME_RAM_WADDR, 0);
3400 WREG32(CP_ME_RAM_RADDR, 0);
3401 return 0;
3402}
3403
3404/**
3405 * cik_cp_gfx_start - start the gfx ring
3406 *
3407 * @rdev: radeon_device pointer
3408 *
3409 * Enables the ring and loads the clear state context and other
3410 * packets required to init the ring.
3411 * Returns 0 for success, error for failure.
3412 */
3413static int cik_cp_gfx_start(struct radeon_device *rdev)
3414{
3415 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3416 int r, i;
3417
3418 /* init the CP */
3419 WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
3420 WREG32(CP_ENDIAN_SWAP, 0);
3421 WREG32(CP_DEVICE_ID, 1);
3422
3423 cik_cp_gfx_enable(rdev, true);
3424
3425 r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
3426 if (r) {
3427 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3428 return r;
3429 }
3430
3431 /* init the CE partitions. CE only used for gfx on CIK */
3432 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
3433 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
3434 radeon_ring_write(ring, 0xc000);
3435 radeon_ring_write(ring, 0xc000);
3436
3437 /* setup clear context state */
3438 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3439 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3440
3441 radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
3442 radeon_ring_write(ring, 0x80000000);
3443 radeon_ring_write(ring, 0x80000000);
3444
3445 for (i = 0; i < cik_default_size; i++)
3446 radeon_ring_write(ring, cik_default_state[i]);
3447
3448 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3449 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3450
3451 /* set clear context state */
3452 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3453 radeon_ring_write(ring, 0);
3454
3455 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
3456 radeon_ring_write(ring, 0x00000316);
3457 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3458 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
3459
3460 radeon_ring_unlock_commit(rdev, ring);
3461
3462 return 0;
3463}
3464
3465/**
3466 * cik_cp_gfx_fini - stop the gfx ring
3467 *
3468 * @rdev: radeon_device pointer
3469 *
3470 * Stop the gfx ring and tear down the driver ring
3471 * info.
3472 */
3473static void cik_cp_gfx_fini(struct radeon_device *rdev)
3474{
3475 cik_cp_gfx_enable(rdev, false);
3476 radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3477}
3478
3479/**
3480 * cik_cp_gfx_resume - setup the gfx ring buffer registers
3481 *
3482 * @rdev: radeon_device pointer
3483 *
3484 * Program the location and size of the gfx ring buffer
3485 * and test it to make sure it's working.
3486 * Returns 0 for success, error for failure.
3487 */
3488static int cik_cp_gfx_resume(struct radeon_device *rdev)
3489{
3490 struct radeon_ring *ring;
3491 u32 tmp;
3492 u32 rb_bufsz;
3493 u64 rb_addr;
3494 int r;
3495
3496 WREG32(CP_SEM_WAIT_TIMER, 0x0);
3497 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3498
3499 /* Set the write pointer delay */
3500 WREG32(CP_RB_WPTR_DELAY, 0);
3501
3502 /* set the RB to use vmid 0 */
3503 WREG32(CP_RB_VMID, 0);
3504
3505 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3506
3507 /* ring 0 - compute and gfx */
3508 /* Set ring buffer size */
3509 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
Daniel Vetterb72a8922013-07-10 14:11:59 +02003510 rb_bufsz = order_base_2(ring->ring_size / 8);
3511 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
Alex Deucher841cf442012-12-18 21:47:44 -05003512#ifdef __BIG_ENDIAN
3513 tmp |= BUF_SWAP_32BIT;
3514#endif
3515 WREG32(CP_RB0_CNTL, tmp);
3516
3517 /* Initialize the ring buffer's read and write pointers */
3518 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
3519 ring->wptr = 0;
3520 WREG32(CP_RB0_WPTR, ring->wptr);
3521
3522 /* set the wb address wether it's enabled or not */
3523 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
3524 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3525
3526 /* scratch register shadowing is no longer supported */
3527 WREG32(SCRATCH_UMSK, 0);
3528
3529 if (!rdev->wb.enabled)
3530 tmp |= RB_NO_UPDATE;
3531
3532 mdelay(1);
3533 WREG32(CP_RB0_CNTL, tmp);
3534
3535 rb_addr = ring->gpu_addr >> 8;
3536 WREG32(CP_RB0_BASE, rb_addr);
3537 WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
3538
3539 ring->rptr = RREG32(CP_RB0_RPTR);
3540
3541 /* start the ring */
3542 cik_cp_gfx_start(rdev);
3543 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
3544 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3545 if (r) {
3546 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3547 return r;
3548 }
3549 return 0;
3550}
3551
Alex Deucher963e81f2013-06-26 17:37:11 -04003552u32 cik_compute_ring_get_rptr(struct radeon_device *rdev,
3553 struct radeon_ring *ring)
3554{
3555 u32 rptr;
3556
3557
3558
3559 if (rdev->wb.enabled) {
3560 rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]);
3561 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04003562 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003563 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
3564 rptr = RREG32(CP_HQD_PQ_RPTR);
3565 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04003566 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003567 }
Alex Deucher963e81f2013-06-26 17:37:11 -04003568
3569 return rptr;
3570}
3571
3572u32 cik_compute_ring_get_wptr(struct radeon_device *rdev,
3573 struct radeon_ring *ring)
3574{
3575 u32 wptr;
3576
3577 if (rdev->wb.enabled) {
3578 wptr = le32_to_cpu(rdev->wb.wb[ring->wptr_offs/4]);
3579 } else {
Alex Deucherf61d5b462013-08-06 12:40:16 -04003580 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003581 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
3582 wptr = RREG32(CP_HQD_PQ_WPTR);
3583 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04003584 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003585 }
Alex Deucher963e81f2013-06-26 17:37:11 -04003586
3587 return wptr;
3588}
3589
3590void cik_compute_ring_set_wptr(struct radeon_device *rdev,
3591 struct radeon_ring *ring)
3592{
Christian König2e1e6da2013-08-13 11:56:52 +02003593 rdev->wb.wb[ring->wptr_offs/4] = cpu_to_le32(ring->wptr);
3594 WDOORBELL32(ring->doorbell_offset, ring->wptr);
Alex Deucher963e81f2013-06-26 17:37:11 -04003595}
3596
Alex Deucher841cf442012-12-18 21:47:44 -05003597/**
3598 * cik_cp_compute_enable - enable/disable the compute CP MEs
3599 *
3600 * @rdev: radeon_device pointer
3601 * @enable: enable or disable the MEs
3602 *
3603 * Halts or unhalts the compute MEs.
3604 */
3605static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
3606{
3607 if (enable)
3608 WREG32(CP_MEC_CNTL, 0);
3609 else
3610 WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
3611 udelay(50);
3612}
3613
3614/**
3615 * cik_cp_compute_load_microcode - load the compute CP ME ucode
3616 *
3617 * @rdev: radeon_device pointer
3618 *
3619 * Loads the compute MEC1&2 ucode.
3620 * Returns 0 for success, -EINVAL if the ucode is not available.
3621 */
3622static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
3623{
3624 const __be32 *fw_data;
3625 int i;
3626
3627 if (!rdev->mec_fw)
3628 return -EINVAL;
3629
3630 cik_cp_compute_enable(rdev, false);
3631
3632 /* MEC1 */
3633 fw_data = (const __be32 *)rdev->mec_fw->data;
3634 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
3635 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
3636 WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
3637 WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
3638
3639 if (rdev->family == CHIP_KAVERI) {
3640 /* MEC2 */
3641 fw_data = (const __be32 *)rdev->mec_fw->data;
3642 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
3643 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
3644 WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
3645 WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
3646 }
3647
3648 return 0;
3649}
3650
3651/**
3652 * cik_cp_compute_start - start the compute queues
3653 *
3654 * @rdev: radeon_device pointer
3655 *
3656 * Enable the compute queues.
3657 * Returns 0 for success, error for failure.
3658 */
3659static int cik_cp_compute_start(struct radeon_device *rdev)
3660{
Alex Deucher963e81f2013-06-26 17:37:11 -04003661 cik_cp_compute_enable(rdev, true);
3662
Alex Deucher841cf442012-12-18 21:47:44 -05003663 return 0;
3664}
3665
3666/**
3667 * cik_cp_compute_fini - stop the compute queues
3668 *
3669 * @rdev: radeon_device pointer
3670 *
3671 * Stop the compute queues and tear down the driver queue
3672 * info.
3673 */
3674static void cik_cp_compute_fini(struct radeon_device *rdev)
3675{
Alex Deucher963e81f2013-06-26 17:37:11 -04003676 int i, idx, r;
3677
Alex Deucher841cf442012-12-18 21:47:44 -05003678 cik_cp_compute_enable(rdev, false);
Alex Deucher963e81f2013-06-26 17:37:11 -04003679
3680 for (i = 0; i < 2; i++) {
3681 if (i == 0)
3682 idx = CAYMAN_RING_TYPE_CP1_INDEX;
3683 else
3684 idx = CAYMAN_RING_TYPE_CP2_INDEX;
3685
3686 if (rdev->ring[idx].mqd_obj) {
3687 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
3688 if (unlikely(r != 0))
3689 dev_warn(rdev->dev, "(%d) reserve MQD bo failed\n", r);
3690
3691 radeon_bo_unpin(rdev->ring[idx].mqd_obj);
3692 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
3693
3694 radeon_bo_unref(&rdev->ring[idx].mqd_obj);
3695 rdev->ring[idx].mqd_obj = NULL;
3696 }
3697 }
Alex Deucher841cf442012-12-18 21:47:44 -05003698}
3699
Alex Deucher963e81f2013-06-26 17:37:11 -04003700static void cik_mec_fini(struct radeon_device *rdev)
3701{
3702 int r;
3703
3704 if (rdev->mec.hpd_eop_obj) {
3705 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
3706 if (unlikely(r != 0))
3707 dev_warn(rdev->dev, "(%d) reserve HPD EOP bo failed\n", r);
3708 radeon_bo_unpin(rdev->mec.hpd_eop_obj);
3709 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
3710
3711 radeon_bo_unref(&rdev->mec.hpd_eop_obj);
3712 rdev->mec.hpd_eop_obj = NULL;
3713 }
3714}
3715
3716#define MEC_HPD_SIZE 2048
3717
3718static int cik_mec_init(struct radeon_device *rdev)
3719{
3720 int r;
3721 u32 *hpd;
3722
3723 /*
3724 * KV: 2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
3725 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
3726 */
3727 if (rdev->family == CHIP_KAVERI)
3728 rdev->mec.num_mec = 2;
3729 else
3730 rdev->mec.num_mec = 1;
3731 rdev->mec.num_pipe = 4;
3732 rdev->mec.num_queue = rdev->mec.num_mec * rdev->mec.num_pipe * 8;
3733
3734 if (rdev->mec.hpd_eop_obj == NULL) {
3735 r = radeon_bo_create(rdev,
3736 rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
3737 PAGE_SIZE, true,
3738 RADEON_GEM_DOMAIN_GTT, NULL,
3739 &rdev->mec.hpd_eop_obj);
3740 if (r) {
3741 dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
3742 return r;
3743 }
3744 }
3745
3746 r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
3747 if (unlikely(r != 0)) {
3748 cik_mec_fini(rdev);
3749 return r;
3750 }
3751 r = radeon_bo_pin(rdev->mec.hpd_eop_obj, RADEON_GEM_DOMAIN_GTT,
3752 &rdev->mec.hpd_eop_gpu_addr);
3753 if (r) {
3754 dev_warn(rdev->dev, "(%d) pin HDP EOP bo failed\n", r);
3755 cik_mec_fini(rdev);
3756 return r;
3757 }
3758 r = radeon_bo_kmap(rdev->mec.hpd_eop_obj, (void **)&hpd);
3759 if (r) {
3760 dev_warn(rdev->dev, "(%d) map HDP EOP bo failed\n", r);
3761 cik_mec_fini(rdev);
3762 return r;
3763 }
3764
3765 /* clear memory. Not sure if this is required or not */
3766 memset(hpd, 0, rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2);
3767
3768 radeon_bo_kunmap(rdev->mec.hpd_eop_obj);
3769 radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
3770
3771 return 0;
3772}
3773
3774struct hqd_registers
3775{
3776 u32 cp_mqd_base_addr;
3777 u32 cp_mqd_base_addr_hi;
3778 u32 cp_hqd_active;
3779 u32 cp_hqd_vmid;
3780 u32 cp_hqd_persistent_state;
3781 u32 cp_hqd_pipe_priority;
3782 u32 cp_hqd_queue_priority;
3783 u32 cp_hqd_quantum;
3784 u32 cp_hqd_pq_base;
3785 u32 cp_hqd_pq_base_hi;
3786 u32 cp_hqd_pq_rptr;
3787 u32 cp_hqd_pq_rptr_report_addr;
3788 u32 cp_hqd_pq_rptr_report_addr_hi;
3789 u32 cp_hqd_pq_wptr_poll_addr;
3790 u32 cp_hqd_pq_wptr_poll_addr_hi;
3791 u32 cp_hqd_pq_doorbell_control;
3792 u32 cp_hqd_pq_wptr;
3793 u32 cp_hqd_pq_control;
3794 u32 cp_hqd_ib_base_addr;
3795 u32 cp_hqd_ib_base_addr_hi;
3796 u32 cp_hqd_ib_rptr;
3797 u32 cp_hqd_ib_control;
3798 u32 cp_hqd_iq_timer;
3799 u32 cp_hqd_iq_rptr;
3800 u32 cp_hqd_dequeue_request;
3801 u32 cp_hqd_dma_offload;
3802 u32 cp_hqd_sema_cmd;
3803 u32 cp_hqd_msg_type;
3804 u32 cp_hqd_atomic0_preop_lo;
3805 u32 cp_hqd_atomic0_preop_hi;
3806 u32 cp_hqd_atomic1_preop_lo;
3807 u32 cp_hqd_atomic1_preop_hi;
3808 u32 cp_hqd_hq_scheduler0;
3809 u32 cp_hqd_hq_scheduler1;
3810 u32 cp_mqd_control;
3811};
3812
3813struct bonaire_mqd
3814{
3815 u32 header;
3816 u32 dispatch_initiator;
3817 u32 dimensions[3];
3818 u32 start_idx[3];
3819 u32 num_threads[3];
3820 u32 pipeline_stat_enable;
3821 u32 perf_counter_enable;
3822 u32 pgm[2];
3823 u32 tba[2];
3824 u32 tma[2];
3825 u32 pgm_rsrc[2];
3826 u32 vmid;
3827 u32 resource_limits;
3828 u32 static_thread_mgmt01[2];
3829 u32 tmp_ring_size;
3830 u32 static_thread_mgmt23[2];
3831 u32 restart[3];
3832 u32 thread_trace_enable;
3833 u32 reserved1;
3834 u32 user_data[16];
3835 u32 vgtcs_invoke_count[2];
3836 struct hqd_registers queue_state;
3837 u32 dequeue_cntr;
3838 u32 interrupt_queue[64];
3839};
3840
Alex Deucher841cf442012-12-18 21:47:44 -05003841/**
3842 * cik_cp_compute_resume - setup the compute queue registers
3843 *
3844 * @rdev: radeon_device pointer
3845 *
3846 * Program the compute queues and test them to make sure they
3847 * are working.
3848 * Returns 0 for success, error for failure.
3849 */
3850static int cik_cp_compute_resume(struct radeon_device *rdev)
3851{
Alex Deucher963e81f2013-06-26 17:37:11 -04003852 int r, i, idx;
3853 u32 tmp;
3854 bool use_doorbell = true;
3855 u64 hqd_gpu_addr;
3856 u64 mqd_gpu_addr;
3857 u64 eop_gpu_addr;
3858 u64 wb_gpu_addr;
3859 u32 *buf;
3860 struct bonaire_mqd *mqd;
Alex Deucher841cf442012-12-18 21:47:44 -05003861
Alex Deucher841cf442012-12-18 21:47:44 -05003862 r = cik_cp_compute_start(rdev);
3863 if (r)
3864 return r;
Alex Deucher963e81f2013-06-26 17:37:11 -04003865
3866 /* fix up chicken bits */
3867 tmp = RREG32(CP_CPF_DEBUG);
3868 tmp |= (1 << 23);
3869 WREG32(CP_CPF_DEBUG, tmp);
3870
3871 /* init the pipes */
Alex Deucherf61d5b462013-08-06 12:40:16 -04003872 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003873 for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
3874 int me = (i < 4) ? 1 : 2;
3875 int pipe = (i < 4) ? i : (i - 4);
3876
3877 eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE * 2);
3878
3879 cik_srbm_select(rdev, me, pipe, 0, 0);
3880
3881 /* write the EOP addr */
3882 WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
3883 WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
3884
3885 /* set the VMID assigned */
3886 WREG32(CP_HPD_EOP_VMID, 0);
3887
3888 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
3889 tmp = RREG32(CP_HPD_EOP_CONTROL);
3890 tmp &= ~EOP_SIZE_MASK;
Daniel Vetterb72a8922013-07-10 14:11:59 +02003891 tmp |= order_base_2(MEC_HPD_SIZE / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04003892 WREG32(CP_HPD_EOP_CONTROL, tmp);
3893 }
3894 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04003895 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003896
3897 /* init the queues. Just two for now. */
3898 for (i = 0; i < 2; i++) {
3899 if (i == 0)
3900 idx = CAYMAN_RING_TYPE_CP1_INDEX;
3901 else
3902 idx = CAYMAN_RING_TYPE_CP2_INDEX;
3903
3904 if (rdev->ring[idx].mqd_obj == NULL) {
3905 r = radeon_bo_create(rdev,
3906 sizeof(struct bonaire_mqd),
3907 PAGE_SIZE, true,
3908 RADEON_GEM_DOMAIN_GTT, NULL,
3909 &rdev->ring[idx].mqd_obj);
3910 if (r) {
3911 dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
3912 return r;
3913 }
3914 }
3915
3916 r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
3917 if (unlikely(r != 0)) {
3918 cik_cp_compute_fini(rdev);
3919 return r;
3920 }
3921 r = radeon_bo_pin(rdev->ring[idx].mqd_obj, RADEON_GEM_DOMAIN_GTT,
3922 &mqd_gpu_addr);
3923 if (r) {
3924 dev_warn(rdev->dev, "(%d) pin MQD bo failed\n", r);
3925 cik_cp_compute_fini(rdev);
3926 return r;
3927 }
3928 r = radeon_bo_kmap(rdev->ring[idx].mqd_obj, (void **)&buf);
3929 if (r) {
3930 dev_warn(rdev->dev, "(%d) map MQD bo failed\n", r);
3931 cik_cp_compute_fini(rdev);
3932 return r;
3933 }
3934
3935 /* doorbell offset */
3936 rdev->ring[idx].doorbell_offset =
3937 (rdev->ring[idx].doorbell_page_num * PAGE_SIZE) + 0;
3938
3939 /* init the mqd struct */
3940 memset(buf, 0, sizeof(struct bonaire_mqd));
3941
3942 mqd = (struct bonaire_mqd *)buf;
3943 mqd->header = 0xC0310800;
3944 mqd->static_thread_mgmt01[0] = 0xffffffff;
3945 mqd->static_thread_mgmt01[1] = 0xffffffff;
3946 mqd->static_thread_mgmt23[0] = 0xffffffff;
3947 mqd->static_thread_mgmt23[1] = 0xffffffff;
3948
Alex Deucherf61d5b462013-08-06 12:40:16 -04003949 mutex_lock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04003950 cik_srbm_select(rdev, rdev->ring[idx].me,
3951 rdev->ring[idx].pipe,
3952 rdev->ring[idx].queue, 0);
3953
3954 /* disable wptr polling */
3955 tmp = RREG32(CP_PQ_WPTR_POLL_CNTL);
3956 tmp &= ~WPTR_POLL_EN;
3957 WREG32(CP_PQ_WPTR_POLL_CNTL, tmp);
3958
3959 /* enable doorbell? */
3960 mqd->queue_state.cp_hqd_pq_doorbell_control =
3961 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
3962 if (use_doorbell)
3963 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
3964 else
3965 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_EN;
3966 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
3967 mqd->queue_state.cp_hqd_pq_doorbell_control);
3968
3969 /* disable the queue if it's active */
3970 mqd->queue_state.cp_hqd_dequeue_request = 0;
3971 mqd->queue_state.cp_hqd_pq_rptr = 0;
3972 mqd->queue_state.cp_hqd_pq_wptr= 0;
3973 if (RREG32(CP_HQD_ACTIVE) & 1) {
3974 WREG32(CP_HQD_DEQUEUE_REQUEST, 1);
3975 for (i = 0; i < rdev->usec_timeout; i++) {
3976 if (!(RREG32(CP_HQD_ACTIVE) & 1))
3977 break;
3978 udelay(1);
3979 }
3980 WREG32(CP_HQD_DEQUEUE_REQUEST, mqd->queue_state.cp_hqd_dequeue_request);
3981 WREG32(CP_HQD_PQ_RPTR, mqd->queue_state.cp_hqd_pq_rptr);
3982 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
3983 }
3984
3985 /* set the pointer to the MQD */
3986 mqd->queue_state.cp_mqd_base_addr = mqd_gpu_addr & 0xfffffffc;
3987 mqd->queue_state.cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
3988 WREG32(CP_MQD_BASE_ADDR, mqd->queue_state.cp_mqd_base_addr);
3989 WREG32(CP_MQD_BASE_ADDR_HI, mqd->queue_state.cp_mqd_base_addr_hi);
3990 /* set MQD vmid to 0 */
3991 mqd->queue_state.cp_mqd_control = RREG32(CP_MQD_CONTROL);
3992 mqd->queue_state.cp_mqd_control &= ~MQD_VMID_MASK;
3993 WREG32(CP_MQD_CONTROL, mqd->queue_state.cp_mqd_control);
3994
3995 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
3996 hqd_gpu_addr = rdev->ring[idx].gpu_addr >> 8;
3997 mqd->queue_state.cp_hqd_pq_base = hqd_gpu_addr;
3998 mqd->queue_state.cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
3999 WREG32(CP_HQD_PQ_BASE, mqd->queue_state.cp_hqd_pq_base);
4000 WREG32(CP_HQD_PQ_BASE_HI, mqd->queue_state.cp_hqd_pq_base_hi);
4001
4002 /* set up the HQD, this is similar to CP_RB0_CNTL */
4003 mqd->queue_state.cp_hqd_pq_control = RREG32(CP_HQD_PQ_CONTROL);
4004 mqd->queue_state.cp_hqd_pq_control &=
4005 ~(QUEUE_SIZE_MASK | RPTR_BLOCK_SIZE_MASK);
4006
4007 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004008 order_base_2(rdev->ring[idx].ring_size / 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004009 mqd->queue_state.cp_hqd_pq_control |=
Daniel Vetterb72a8922013-07-10 14:11:59 +02004010 (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8);
Alex Deucher963e81f2013-06-26 17:37:11 -04004011#ifdef __BIG_ENDIAN
4012 mqd->queue_state.cp_hqd_pq_control |= BUF_SWAP_32BIT;
4013#endif
4014 mqd->queue_state.cp_hqd_pq_control &=
4015 ~(UNORD_DISPATCH | ROQ_PQ_IB_FLIP | PQ_VOLATILE);
4016 mqd->queue_state.cp_hqd_pq_control |=
4017 PRIV_STATE | KMD_QUEUE; /* assuming kernel queue control */
4018 WREG32(CP_HQD_PQ_CONTROL, mqd->queue_state.cp_hqd_pq_control);
4019
4020 /* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4021 if (i == 0)
4022 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP1_WPTR_OFFSET;
4023 else
4024 wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP2_WPTR_OFFSET;
4025 mqd->queue_state.cp_hqd_pq_wptr_poll_addr = wb_gpu_addr & 0xfffffffc;
4026 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4027 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR, mqd->queue_state.cp_hqd_pq_wptr_poll_addr);
4028 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI,
4029 mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi);
4030
4031 /* set the wb address wether it's enabled or not */
4032 if (i == 0)
4033 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET;
4034 else
4035 wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET;
4036 mqd->queue_state.cp_hqd_pq_rptr_report_addr = wb_gpu_addr & 0xfffffffc;
4037 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi =
4038 upper_32_bits(wb_gpu_addr) & 0xffff;
4039 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR,
4040 mqd->queue_state.cp_hqd_pq_rptr_report_addr);
4041 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI,
4042 mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi);
4043
4044 /* enable the doorbell if requested */
4045 if (use_doorbell) {
4046 mqd->queue_state.cp_hqd_pq_doorbell_control =
4047 RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4048 mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_OFFSET_MASK;
4049 mqd->queue_state.cp_hqd_pq_doorbell_control |=
4050 DOORBELL_OFFSET(rdev->ring[idx].doorbell_offset / 4);
4051 mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4052 mqd->queue_state.cp_hqd_pq_doorbell_control &=
4053 ~(DOORBELL_SOURCE | DOORBELL_HIT);
4054
4055 } else {
4056 mqd->queue_state.cp_hqd_pq_doorbell_control = 0;
4057 }
4058 WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4059 mqd->queue_state.cp_hqd_pq_doorbell_control);
4060
4061 /* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
4062 rdev->ring[idx].wptr = 0;
4063 mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
4064 WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4065 rdev->ring[idx].rptr = RREG32(CP_HQD_PQ_RPTR);
4066 mqd->queue_state.cp_hqd_pq_rptr = rdev->ring[idx].rptr;
4067
4068 /* set the vmid for the queue */
4069 mqd->queue_state.cp_hqd_vmid = 0;
4070 WREG32(CP_HQD_VMID, mqd->queue_state.cp_hqd_vmid);
4071
4072 /* activate the queue */
4073 mqd->queue_state.cp_hqd_active = 1;
4074 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
4075
4076 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004077 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher963e81f2013-06-26 17:37:11 -04004078
4079 radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
4080 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
4081
4082 rdev->ring[idx].ready = true;
4083 r = radeon_ring_test(rdev, idx, &rdev->ring[idx]);
4084 if (r)
4085 rdev->ring[idx].ready = false;
4086 }
4087
Alex Deucher841cf442012-12-18 21:47:44 -05004088 return 0;
4089}
4090
Alex Deucher841cf442012-12-18 21:47:44 -05004091static void cik_cp_enable(struct radeon_device *rdev, bool enable)
4092{
4093 cik_cp_gfx_enable(rdev, enable);
4094 cik_cp_compute_enable(rdev, enable);
4095}
4096
Alex Deucher841cf442012-12-18 21:47:44 -05004097static int cik_cp_load_microcode(struct radeon_device *rdev)
4098{
4099 int r;
4100
4101 r = cik_cp_gfx_load_microcode(rdev);
4102 if (r)
4103 return r;
4104 r = cik_cp_compute_load_microcode(rdev);
4105 if (r)
4106 return r;
4107
4108 return 0;
4109}
4110
Alex Deucher841cf442012-12-18 21:47:44 -05004111static void cik_cp_fini(struct radeon_device *rdev)
4112{
4113 cik_cp_gfx_fini(rdev);
4114 cik_cp_compute_fini(rdev);
4115}
4116
Alex Deucher841cf442012-12-18 21:47:44 -05004117static int cik_cp_resume(struct radeon_device *rdev)
4118{
4119 int r;
4120
Alex Deucher4214faf2013-09-03 10:17:13 -04004121 cik_enable_gui_idle_interrupt(rdev, false);
4122
Alex Deucher841cf442012-12-18 21:47:44 -05004123 r = cik_cp_load_microcode(rdev);
4124 if (r)
4125 return r;
4126
4127 r = cik_cp_gfx_resume(rdev);
4128 if (r)
4129 return r;
4130 r = cik_cp_compute_resume(rdev);
4131 if (r)
4132 return r;
4133
Alex Deucher4214faf2013-09-03 10:17:13 -04004134 cik_enable_gui_idle_interrupt(rdev, true);
4135
Alex Deucher841cf442012-12-18 21:47:44 -05004136 return 0;
4137}
4138
Alex Deuchercc066712013-04-09 12:59:51 -04004139static void cik_print_gpu_status_regs(struct radeon_device *rdev)
4140{
4141 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
4142 RREG32(GRBM_STATUS));
4143 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
4144 RREG32(GRBM_STATUS2));
4145 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
4146 RREG32(GRBM_STATUS_SE0));
4147 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
4148 RREG32(GRBM_STATUS_SE1));
4149 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
4150 RREG32(GRBM_STATUS_SE2));
4151 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
4152 RREG32(GRBM_STATUS_SE3));
4153 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
4154 RREG32(SRBM_STATUS));
4155 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
4156 RREG32(SRBM_STATUS2));
4157 dev_info(rdev->dev, " SDMA0_STATUS_REG = 0x%08X\n",
4158 RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
4159 dev_info(rdev->dev, " SDMA1_STATUS_REG = 0x%08X\n",
4160 RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
Alex Deucher963e81f2013-06-26 17:37:11 -04004161 dev_info(rdev->dev, " CP_STAT = 0x%08x\n", RREG32(CP_STAT));
4162 dev_info(rdev->dev, " CP_STALLED_STAT1 = 0x%08x\n",
4163 RREG32(CP_STALLED_STAT1));
4164 dev_info(rdev->dev, " CP_STALLED_STAT2 = 0x%08x\n",
4165 RREG32(CP_STALLED_STAT2));
4166 dev_info(rdev->dev, " CP_STALLED_STAT3 = 0x%08x\n",
4167 RREG32(CP_STALLED_STAT3));
4168 dev_info(rdev->dev, " CP_CPF_BUSY_STAT = 0x%08x\n",
4169 RREG32(CP_CPF_BUSY_STAT));
4170 dev_info(rdev->dev, " CP_CPF_STALLED_STAT1 = 0x%08x\n",
4171 RREG32(CP_CPF_STALLED_STAT1));
4172 dev_info(rdev->dev, " CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS));
4173 dev_info(rdev->dev, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT));
4174 dev_info(rdev->dev, " CP_CPC_STALLED_STAT1 = 0x%08x\n",
4175 RREG32(CP_CPC_STALLED_STAT1));
4176 dev_info(rdev->dev, " CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS));
Alex Deuchercc066712013-04-09 12:59:51 -04004177}
4178
Alex Deucher6f2043c2013-04-09 12:43:41 -04004179/**
Alex Deuchercc066712013-04-09 12:59:51 -04004180 * cik_gpu_check_soft_reset - check which blocks are busy
4181 *
4182 * @rdev: radeon_device pointer
4183 *
4184 * Check which blocks are busy and return the relevant reset
4185 * mask to be used by cik_gpu_soft_reset().
4186 * Returns a mask of the blocks to be reset.
4187 */
Christian König2483b4e2013-08-13 11:56:54 +02004188u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
Alex Deuchercc066712013-04-09 12:59:51 -04004189{
4190 u32 reset_mask = 0;
4191 u32 tmp;
4192
4193 /* GRBM_STATUS */
4194 tmp = RREG32(GRBM_STATUS);
4195 if (tmp & (PA_BUSY | SC_BUSY |
4196 BCI_BUSY | SX_BUSY |
4197 TA_BUSY | VGT_BUSY |
4198 DB_BUSY | CB_BUSY |
4199 GDS_BUSY | SPI_BUSY |
4200 IA_BUSY | IA_BUSY_NO_DMA))
4201 reset_mask |= RADEON_RESET_GFX;
4202
4203 if (tmp & (CP_BUSY | CP_COHERENCY_BUSY))
4204 reset_mask |= RADEON_RESET_CP;
4205
4206 /* GRBM_STATUS2 */
4207 tmp = RREG32(GRBM_STATUS2);
4208 if (tmp & RLC_BUSY)
4209 reset_mask |= RADEON_RESET_RLC;
4210
4211 /* SDMA0_STATUS_REG */
4212 tmp = RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET);
4213 if (!(tmp & SDMA_IDLE))
4214 reset_mask |= RADEON_RESET_DMA;
4215
4216 /* SDMA1_STATUS_REG */
4217 tmp = RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
4218 if (!(tmp & SDMA_IDLE))
4219 reset_mask |= RADEON_RESET_DMA1;
4220
4221 /* SRBM_STATUS2 */
4222 tmp = RREG32(SRBM_STATUS2);
4223 if (tmp & SDMA_BUSY)
4224 reset_mask |= RADEON_RESET_DMA;
4225
4226 if (tmp & SDMA1_BUSY)
4227 reset_mask |= RADEON_RESET_DMA1;
4228
4229 /* SRBM_STATUS */
4230 tmp = RREG32(SRBM_STATUS);
4231
4232 if (tmp & IH_BUSY)
4233 reset_mask |= RADEON_RESET_IH;
4234
4235 if (tmp & SEM_BUSY)
4236 reset_mask |= RADEON_RESET_SEM;
4237
4238 if (tmp & GRBM_RQ_PENDING)
4239 reset_mask |= RADEON_RESET_GRBM;
4240
4241 if (tmp & VMC_BUSY)
4242 reset_mask |= RADEON_RESET_VMC;
4243
4244 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
4245 MCC_BUSY | MCD_BUSY))
4246 reset_mask |= RADEON_RESET_MC;
4247
4248 if (evergreen_is_display_hung(rdev))
4249 reset_mask |= RADEON_RESET_DISPLAY;
4250
4251 /* Skip MC reset as it's mostly likely not hung, just busy */
4252 if (reset_mask & RADEON_RESET_MC) {
4253 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
4254 reset_mask &= ~RADEON_RESET_MC;
4255 }
4256
4257 return reset_mask;
4258}
4259
4260/**
4261 * cik_gpu_soft_reset - soft reset GPU
4262 *
4263 * @rdev: radeon_device pointer
4264 * @reset_mask: mask of which blocks to reset
4265 *
4266 * Soft reset the blocks specified in @reset_mask.
4267 */
4268static void cik_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
4269{
4270 struct evergreen_mc_save save;
4271 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
4272 u32 tmp;
4273
4274 if (reset_mask == 0)
4275 return;
4276
4277 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
4278
4279 cik_print_gpu_status_regs(rdev);
4280 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
4281 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
4282 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4283 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
4284
Alex Deucherfb2c7f42013-10-02 14:54:44 -04004285 /* disable CG/PG */
4286 cik_fini_pg(rdev);
4287 cik_fini_cg(rdev);
4288
Alex Deuchercc066712013-04-09 12:59:51 -04004289 /* stop the rlc */
4290 cik_rlc_stop(rdev);
4291
4292 /* Disable GFX parsing/prefetching */
4293 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
4294
4295 /* Disable MEC parsing/prefetching */
4296 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
4297
4298 if (reset_mask & RADEON_RESET_DMA) {
4299 /* sdma0 */
4300 tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
4301 tmp |= SDMA_HALT;
4302 WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
4303 }
4304 if (reset_mask & RADEON_RESET_DMA1) {
4305 /* sdma1 */
4306 tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
4307 tmp |= SDMA_HALT;
4308 WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
4309 }
4310
4311 evergreen_mc_stop(rdev, &save);
4312 if (evergreen_mc_wait_for_idle(rdev)) {
4313 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4314 }
4315
4316 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP))
4317 grbm_soft_reset = SOFT_RESET_CP | SOFT_RESET_GFX;
4318
4319 if (reset_mask & RADEON_RESET_CP) {
4320 grbm_soft_reset |= SOFT_RESET_CP;
4321
4322 srbm_soft_reset |= SOFT_RESET_GRBM;
4323 }
4324
4325 if (reset_mask & RADEON_RESET_DMA)
4326 srbm_soft_reset |= SOFT_RESET_SDMA;
4327
4328 if (reset_mask & RADEON_RESET_DMA1)
4329 srbm_soft_reset |= SOFT_RESET_SDMA1;
4330
4331 if (reset_mask & RADEON_RESET_DISPLAY)
4332 srbm_soft_reset |= SOFT_RESET_DC;
4333
4334 if (reset_mask & RADEON_RESET_RLC)
4335 grbm_soft_reset |= SOFT_RESET_RLC;
4336
4337 if (reset_mask & RADEON_RESET_SEM)
4338 srbm_soft_reset |= SOFT_RESET_SEM;
4339
4340 if (reset_mask & RADEON_RESET_IH)
4341 srbm_soft_reset |= SOFT_RESET_IH;
4342
4343 if (reset_mask & RADEON_RESET_GRBM)
4344 srbm_soft_reset |= SOFT_RESET_GRBM;
4345
4346 if (reset_mask & RADEON_RESET_VMC)
4347 srbm_soft_reset |= SOFT_RESET_VMC;
4348
4349 if (!(rdev->flags & RADEON_IS_IGP)) {
4350 if (reset_mask & RADEON_RESET_MC)
4351 srbm_soft_reset |= SOFT_RESET_MC;
4352 }
4353
4354 if (grbm_soft_reset) {
4355 tmp = RREG32(GRBM_SOFT_RESET);
4356 tmp |= grbm_soft_reset;
4357 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
4358 WREG32(GRBM_SOFT_RESET, tmp);
4359 tmp = RREG32(GRBM_SOFT_RESET);
4360
4361 udelay(50);
4362
4363 tmp &= ~grbm_soft_reset;
4364 WREG32(GRBM_SOFT_RESET, tmp);
4365 tmp = RREG32(GRBM_SOFT_RESET);
4366 }
4367
4368 if (srbm_soft_reset) {
4369 tmp = RREG32(SRBM_SOFT_RESET);
4370 tmp |= srbm_soft_reset;
4371 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
4372 WREG32(SRBM_SOFT_RESET, tmp);
4373 tmp = RREG32(SRBM_SOFT_RESET);
4374
4375 udelay(50);
4376
4377 tmp &= ~srbm_soft_reset;
4378 WREG32(SRBM_SOFT_RESET, tmp);
4379 tmp = RREG32(SRBM_SOFT_RESET);
4380 }
4381
4382 /* Wait a little for things to settle down */
4383 udelay(50);
4384
4385 evergreen_mc_resume(rdev, &save);
4386 udelay(50);
4387
4388 cik_print_gpu_status_regs(rdev);
4389}
4390
4391/**
4392 * cik_asic_reset - soft reset GPU
4393 *
4394 * @rdev: radeon_device pointer
4395 *
4396 * Look up which blocks are hung and attempt
4397 * to reset them.
4398 * Returns 0 for success.
4399 */
4400int cik_asic_reset(struct radeon_device *rdev)
4401{
4402 u32 reset_mask;
4403
4404 reset_mask = cik_gpu_check_soft_reset(rdev);
4405
4406 if (reset_mask)
4407 r600_set_bios_scratch_engine_hung(rdev, true);
4408
4409 cik_gpu_soft_reset(rdev, reset_mask);
4410
4411 reset_mask = cik_gpu_check_soft_reset(rdev);
4412
4413 if (!reset_mask)
4414 r600_set_bios_scratch_engine_hung(rdev, false);
4415
4416 return 0;
4417}
4418
4419/**
4420 * cik_gfx_is_lockup - check if the 3D engine is locked up
Alex Deucher6f2043c2013-04-09 12:43:41 -04004421 *
4422 * @rdev: radeon_device pointer
4423 * @ring: radeon_ring structure holding ring information
4424 *
4425 * Check if the 3D engine is locked up (CIK).
4426 * Returns true if the engine is locked, false if not.
4427 */
Alex Deuchercc066712013-04-09 12:59:51 -04004428bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
Alex Deucher6f2043c2013-04-09 12:43:41 -04004429{
Alex Deuchercc066712013-04-09 12:59:51 -04004430 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
Alex Deucher6f2043c2013-04-09 12:43:41 -04004431
Alex Deuchercc066712013-04-09 12:59:51 -04004432 if (!(reset_mask & (RADEON_RESET_GFX |
4433 RADEON_RESET_COMPUTE |
4434 RADEON_RESET_CP))) {
Alex Deucher6f2043c2013-04-09 12:43:41 -04004435 radeon_ring_lockup_update(ring);
4436 return false;
4437 }
4438 /* force CP activities */
4439 radeon_ring_force_activity(rdev, ring);
4440 return radeon_ring_test_lockup(rdev, ring);
4441}
4442
Alex Deucher1c491652013-04-09 12:45:26 -04004443/* MC */
4444/**
4445 * cik_mc_program - program the GPU memory controller
4446 *
4447 * @rdev: radeon_device pointer
4448 *
4449 * Set the location of vram, gart, and AGP in the GPU's
4450 * physical address space (CIK).
4451 */
4452static void cik_mc_program(struct radeon_device *rdev)
4453{
4454 struct evergreen_mc_save save;
4455 u32 tmp;
4456 int i, j;
4457
4458 /* Initialize HDP */
4459 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
4460 WREG32((0x2c14 + j), 0x00000000);
4461 WREG32((0x2c18 + j), 0x00000000);
4462 WREG32((0x2c1c + j), 0x00000000);
4463 WREG32((0x2c20 + j), 0x00000000);
4464 WREG32((0x2c24 + j), 0x00000000);
4465 }
4466 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
4467
4468 evergreen_mc_stop(rdev, &save);
4469 if (radeon_mc_wait_for_idle(rdev)) {
4470 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4471 }
4472 /* Lockout access through VGA aperture*/
4473 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
4474 /* Update configuration */
4475 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
4476 rdev->mc.vram_start >> 12);
4477 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
4478 rdev->mc.vram_end >> 12);
4479 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
4480 rdev->vram_scratch.gpu_addr >> 12);
4481 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
4482 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
4483 WREG32(MC_VM_FB_LOCATION, tmp);
4484 /* XXX double check these! */
4485 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
4486 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
4487 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
4488 WREG32(MC_VM_AGP_BASE, 0);
4489 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
4490 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
4491 if (radeon_mc_wait_for_idle(rdev)) {
4492 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4493 }
4494 evergreen_mc_resume(rdev, &save);
4495 /* we need to own VRAM, so turn off the VGA renderer here
4496 * to stop it overwriting our objects */
4497 rv515_vga_render_disable(rdev);
4498}
4499
4500/**
4501 * cik_mc_init - initialize the memory controller driver params
4502 *
4503 * @rdev: radeon_device pointer
4504 *
4505 * Look up the amount of vram, vram width, and decide how to place
4506 * vram and gart within the GPU's physical address space (CIK).
4507 * Returns 0 for success.
4508 */
4509static int cik_mc_init(struct radeon_device *rdev)
4510{
4511 u32 tmp;
4512 int chansize, numchan;
4513
4514 /* Get VRAM informations */
4515 rdev->mc.vram_is_ddr = true;
4516 tmp = RREG32(MC_ARB_RAMCFG);
4517 if (tmp & CHANSIZE_MASK) {
4518 chansize = 64;
4519 } else {
4520 chansize = 32;
4521 }
4522 tmp = RREG32(MC_SHARED_CHMAP);
4523 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
4524 case 0:
4525 default:
4526 numchan = 1;
4527 break;
4528 case 1:
4529 numchan = 2;
4530 break;
4531 case 2:
4532 numchan = 4;
4533 break;
4534 case 3:
4535 numchan = 8;
4536 break;
4537 case 4:
4538 numchan = 3;
4539 break;
4540 case 5:
4541 numchan = 6;
4542 break;
4543 case 6:
4544 numchan = 10;
4545 break;
4546 case 7:
4547 numchan = 12;
4548 break;
4549 case 8:
4550 numchan = 16;
4551 break;
4552 }
4553 rdev->mc.vram_width = numchan * chansize;
4554 /* Could aper size report 0 ? */
4555 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
4556 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
4557 /* size in MB on si */
Alex Deucher13c5bfd2013-09-24 10:56:55 -04004558 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
4559 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
Alex Deucher1c491652013-04-09 12:45:26 -04004560 rdev->mc.visible_vram_size = rdev->mc.aper_size;
4561 si_vram_gtt_location(rdev, &rdev->mc);
4562 radeon_update_bandwidth_info(rdev);
4563
4564 return 0;
4565}
4566
4567/*
4568 * GART
4569 * VMID 0 is the physical GPU addresses as used by the kernel.
4570 * VMIDs 1-15 are used for userspace clients and are handled
4571 * by the radeon vm/hsa code.
4572 */
4573/**
4574 * cik_pcie_gart_tlb_flush - gart tlb flush callback
4575 *
4576 * @rdev: radeon_device pointer
4577 *
4578 * Flush the TLB for the VMID 0 page table (CIK).
4579 */
4580void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
4581{
4582 /* flush hdp cache */
4583 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
4584
4585 /* bits 0-15 are the VM contexts0-15 */
4586 WREG32(VM_INVALIDATE_REQUEST, 0x1);
4587}
4588
4589/**
4590 * cik_pcie_gart_enable - gart enable
4591 *
4592 * @rdev: radeon_device pointer
4593 *
4594 * This sets up the TLBs, programs the page tables for VMID0,
4595 * sets up the hw for VMIDs 1-15 which are allocated on
4596 * demand, and sets up the global locations for the LDS, GDS,
4597 * and GPUVM for FSA64 clients (CIK).
4598 * Returns 0 for success, errors for failure.
4599 */
4600static int cik_pcie_gart_enable(struct radeon_device *rdev)
4601{
4602 int r, i;
4603
4604 if (rdev->gart.robj == NULL) {
4605 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
4606 return -EINVAL;
4607 }
4608 r = radeon_gart_table_vram_pin(rdev);
4609 if (r)
4610 return r;
4611 radeon_gart_restore(rdev);
4612 /* Setup TLB control */
4613 WREG32(MC_VM_MX_L1_TLB_CNTL,
4614 (0xA << 7) |
4615 ENABLE_L1_TLB |
4616 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
4617 ENABLE_ADVANCED_DRIVER_MODEL |
4618 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
4619 /* Setup L2 cache */
4620 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
4621 ENABLE_L2_FRAGMENT_PROCESSING |
4622 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
4623 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
4624 EFFECTIVE_L2_QUEUE_SIZE(7) |
4625 CONTEXT1_IDENTITY_ACCESS_MODE(1));
4626 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
4627 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
4628 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
4629 /* setup context0 */
4630 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
4631 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
4632 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
4633 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
4634 (u32)(rdev->dummy_page.addr >> 12));
4635 WREG32(VM_CONTEXT0_CNTL2, 0);
4636 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
4637 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
4638
4639 WREG32(0x15D4, 0);
4640 WREG32(0x15D8, 0);
4641 WREG32(0x15DC, 0);
4642
4643 /* empty context1-15 */
4644 /* FIXME start with 4G, once using 2 level pt switch to full
4645 * vm size space
4646 */
4647 /* set vm size, must be a multiple of 4 */
4648 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
4649 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
4650 for (i = 1; i < 16; i++) {
4651 if (i < 8)
4652 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
4653 rdev->gart.table_addr >> 12);
4654 else
4655 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
4656 rdev->gart.table_addr >> 12);
4657 }
4658
4659 /* enable context1-15 */
4660 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
4661 (u32)(rdev->dummy_page.addr >> 12));
Alex Deuchera00024b2012-09-18 16:06:01 -04004662 WREG32(VM_CONTEXT1_CNTL2, 4);
Alex Deucher1c491652013-04-09 12:45:26 -04004663 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
Alex Deuchera00024b2012-09-18 16:06:01 -04004664 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4665 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
4666 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4667 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
4668 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
4669 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
4670 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
4671 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
4672 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
4673 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
4674 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4675 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
Alex Deucher1c491652013-04-09 12:45:26 -04004676
4677 /* TC cache setup ??? */
4678 WREG32(TC_CFG_L1_LOAD_POLICY0, 0);
4679 WREG32(TC_CFG_L1_LOAD_POLICY1, 0);
4680 WREG32(TC_CFG_L1_STORE_POLICY, 0);
4681
4682 WREG32(TC_CFG_L2_LOAD_POLICY0, 0);
4683 WREG32(TC_CFG_L2_LOAD_POLICY1, 0);
4684 WREG32(TC_CFG_L2_STORE_POLICY0, 0);
4685 WREG32(TC_CFG_L2_STORE_POLICY1, 0);
4686 WREG32(TC_CFG_L2_ATOMIC_POLICY, 0);
4687
4688 WREG32(TC_CFG_L1_VOLATILE, 0);
4689 WREG32(TC_CFG_L2_VOLATILE, 0);
4690
4691 if (rdev->family == CHIP_KAVERI) {
4692 u32 tmp = RREG32(CHUB_CONTROL);
4693 tmp &= ~BYPASS_VM;
4694 WREG32(CHUB_CONTROL, tmp);
4695 }
4696
4697 /* XXX SH_MEM regs */
4698 /* where to put LDS, scratch, GPUVM in FSA64 space */
Alex Deucherf61d5b462013-08-06 12:40:16 -04004699 mutex_lock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04004700 for (i = 0; i < 16; i++) {
Alex Deucherb556b122013-01-29 10:44:22 -05004701 cik_srbm_select(rdev, 0, 0, 0, i);
Alex Deucher21a93e12013-04-09 12:47:11 -04004702 /* CP and shaders */
Alex Deucher1c491652013-04-09 12:45:26 -04004703 WREG32(SH_MEM_CONFIG, 0);
4704 WREG32(SH_MEM_APE1_BASE, 1);
4705 WREG32(SH_MEM_APE1_LIMIT, 0);
4706 WREG32(SH_MEM_BASES, 0);
Alex Deucher21a93e12013-04-09 12:47:11 -04004707 /* SDMA GFX */
4708 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA0_REGISTER_OFFSET, 0);
4709 WREG32(SDMA0_GFX_APE1_CNTL + SDMA0_REGISTER_OFFSET, 0);
4710 WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA1_REGISTER_OFFSET, 0);
4711 WREG32(SDMA0_GFX_APE1_CNTL + SDMA1_REGISTER_OFFSET, 0);
4712 /* XXX SDMA RLC - todo */
Alex Deucher1c491652013-04-09 12:45:26 -04004713 }
Alex Deucherb556b122013-01-29 10:44:22 -05004714 cik_srbm_select(rdev, 0, 0, 0, 0);
Alex Deucherf61d5b462013-08-06 12:40:16 -04004715 mutex_unlock(&rdev->srbm_mutex);
Alex Deucher1c491652013-04-09 12:45:26 -04004716
4717 cik_pcie_gart_tlb_flush(rdev);
4718 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
4719 (unsigned)(rdev->mc.gtt_size >> 20),
4720 (unsigned long long)rdev->gart.table_addr);
4721 rdev->gart.ready = true;
4722 return 0;
4723}
4724
4725/**
4726 * cik_pcie_gart_disable - gart disable
4727 *
4728 * @rdev: radeon_device pointer
4729 *
4730 * This disables all VM page table (CIK).
4731 */
4732static void cik_pcie_gart_disable(struct radeon_device *rdev)
4733{
4734 /* Disable all tables */
4735 WREG32(VM_CONTEXT0_CNTL, 0);
4736 WREG32(VM_CONTEXT1_CNTL, 0);
4737 /* Setup TLB control */
4738 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
4739 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
4740 /* Setup L2 cache */
4741 WREG32(VM_L2_CNTL,
4742 ENABLE_L2_FRAGMENT_PROCESSING |
4743 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
4744 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
4745 EFFECTIVE_L2_QUEUE_SIZE(7) |
4746 CONTEXT1_IDENTITY_ACCESS_MODE(1));
4747 WREG32(VM_L2_CNTL2, 0);
4748 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
4749 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
4750 radeon_gart_table_vram_unpin(rdev);
4751}
4752
4753/**
4754 * cik_pcie_gart_fini - vm fini callback
4755 *
4756 * @rdev: radeon_device pointer
4757 *
4758 * Tears down the driver GART/VM setup (CIK).
4759 */
4760static void cik_pcie_gart_fini(struct radeon_device *rdev)
4761{
4762 cik_pcie_gart_disable(rdev);
4763 radeon_gart_table_vram_free(rdev);
4764 radeon_gart_fini(rdev);
4765}
4766
4767/* vm parser */
4768/**
4769 * cik_ib_parse - vm ib_parse callback
4770 *
4771 * @rdev: radeon_device pointer
4772 * @ib: indirect buffer pointer
4773 *
4774 * CIK uses hw IB checking so this is a nop (CIK).
4775 */
4776int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
4777{
4778 return 0;
4779}
4780
4781/*
4782 * vm
4783 * VMID 0 is the physical GPU addresses as used by the kernel.
4784 * VMIDs 1-15 are used for userspace clients and are handled
4785 * by the radeon vm/hsa code.
4786 */
4787/**
4788 * cik_vm_init - cik vm init callback
4789 *
4790 * @rdev: radeon_device pointer
4791 *
4792 * Inits cik specific vm parameters (number of VMs, base of vram for
4793 * VMIDs 1-15) (CIK).
4794 * Returns 0 for success.
4795 */
4796int cik_vm_init(struct radeon_device *rdev)
4797{
4798 /* number of VMs */
4799 rdev->vm_manager.nvm = 16;
4800 /* base offset of vram pages */
4801 if (rdev->flags & RADEON_IS_IGP) {
4802 u64 tmp = RREG32(MC_VM_FB_OFFSET);
4803 tmp <<= 22;
4804 rdev->vm_manager.vram_base_offset = tmp;
4805 } else
4806 rdev->vm_manager.vram_base_offset = 0;
4807
4808 return 0;
4809}
4810
4811/**
4812 * cik_vm_fini - cik vm fini callback
4813 *
4814 * @rdev: radeon_device pointer
4815 *
4816 * Tear down any asic specific VM setup (CIK).
4817 */
4818void cik_vm_fini(struct radeon_device *rdev)
4819{
4820}
4821
Alex Deucherf96ab482012-08-31 10:37:47 -04004822/**
Alex Deucher3ec7d112013-06-14 10:42:22 -04004823 * cik_vm_decode_fault - print human readable fault info
4824 *
4825 * @rdev: radeon_device pointer
4826 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
4827 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
4828 *
4829 * Print human readable fault information (CIK).
4830 */
4831static void cik_vm_decode_fault(struct radeon_device *rdev,
4832 u32 status, u32 addr, u32 mc_client)
4833{
4834 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
4835 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
4836 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02004837 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
4838 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
Alex Deucher3ec7d112013-06-14 10:42:22 -04004839
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02004840 printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04004841 protections, vmid, addr,
4842 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
Michel Dänzer328a50c7b2013-09-18 15:39:40 +02004843 block, mc_client, mc_id);
Alex Deucher3ec7d112013-06-14 10:42:22 -04004844}
4845
4846/**
Alex Deucherf96ab482012-08-31 10:37:47 -04004847 * cik_vm_flush - cik vm flush using the CP
4848 *
4849 * @rdev: radeon_device pointer
4850 *
4851 * Update the page table base and flush the VM TLB
4852 * using the CP (CIK).
4853 */
4854void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4855{
4856 struct radeon_ring *ring = &rdev->ring[ridx];
4857
4858 if (vm == NULL)
4859 return;
4860
4861 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4862 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4863 WRITE_DATA_DST_SEL(0)));
4864 if (vm->id < 8) {
4865 radeon_ring_write(ring,
4866 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
4867 } else {
4868 radeon_ring_write(ring,
4869 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
4870 }
4871 radeon_ring_write(ring, 0);
4872 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4873
4874 /* update SH_MEM_* regs */
4875 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4876 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4877 WRITE_DATA_DST_SEL(0)));
4878 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
4879 radeon_ring_write(ring, 0);
4880 radeon_ring_write(ring, VMID(vm->id));
4881
4882 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
4883 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4884 WRITE_DATA_DST_SEL(0)));
4885 radeon_ring_write(ring, SH_MEM_BASES >> 2);
4886 radeon_ring_write(ring, 0);
4887
4888 radeon_ring_write(ring, 0); /* SH_MEM_BASES */
4889 radeon_ring_write(ring, 0); /* SH_MEM_CONFIG */
4890 radeon_ring_write(ring, 1); /* SH_MEM_APE1_BASE */
4891 radeon_ring_write(ring, 0); /* SH_MEM_APE1_LIMIT */
4892
4893 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4894 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4895 WRITE_DATA_DST_SEL(0)));
4896 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
4897 radeon_ring_write(ring, 0);
4898 radeon_ring_write(ring, VMID(0));
4899
4900 /* HDP flush */
4901 /* We should be using the WAIT_REG_MEM packet here like in
4902 * cik_fence_ring_emit(), but it causes the CP to hang in this
4903 * context...
4904 */
4905 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4906 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4907 WRITE_DATA_DST_SEL(0)));
4908 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
4909 radeon_ring_write(ring, 0);
4910 radeon_ring_write(ring, 0);
4911
4912 /* bits 0-15 are the VM contexts0-15 */
4913 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4914 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4915 WRITE_DATA_DST_SEL(0)));
4916 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
4917 radeon_ring_write(ring, 0);
4918 radeon_ring_write(ring, 1 << vm->id);
4919
Alex Deucherb07fdd32013-04-11 09:36:17 -04004920 /* compute doesn't have PFP */
4921 if (ridx == RADEON_RING_TYPE_GFX_INDEX) {
4922 /* sync PFP to ME, otherwise we might get invalid PFP reads */
4923 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
4924 radeon_ring_write(ring, 0x0);
4925 }
Alex Deucherf96ab482012-08-31 10:37:47 -04004926}
4927
Alex Deucherf6796ca2012-11-09 10:44:08 -05004928/*
4929 * RLC
4930 * The RLC is a multi-purpose microengine that handles a
4931 * variety of functions, the most important of which is
4932 * the interrupt controller.
4933 */
Alex Deucher866d83d2013-04-15 17:13:29 -04004934static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
4935 bool enable)
Alex Deucherf6796ca2012-11-09 10:44:08 -05004936{
Alex Deucher866d83d2013-04-15 17:13:29 -04004937 u32 tmp = RREG32(CP_INT_CNTL_RING0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05004938
Alex Deucher866d83d2013-04-15 17:13:29 -04004939 if (enable)
4940 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4941 else
4942 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
Alex Deucherf6796ca2012-11-09 10:44:08 -05004943 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher866d83d2013-04-15 17:13:29 -04004944}
Alex Deucherf6796ca2012-11-09 10:44:08 -05004945
Alex Deucher866d83d2013-04-15 17:13:29 -04004946static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
4947{
4948 u32 tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05004949
Alex Deucher866d83d2013-04-15 17:13:29 -04004950 tmp = RREG32(RLC_LB_CNTL);
4951 if (enable)
4952 tmp |= LOAD_BALANCE_ENABLE;
4953 else
4954 tmp &= ~LOAD_BALANCE_ENABLE;
4955 WREG32(RLC_LB_CNTL, tmp);
4956}
Alex Deucherf6796ca2012-11-09 10:44:08 -05004957
Alex Deucher866d83d2013-04-15 17:13:29 -04004958static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
4959{
4960 u32 i, j, k;
4961 u32 mask;
Alex Deucherf6796ca2012-11-09 10:44:08 -05004962
4963 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
4964 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
4965 cik_select_se_sh(rdev, i, j);
4966 for (k = 0; k < rdev->usec_timeout; k++) {
4967 if (RREG32(RLC_SERDES_CU_MASTER_BUSY) == 0)
4968 break;
4969 udelay(1);
4970 }
4971 }
4972 }
4973 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
4974
4975 mask = SE_MASTER_BUSY_MASK | GC_MASTER_BUSY | TC0_MASTER_BUSY | TC1_MASTER_BUSY;
4976 for (k = 0; k < rdev->usec_timeout; k++) {
4977 if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
4978 break;
4979 udelay(1);
4980 }
4981}
4982
Alex Deucher22c775c2013-07-23 09:41:05 -04004983static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
4984{
4985 u32 tmp;
4986
4987 tmp = RREG32(RLC_CNTL);
4988 if (tmp != rlc)
4989 WREG32(RLC_CNTL, rlc);
4990}
4991
4992static u32 cik_halt_rlc(struct radeon_device *rdev)
4993{
4994 u32 data, orig;
4995
4996 orig = data = RREG32(RLC_CNTL);
4997
4998 if (data & RLC_ENABLE) {
4999 u32 i;
5000
5001 data &= ~RLC_ENABLE;
5002 WREG32(RLC_CNTL, data);
5003
5004 for (i = 0; i < rdev->usec_timeout; i++) {
5005 if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
5006 break;
5007 udelay(1);
5008 }
5009
5010 cik_wait_for_rlc_serdes(rdev);
5011 }
5012
5013 return orig;
5014}
5015
Alex Deuchera412fce2013-04-22 20:23:31 -04005016void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
5017{
5018 u32 tmp, i, mask;
5019
5020 tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
5021 WREG32(RLC_GPR_REG2, tmp);
5022
5023 mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
5024 for (i = 0; i < rdev->usec_timeout; i++) {
5025 if ((RREG32(RLC_GPM_STAT) & mask) == mask)
5026 break;
5027 udelay(1);
5028 }
5029
5030 for (i = 0; i < rdev->usec_timeout; i++) {
5031 if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
5032 break;
5033 udelay(1);
5034 }
5035}
5036
5037void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
5038{
5039 u32 tmp;
5040
5041 tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
5042 WREG32(RLC_GPR_REG2, tmp);
5043}
5044
Alex Deucherf6796ca2012-11-09 10:44:08 -05005045/**
Alex Deucher866d83d2013-04-15 17:13:29 -04005046 * cik_rlc_stop - stop the RLC ME
5047 *
5048 * @rdev: radeon_device pointer
5049 *
5050 * Halt the RLC ME (MicroEngine) (CIK).
5051 */
5052static void cik_rlc_stop(struct radeon_device *rdev)
5053{
Alex Deucher22c775c2013-07-23 09:41:05 -04005054 WREG32(RLC_CNTL, 0);
Alex Deucher866d83d2013-04-15 17:13:29 -04005055
5056 cik_enable_gui_idle_interrupt(rdev, false);
5057
Alex Deucher866d83d2013-04-15 17:13:29 -04005058 cik_wait_for_rlc_serdes(rdev);
5059}
5060
Alex Deucherf6796ca2012-11-09 10:44:08 -05005061/**
5062 * cik_rlc_start - start the RLC ME
5063 *
5064 * @rdev: radeon_device pointer
5065 *
5066 * Unhalt the RLC ME (MicroEngine) (CIK).
5067 */
5068static void cik_rlc_start(struct radeon_device *rdev)
5069{
Alex Deucherf6796ca2012-11-09 10:44:08 -05005070 WREG32(RLC_CNTL, RLC_ENABLE);
5071
Alex Deucher866d83d2013-04-15 17:13:29 -04005072 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucherf6796ca2012-11-09 10:44:08 -05005073
5074 udelay(50);
5075}
5076
5077/**
5078 * cik_rlc_resume - setup the RLC hw
5079 *
5080 * @rdev: radeon_device pointer
5081 *
5082 * Initialize the RLC registers, load the ucode,
5083 * and start the RLC (CIK).
5084 * Returns 0 for success, -EINVAL if the ucode is not available.
5085 */
5086static int cik_rlc_resume(struct radeon_device *rdev)
5087{
Alex Deucher22c775c2013-07-23 09:41:05 -04005088 u32 i, size, tmp;
Alex Deucherf6796ca2012-11-09 10:44:08 -05005089 const __be32 *fw_data;
5090
5091 if (!rdev->rlc_fw)
5092 return -EINVAL;
5093
5094 switch (rdev->family) {
5095 case CHIP_BONAIRE:
5096 default:
5097 size = BONAIRE_RLC_UCODE_SIZE;
5098 break;
5099 case CHIP_KAVERI:
5100 size = KV_RLC_UCODE_SIZE;
5101 break;
5102 case CHIP_KABINI:
5103 size = KB_RLC_UCODE_SIZE;
5104 break;
5105 }
5106
5107 cik_rlc_stop(rdev);
5108
Alex Deucher22c775c2013-07-23 09:41:05 -04005109 /* disable CG */
5110 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
5111 WREG32(RLC_CGCG_CGLS_CTRL, tmp);
5112
Alex Deucher866d83d2013-04-15 17:13:29 -04005113 si_rlc_reset(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05005114
Alex Deucher22c775c2013-07-23 09:41:05 -04005115 cik_init_pg(rdev);
5116
5117 cik_init_cg(rdev);
Alex Deucherf6796ca2012-11-09 10:44:08 -05005118
5119 WREG32(RLC_LB_CNTR_INIT, 0);
5120 WREG32(RLC_LB_CNTR_MAX, 0x00008000);
5121
5122 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5123 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
5124 WREG32(RLC_LB_PARAMS, 0x00600408);
5125 WREG32(RLC_LB_CNTL, 0x80000004);
5126
5127 WREG32(RLC_MC_CNTL, 0);
5128 WREG32(RLC_UCODE_CNTL, 0);
5129
5130 fw_data = (const __be32 *)rdev->rlc_fw->data;
5131 WREG32(RLC_GPM_UCODE_ADDR, 0);
5132 for (i = 0; i < size; i++)
5133 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
5134 WREG32(RLC_GPM_UCODE_ADDR, 0);
5135
Alex Deucher866d83d2013-04-15 17:13:29 -04005136 /* XXX - find out what chips support lbpw */
5137 cik_enable_lbpw(rdev, false);
5138
Alex Deucher22c775c2013-07-23 09:41:05 -04005139 if (rdev->family == CHIP_BONAIRE)
5140 WREG32(RLC_DRIVER_DMA_STATUS, 0);
Alex Deucherf6796ca2012-11-09 10:44:08 -05005141
5142 cik_rlc_start(rdev);
5143
5144 return 0;
5145}
Alex Deuchera59781b2012-11-09 10:45:57 -05005146
Alex Deucher22c775c2013-07-23 09:41:05 -04005147static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
5148{
5149 u32 data, orig, tmp, tmp2;
5150
5151 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
5152
Alex Deucher473359b2013-08-09 11:18:39 -04005153 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
Alex Deucherddc76ff2013-08-12 17:25:26 -04005154 cik_enable_gui_idle_interrupt(rdev, true);
5155
Alex Deucher22c775c2013-07-23 09:41:05 -04005156 tmp = cik_halt_rlc(rdev);
5157
5158 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5159 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5160 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5161 tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
5162 WREG32(RLC_SERDES_WR_CTRL, tmp2);
5163
5164 cik_update_rlc(rdev, tmp);
5165
5166 data |= CGCG_EN | CGLS_EN;
5167 } else {
Alex Deucherddc76ff2013-08-12 17:25:26 -04005168 cik_enable_gui_idle_interrupt(rdev, false);
5169
Alex Deucher22c775c2013-07-23 09:41:05 -04005170 RREG32(CB_CGTT_SCLK_CTRL);
5171 RREG32(CB_CGTT_SCLK_CTRL);
5172 RREG32(CB_CGTT_SCLK_CTRL);
5173 RREG32(CB_CGTT_SCLK_CTRL);
5174
5175 data &= ~(CGCG_EN | CGLS_EN);
5176 }
5177
5178 if (orig != data)
5179 WREG32(RLC_CGCG_CGLS_CTRL, data);
5180
5181}
5182
5183static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
5184{
5185 u32 data, orig, tmp = 0;
5186
Alex Deucher473359b2013-08-09 11:18:39 -04005187 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
5188 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
5189 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
5190 orig = data = RREG32(CP_MEM_SLP_CNTL);
5191 data |= CP_MEM_LS_EN;
5192 if (orig != data)
5193 WREG32(CP_MEM_SLP_CNTL, data);
5194 }
5195 }
Alex Deucher22c775c2013-07-23 09:41:05 -04005196
5197 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5198 data &= 0xfffffffd;
5199 if (orig != data)
5200 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5201
5202 tmp = cik_halt_rlc(rdev);
5203
5204 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5205 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5206 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5207 data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
5208 WREG32(RLC_SERDES_WR_CTRL, data);
5209
5210 cik_update_rlc(rdev, tmp);
5211
Alex Deucher473359b2013-08-09 11:18:39 -04005212 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
5213 orig = data = RREG32(CGTS_SM_CTRL_REG);
5214 data &= ~SM_MODE_MASK;
5215 data |= SM_MODE(0x2);
5216 data |= SM_MODE_ENABLE;
5217 data &= ~CGTS_OVERRIDE;
5218 if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
5219 (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
5220 data &= ~CGTS_LS_OVERRIDE;
5221 data &= ~ON_MONITOR_ADD_MASK;
5222 data |= ON_MONITOR_ADD_EN;
5223 data |= ON_MONITOR_ADD(0x96);
5224 if (orig != data)
5225 WREG32(CGTS_SM_CTRL_REG, data);
5226 }
Alex Deucher22c775c2013-07-23 09:41:05 -04005227 } else {
5228 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5229 data |= 0x00000002;
5230 if (orig != data)
5231 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5232
5233 data = RREG32(RLC_MEM_SLP_CNTL);
5234 if (data & RLC_MEM_LS_EN) {
5235 data &= ~RLC_MEM_LS_EN;
5236 WREG32(RLC_MEM_SLP_CNTL, data);
5237 }
5238
5239 data = RREG32(CP_MEM_SLP_CNTL);
5240 if (data & CP_MEM_LS_EN) {
5241 data &= ~CP_MEM_LS_EN;
5242 WREG32(CP_MEM_SLP_CNTL, data);
5243 }
5244
5245 orig = data = RREG32(CGTS_SM_CTRL_REG);
5246 data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
5247 if (orig != data)
5248 WREG32(CGTS_SM_CTRL_REG, data);
5249
5250 tmp = cik_halt_rlc(rdev);
5251
5252 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5253 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5254 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5255 data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
5256 WREG32(RLC_SERDES_WR_CTRL, data);
5257
5258 cik_update_rlc(rdev, tmp);
5259 }
5260}
5261
5262static const u32 mc_cg_registers[] =
5263{
5264 MC_HUB_MISC_HUB_CG,
5265 MC_HUB_MISC_SIP_CG,
5266 MC_HUB_MISC_VM_CG,
5267 MC_XPB_CLK_GAT,
5268 ATC_MISC_CG,
5269 MC_CITF_MISC_WR_CG,
5270 MC_CITF_MISC_RD_CG,
5271 MC_CITF_MISC_VM_CG,
5272 VM_L2_CG,
5273};
5274
5275static void cik_enable_mc_ls(struct radeon_device *rdev,
5276 bool enable)
5277{
5278 int i;
5279 u32 orig, data;
5280
5281 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5282 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04005283 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04005284 data |= MC_LS_ENABLE;
5285 else
5286 data &= ~MC_LS_ENABLE;
5287 if (data != orig)
5288 WREG32(mc_cg_registers[i], data);
5289 }
5290}
5291
5292static void cik_enable_mc_mgcg(struct radeon_device *rdev,
5293 bool enable)
5294{
5295 int i;
5296 u32 orig, data;
5297
5298 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5299 orig = data = RREG32(mc_cg_registers[i]);
Alex Deucher473359b2013-08-09 11:18:39 -04005300 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04005301 data |= MC_CG_ENABLE;
5302 else
5303 data &= ~MC_CG_ENABLE;
5304 if (data != orig)
5305 WREG32(mc_cg_registers[i], data);
5306 }
5307}
5308
5309static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
5310 bool enable)
5311{
5312 u32 orig, data;
5313
Alex Deucher473359b2013-08-09 11:18:39 -04005314 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04005315 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
5316 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
5317 } else {
5318 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
5319 data |= 0xff000000;
5320 if (data != orig)
5321 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
5322
5323 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
5324 data |= 0xff000000;
5325 if (data != orig)
5326 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
5327 }
5328}
5329
5330static void cik_enable_sdma_mgls(struct radeon_device *rdev,
5331 bool enable)
5332{
5333 u32 orig, data;
5334
Alex Deucher473359b2013-08-09 11:18:39 -04005335 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04005336 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
5337 data |= 0x100;
5338 if (orig != data)
5339 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
5340
5341 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
5342 data |= 0x100;
5343 if (orig != data)
5344 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
5345 } else {
5346 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
5347 data &= ~0x100;
5348 if (orig != data)
5349 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
5350
5351 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
5352 data &= ~0x100;
5353 if (orig != data)
5354 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
5355 }
5356}
5357
5358static void cik_enable_uvd_mgcg(struct radeon_device *rdev,
5359 bool enable)
5360{
5361 u32 orig, data;
5362
Alex Deucher473359b2013-08-09 11:18:39 -04005363 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04005364 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5365 data = 0xfff;
5366 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
5367
5368 orig = data = RREG32(UVD_CGC_CTRL);
5369 data |= DCM;
5370 if (orig != data)
5371 WREG32(UVD_CGC_CTRL, data);
5372 } else {
5373 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5374 data &= ~0xfff;
5375 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
5376
5377 orig = data = RREG32(UVD_CGC_CTRL);
5378 data &= ~DCM;
5379 if (orig != data)
5380 WREG32(UVD_CGC_CTRL, data);
5381 }
5382}
5383
Alex Deucher473359b2013-08-09 11:18:39 -04005384static void cik_enable_bif_mgls(struct radeon_device *rdev,
5385 bool enable)
5386{
5387 u32 orig, data;
5388
5389 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
5390
5391 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
5392 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
5393 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
5394 else
5395 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
5396 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
5397
5398 if (orig != data)
5399 WREG32_PCIE_PORT(PCIE_CNTL2, data);
5400}
5401
Alex Deucher22c775c2013-07-23 09:41:05 -04005402static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
5403 bool enable)
5404{
5405 u32 orig, data;
5406
5407 orig = data = RREG32(HDP_HOST_PATH_CNTL);
5408
Alex Deucher473359b2013-08-09 11:18:39 -04005409 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
Alex Deucher22c775c2013-07-23 09:41:05 -04005410 data &= ~CLOCK_GATING_DIS;
5411 else
5412 data |= CLOCK_GATING_DIS;
5413
5414 if (orig != data)
5415 WREG32(HDP_HOST_PATH_CNTL, data);
5416}
5417
5418static void cik_enable_hdp_ls(struct radeon_device *rdev,
5419 bool enable)
5420{
5421 u32 orig, data;
5422
5423 orig = data = RREG32(HDP_MEM_POWER_LS);
5424
Alex Deucher473359b2013-08-09 11:18:39 -04005425 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
Alex Deucher22c775c2013-07-23 09:41:05 -04005426 data |= HDP_LS_ENABLE;
5427 else
5428 data &= ~HDP_LS_ENABLE;
5429
5430 if (orig != data)
5431 WREG32(HDP_MEM_POWER_LS, data);
5432}
5433
5434void cik_update_cg(struct radeon_device *rdev,
5435 u32 block, bool enable)
5436{
Alex Deucher4214faf2013-09-03 10:17:13 -04005437
Alex Deucher22c775c2013-07-23 09:41:05 -04005438 if (block & RADEON_CG_BLOCK_GFX) {
Alex Deucher4214faf2013-09-03 10:17:13 -04005439 cik_enable_gui_idle_interrupt(rdev, false);
Alex Deucher22c775c2013-07-23 09:41:05 -04005440 /* order matters! */
5441 if (enable) {
5442 cik_enable_mgcg(rdev, true);
5443 cik_enable_cgcg(rdev, true);
5444 } else {
5445 cik_enable_cgcg(rdev, false);
5446 cik_enable_mgcg(rdev, false);
5447 }
Alex Deucher4214faf2013-09-03 10:17:13 -04005448 cik_enable_gui_idle_interrupt(rdev, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04005449 }
5450
5451 if (block & RADEON_CG_BLOCK_MC) {
5452 if (!(rdev->flags & RADEON_IS_IGP)) {
5453 cik_enable_mc_mgcg(rdev, enable);
5454 cik_enable_mc_ls(rdev, enable);
5455 }
5456 }
5457
5458 if (block & RADEON_CG_BLOCK_SDMA) {
5459 cik_enable_sdma_mgcg(rdev, enable);
5460 cik_enable_sdma_mgls(rdev, enable);
5461 }
5462
Alex Deucher473359b2013-08-09 11:18:39 -04005463 if (block & RADEON_CG_BLOCK_BIF) {
5464 cik_enable_bif_mgls(rdev, enable);
5465 }
5466
Alex Deucher22c775c2013-07-23 09:41:05 -04005467 if (block & RADEON_CG_BLOCK_UVD) {
5468 if (rdev->has_uvd)
5469 cik_enable_uvd_mgcg(rdev, enable);
5470 }
5471
5472 if (block & RADEON_CG_BLOCK_HDP) {
5473 cik_enable_hdp_mgcg(rdev, enable);
5474 cik_enable_hdp_ls(rdev, enable);
5475 }
5476}
5477
5478static void cik_init_cg(struct radeon_device *rdev)
5479{
5480
Alex Deucherddc76ff2013-08-12 17:25:26 -04005481 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
Alex Deucher22c775c2013-07-23 09:41:05 -04005482
5483 if (rdev->has_uvd)
5484 si_init_uvd_internal_cg(rdev);
5485
5486 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
5487 RADEON_CG_BLOCK_SDMA |
Alex Deucher473359b2013-08-09 11:18:39 -04005488 RADEON_CG_BLOCK_BIF |
Alex Deucher22c775c2013-07-23 09:41:05 -04005489 RADEON_CG_BLOCK_UVD |
5490 RADEON_CG_BLOCK_HDP), true);
5491}
5492
Alex Deucher473359b2013-08-09 11:18:39 -04005493static void cik_fini_cg(struct radeon_device *rdev)
5494{
5495 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
5496 RADEON_CG_BLOCK_SDMA |
5497 RADEON_CG_BLOCK_BIF |
5498 RADEON_CG_BLOCK_UVD |
5499 RADEON_CG_BLOCK_HDP), false);
5500
5501 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
5502}
5503
Alex Deucher22c775c2013-07-23 09:41:05 -04005504static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
5505 bool enable)
5506{
5507 u32 data, orig;
5508
5509 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005510 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04005511 data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
5512 else
5513 data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
5514 if (orig != data)
5515 WREG32(RLC_PG_CNTL, data);
5516}
5517
5518static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
5519 bool enable)
5520{
5521 u32 data, orig;
5522
5523 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005524 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
Alex Deucher22c775c2013-07-23 09:41:05 -04005525 data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
5526 else
5527 data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
5528 if (orig != data)
5529 WREG32(RLC_PG_CNTL, data);
5530}
5531
5532static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
5533{
5534 u32 data, orig;
5535
5536 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005537 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
Alex Deucher22c775c2013-07-23 09:41:05 -04005538 data &= ~DISABLE_CP_PG;
5539 else
5540 data |= DISABLE_CP_PG;
5541 if (orig != data)
5542 WREG32(RLC_PG_CNTL, data);
5543}
5544
5545static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
5546{
5547 u32 data, orig;
5548
5549 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005550 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
Alex Deucher22c775c2013-07-23 09:41:05 -04005551 data &= ~DISABLE_GDS_PG;
5552 else
5553 data |= DISABLE_GDS_PG;
5554 if (orig != data)
5555 WREG32(RLC_PG_CNTL, data);
5556}
5557
5558#define CP_ME_TABLE_SIZE 96
5559#define CP_ME_TABLE_OFFSET 2048
5560#define CP_MEC_TABLE_OFFSET 4096
5561
5562void cik_init_cp_pg_table(struct radeon_device *rdev)
5563{
5564 const __be32 *fw_data;
5565 volatile u32 *dst_ptr;
5566 int me, i, max_me = 4;
5567 u32 bo_offset = 0;
5568 u32 table_offset;
5569
5570 if (rdev->family == CHIP_KAVERI)
5571 max_me = 5;
5572
5573 if (rdev->rlc.cp_table_ptr == NULL)
5574 return;
5575
5576 /* write the cp table buffer */
5577 dst_ptr = rdev->rlc.cp_table_ptr;
5578 for (me = 0; me < max_me; me++) {
5579 if (me == 0) {
5580 fw_data = (const __be32 *)rdev->ce_fw->data;
5581 table_offset = CP_ME_TABLE_OFFSET;
5582 } else if (me == 1) {
5583 fw_data = (const __be32 *)rdev->pfp_fw->data;
5584 table_offset = CP_ME_TABLE_OFFSET;
5585 } else if (me == 2) {
5586 fw_data = (const __be32 *)rdev->me_fw->data;
5587 table_offset = CP_ME_TABLE_OFFSET;
5588 } else {
5589 fw_data = (const __be32 *)rdev->mec_fw->data;
5590 table_offset = CP_MEC_TABLE_OFFSET;
5591 }
5592
5593 for (i = 0; i < CP_ME_TABLE_SIZE; i ++) {
Alex Deucher6ba81e52013-10-23 18:27:10 -04005594 dst_ptr[bo_offset + i] = cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
Alex Deucher22c775c2013-07-23 09:41:05 -04005595 }
5596 bo_offset += CP_ME_TABLE_SIZE;
5597 }
5598}
5599
5600static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
5601 bool enable)
5602{
5603 u32 data, orig;
5604
Alex Deucher2b19d172013-09-04 16:58:29 -04005605 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
Alex Deucher22c775c2013-07-23 09:41:05 -04005606 orig = data = RREG32(RLC_PG_CNTL);
5607 data |= GFX_PG_ENABLE;
5608 if (orig != data)
5609 WREG32(RLC_PG_CNTL, data);
5610
5611 orig = data = RREG32(RLC_AUTO_PG_CTRL);
5612 data |= AUTO_PG_EN;
5613 if (orig != data)
5614 WREG32(RLC_AUTO_PG_CTRL, data);
5615 } else {
5616 orig = data = RREG32(RLC_PG_CNTL);
5617 data &= ~GFX_PG_ENABLE;
5618 if (orig != data)
5619 WREG32(RLC_PG_CNTL, data);
5620
5621 orig = data = RREG32(RLC_AUTO_PG_CTRL);
5622 data &= ~AUTO_PG_EN;
5623 if (orig != data)
5624 WREG32(RLC_AUTO_PG_CTRL, data);
5625
5626 data = RREG32(DB_RENDER_CONTROL);
5627 }
5628}
5629
5630static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
5631{
5632 u32 mask = 0, tmp, tmp1;
5633 int i;
5634
5635 cik_select_se_sh(rdev, se, sh);
5636 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
5637 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
5638 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5639
5640 tmp &= 0xffff0000;
5641
5642 tmp |= tmp1;
5643 tmp >>= 16;
5644
5645 for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
5646 mask <<= 1;
5647 mask |= 1;
5648 }
5649
5650 return (~tmp) & mask;
5651}
5652
5653static void cik_init_ao_cu_mask(struct radeon_device *rdev)
5654{
5655 u32 i, j, k, active_cu_number = 0;
5656 u32 mask, counter, cu_bitmap;
5657 u32 tmp = 0;
5658
5659 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
5660 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
5661 mask = 1;
5662 cu_bitmap = 0;
5663 counter = 0;
5664 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
5665 if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
5666 if (counter < 2)
5667 cu_bitmap |= mask;
5668 counter ++;
5669 }
5670 mask <<= 1;
5671 }
5672
5673 active_cu_number += counter;
5674 tmp |= (cu_bitmap << (i * 16 + j * 8));
5675 }
5676 }
5677
5678 WREG32(RLC_PG_AO_CU_MASK, tmp);
5679
5680 tmp = RREG32(RLC_MAX_PG_CU);
5681 tmp &= ~MAX_PU_CU_MASK;
5682 tmp |= MAX_PU_CU(active_cu_number);
5683 WREG32(RLC_MAX_PG_CU, tmp);
5684}
5685
5686static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
5687 bool enable)
5688{
5689 u32 data, orig;
5690
5691 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005692 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04005693 data |= STATIC_PER_CU_PG_ENABLE;
5694 else
5695 data &= ~STATIC_PER_CU_PG_ENABLE;
5696 if (orig != data)
5697 WREG32(RLC_PG_CNTL, data);
5698}
5699
5700static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
5701 bool enable)
5702{
5703 u32 data, orig;
5704
5705 orig = data = RREG32(RLC_PG_CNTL);
Alex Deucher473359b2013-08-09 11:18:39 -04005706 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
Alex Deucher22c775c2013-07-23 09:41:05 -04005707 data |= DYN_PER_CU_PG_ENABLE;
5708 else
5709 data &= ~DYN_PER_CU_PG_ENABLE;
5710 if (orig != data)
5711 WREG32(RLC_PG_CNTL, data);
5712}
5713
5714#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
5715#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
5716
5717static void cik_init_gfx_cgpg(struct radeon_device *rdev)
5718{
5719 u32 data, orig;
5720 u32 i;
5721
5722 if (rdev->rlc.cs_data) {
5723 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
5724 WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deuchera0f38602013-08-22 11:57:46 -04005725 WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
Alex Deucher22c775c2013-07-23 09:41:05 -04005726 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
5727 } else {
5728 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
5729 for (i = 0; i < 3; i++)
5730 WREG32(RLC_GPM_SCRATCH_DATA, 0);
5731 }
5732 if (rdev->rlc.reg_list) {
5733 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
5734 for (i = 0; i < rdev->rlc.reg_list_size; i++)
5735 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
5736 }
5737
5738 orig = data = RREG32(RLC_PG_CNTL);
5739 data |= GFX_PG_SRC;
5740 if (orig != data)
5741 WREG32(RLC_PG_CNTL, data);
5742
5743 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5744 WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
5745
5746 data = RREG32(CP_RB_WPTR_POLL_CNTL);
5747 data &= ~IDLE_POLL_COUNT_MASK;
5748 data |= IDLE_POLL_COUNT(0x60);
5749 WREG32(CP_RB_WPTR_POLL_CNTL, data);
5750
5751 data = 0x10101010;
5752 WREG32(RLC_PG_DELAY, data);
5753
5754 data = RREG32(RLC_PG_DELAY_2);
5755 data &= ~0xff;
5756 data |= 0x3;
5757 WREG32(RLC_PG_DELAY_2, data);
5758
5759 data = RREG32(RLC_AUTO_PG_CTRL);
5760 data &= ~GRBM_REG_SGIT_MASK;
5761 data |= GRBM_REG_SGIT(0x700);
5762 WREG32(RLC_AUTO_PG_CTRL, data);
5763
5764}
5765
5766static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
5767{
Alex Deucher473359b2013-08-09 11:18:39 -04005768 cik_enable_gfx_cgpg(rdev, enable);
5769 cik_enable_gfx_static_mgpg(rdev, enable);
5770 cik_enable_gfx_dynamic_mgpg(rdev, enable);
Alex Deucher22c775c2013-07-23 09:41:05 -04005771}
5772
Alex Deuchera0f38602013-08-22 11:57:46 -04005773u32 cik_get_csb_size(struct radeon_device *rdev)
5774{
5775 u32 count = 0;
5776 const struct cs_section_def *sect = NULL;
5777 const struct cs_extent_def *ext = NULL;
5778
5779 if (rdev->rlc.cs_data == NULL)
5780 return 0;
5781
5782 /* begin clear state */
5783 count += 2;
5784 /* context control state */
5785 count += 3;
5786
5787 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5788 for (ext = sect->section; ext->extent != NULL; ++ext) {
5789 if (sect->id == SECT_CONTEXT)
5790 count += 2 + ext->reg_count;
5791 else
5792 return 0;
5793 }
5794 }
5795 /* pa_sc_raster_config/pa_sc_raster_config1 */
5796 count += 4;
5797 /* end clear state */
5798 count += 2;
5799 /* clear state */
5800 count += 2;
5801
5802 return count;
5803}
5804
5805void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
5806{
5807 u32 count = 0, i;
5808 const struct cs_section_def *sect = NULL;
5809 const struct cs_extent_def *ext = NULL;
5810
5811 if (rdev->rlc.cs_data == NULL)
5812 return;
5813 if (buffer == NULL)
5814 return;
5815
Alex Deucher6ba81e52013-10-23 18:27:10 -04005816 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5817 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04005818
Alex Deucher6ba81e52013-10-23 18:27:10 -04005819 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
5820 buffer[count++] = cpu_to_le32(0x80000000);
5821 buffer[count++] = cpu_to_le32(0x80000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005822
5823 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5824 for (ext = sect->section; ext->extent != NULL; ++ext) {
5825 if (sect->id == SECT_CONTEXT) {
Alex Deucher6ba81e52013-10-23 18:27:10 -04005826 buffer[count++] =
5827 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
5828 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005829 for (i = 0; i < ext->reg_count; i++)
Alex Deucher6ba81e52013-10-23 18:27:10 -04005830 buffer[count++] = cpu_to_le32(ext->extent[i]);
Alex Deuchera0f38602013-08-22 11:57:46 -04005831 } else {
5832 return;
5833 }
5834 }
5835 }
5836
Alex Deucher6ba81e52013-10-23 18:27:10 -04005837 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
5838 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
Alex Deuchera0f38602013-08-22 11:57:46 -04005839 switch (rdev->family) {
5840 case CHIP_BONAIRE:
Alex Deucher6ba81e52013-10-23 18:27:10 -04005841 buffer[count++] = cpu_to_le32(0x16000012);
5842 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005843 break;
5844 case CHIP_KAVERI:
Alex Deucher6ba81e52013-10-23 18:27:10 -04005845 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
5846 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005847 break;
5848 case CHIP_KABINI:
Alex Deucher6ba81e52013-10-23 18:27:10 -04005849 buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
5850 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005851 break;
5852 default:
Alex Deucher6ba81e52013-10-23 18:27:10 -04005853 buffer[count++] = cpu_to_le32(0x00000000);
5854 buffer[count++] = cpu_to_le32(0x00000000);
Alex Deuchera0f38602013-08-22 11:57:46 -04005855 break;
5856 }
5857
Alex Deucher6ba81e52013-10-23 18:27:10 -04005858 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5859 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
Alex Deuchera0f38602013-08-22 11:57:46 -04005860
Alex Deucher6ba81e52013-10-23 18:27:10 -04005861 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
5862 buffer[count++] = cpu_to_le32(0);
Alex Deuchera0f38602013-08-22 11:57:46 -04005863}
5864
Alex Deucher473359b2013-08-09 11:18:39 -04005865static void cik_init_pg(struct radeon_device *rdev)
Alex Deucher22c775c2013-07-23 09:41:05 -04005866{
Alex Deucher473359b2013-08-09 11:18:39 -04005867 if (rdev->pg_flags) {
Alex Deucher22c775c2013-07-23 09:41:05 -04005868 cik_enable_sck_slowdown_on_pu(rdev, true);
5869 cik_enable_sck_slowdown_on_pd(rdev, true);
Alex Deucher2b19d172013-09-04 16:58:29 -04005870 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04005871 cik_init_gfx_cgpg(rdev);
5872 cik_enable_cp_pg(rdev, true);
5873 cik_enable_gds_pg(rdev, true);
5874 }
Alex Deucher22c775c2013-07-23 09:41:05 -04005875 cik_init_ao_cu_mask(rdev);
5876 cik_update_gfx_pg(rdev, true);
5877 }
5878}
5879
Alex Deucher473359b2013-08-09 11:18:39 -04005880static void cik_fini_pg(struct radeon_device *rdev)
5881{
5882 if (rdev->pg_flags) {
5883 cik_update_gfx_pg(rdev, false);
Alex Deucher2b19d172013-09-04 16:58:29 -04005884 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
Alex Deucher473359b2013-08-09 11:18:39 -04005885 cik_enable_cp_pg(rdev, false);
5886 cik_enable_gds_pg(rdev, false);
5887 }
5888 }
5889}
5890
Alex Deuchera59781b2012-11-09 10:45:57 -05005891/*
5892 * Interrupts
5893 * Starting with r6xx, interrupts are handled via a ring buffer.
5894 * Ring buffers are areas of GPU accessible memory that the GPU
5895 * writes interrupt vectors into and the host reads vectors out of.
5896 * There is a rptr (read pointer) that determines where the
5897 * host is currently reading, and a wptr (write pointer)
5898 * which determines where the GPU has written. When the
5899 * pointers are equal, the ring is idle. When the GPU
5900 * writes vectors to the ring buffer, it increments the
5901 * wptr. When there is an interrupt, the host then starts
5902 * fetching commands and processing them until the pointers are
5903 * equal again at which point it updates the rptr.
5904 */
5905
5906/**
5907 * cik_enable_interrupts - Enable the interrupt ring buffer
5908 *
5909 * @rdev: radeon_device pointer
5910 *
5911 * Enable the interrupt ring buffer (CIK).
5912 */
5913static void cik_enable_interrupts(struct radeon_device *rdev)
5914{
5915 u32 ih_cntl = RREG32(IH_CNTL);
5916 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5917
5918 ih_cntl |= ENABLE_INTR;
5919 ih_rb_cntl |= IH_RB_ENABLE;
5920 WREG32(IH_CNTL, ih_cntl);
5921 WREG32(IH_RB_CNTL, ih_rb_cntl);
5922 rdev->ih.enabled = true;
5923}
5924
5925/**
5926 * cik_disable_interrupts - Disable the interrupt ring buffer
5927 *
5928 * @rdev: radeon_device pointer
5929 *
5930 * Disable the interrupt ring buffer (CIK).
5931 */
5932static void cik_disable_interrupts(struct radeon_device *rdev)
5933{
5934 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5935 u32 ih_cntl = RREG32(IH_CNTL);
5936
5937 ih_rb_cntl &= ~IH_RB_ENABLE;
5938 ih_cntl &= ~ENABLE_INTR;
5939 WREG32(IH_RB_CNTL, ih_rb_cntl);
5940 WREG32(IH_CNTL, ih_cntl);
5941 /* set rptr, wptr to 0 */
5942 WREG32(IH_RB_RPTR, 0);
5943 WREG32(IH_RB_WPTR, 0);
5944 rdev->ih.enabled = false;
5945 rdev->ih.rptr = 0;
5946}
5947
5948/**
5949 * cik_disable_interrupt_state - Disable all interrupt sources
5950 *
5951 * @rdev: radeon_device pointer
5952 *
5953 * Clear all interrupt enable bits used by the driver (CIK).
5954 */
5955static void cik_disable_interrupt_state(struct radeon_device *rdev)
5956{
5957 u32 tmp;
5958
5959 /* gfx ring */
Alex Deucher4214faf2013-09-03 10:17:13 -04005960 tmp = RREG32(CP_INT_CNTL_RING0) &
5961 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5962 WREG32(CP_INT_CNTL_RING0, tmp);
Alex Deucher21a93e12013-04-09 12:47:11 -04005963 /* sdma */
5964 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5965 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5966 tmp = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5967 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, tmp);
Alex Deuchera59781b2012-11-09 10:45:57 -05005968 /* compute queues */
5969 WREG32(CP_ME1_PIPE0_INT_CNTL, 0);
5970 WREG32(CP_ME1_PIPE1_INT_CNTL, 0);
5971 WREG32(CP_ME1_PIPE2_INT_CNTL, 0);
5972 WREG32(CP_ME1_PIPE3_INT_CNTL, 0);
5973 WREG32(CP_ME2_PIPE0_INT_CNTL, 0);
5974 WREG32(CP_ME2_PIPE1_INT_CNTL, 0);
5975 WREG32(CP_ME2_PIPE2_INT_CNTL, 0);
5976 WREG32(CP_ME2_PIPE3_INT_CNTL, 0);
5977 /* grbm */
5978 WREG32(GRBM_INT_CNTL, 0);
5979 /* vline/vblank, etc. */
5980 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
5981 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
5982 if (rdev->num_crtc >= 4) {
5983 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
5984 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
5985 }
5986 if (rdev->num_crtc >= 6) {
5987 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
5988 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
5989 }
5990
5991 /* dac hotplug */
5992 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
5993
5994 /* digital hotplug */
5995 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5996 WREG32(DC_HPD1_INT_CONTROL, tmp);
5997 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5998 WREG32(DC_HPD2_INT_CONTROL, tmp);
5999 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
6000 WREG32(DC_HPD3_INT_CONTROL, tmp);
6001 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
6002 WREG32(DC_HPD4_INT_CONTROL, tmp);
6003 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
6004 WREG32(DC_HPD5_INT_CONTROL, tmp);
6005 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
6006 WREG32(DC_HPD6_INT_CONTROL, tmp);
6007
6008}
6009
6010/**
6011 * cik_irq_init - init and enable the interrupt ring
6012 *
6013 * @rdev: radeon_device pointer
6014 *
6015 * Allocate a ring buffer for the interrupt controller,
6016 * enable the RLC, disable interrupts, enable the IH
6017 * ring buffer and enable it (CIK).
6018 * Called at device load and reume.
6019 * Returns 0 for success, errors for failure.
6020 */
6021static int cik_irq_init(struct radeon_device *rdev)
6022{
6023 int ret = 0;
6024 int rb_bufsz;
6025 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
6026
6027 /* allocate ring */
6028 ret = r600_ih_ring_alloc(rdev);
6029 if (ret)
6030 return ret;
6031
6032 /* disable irqs */
6033 cik_disable_interrupts(rdev);
6034
6035 /* init rlc */
6036 ret = cik_rlc_resume(rdev);
6037 if (ret) {
6038 r600_ih_ring_fini(rdev);
6039 return ret;
6040 }
6041
6042 /* setup interrupt control */
6043 /* XXX this should actually be a bus address, not an MC address. same on older asics */
6044 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
6045 interrupt_cntl = RREG32(INTERRUPT_CNTL);
6046 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
6047 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
6048 */
6049 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
6050 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
6051 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
6052 WREG32(INTERRUPT_CNTL, interrupt_cntl);
6053
6054 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
Daniel Vetterb72a8922013-07-10 14:11:59 +02006055 rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
Alex Deuchera59781b2012-11-09 10:45:57 -05006056
6057 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
6058 IH_WPTR_OVERFLOW_CLEAR |
6059 (rb_bufsz << 1));
6060
6061 if (rdev->wb.enabled)
6062 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
6063
6064 /* set the writeback address whether it's enabled or not */
6065 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
6066 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
6067
6068 WREG32(IH_RB_CNTL, ih_rb_cntl);
6069
6070 /* set rptr, wptr to 0 */
6071 WREG32(IH_RB_RPTR, 0);
6072 WREG32(IH_RB_WPTR, 0);
6073
6074 /* Default settings for IH_CNTL (disabled at first) */
6075 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
6076 /* RPTR_REARM only works if msi's are enabled */
6077 if (rdev->msi_enabled)
6078 ih_cntl |= RPTR_REARM;
6079 WREG32(IH_CNTL, ih_cntl);
6080
6081 /* force the active interrupt state to all disabled */
6082 cik_disable_interrupt_state(rdev);
6083
6084 pci_set_master(rdev->pdev);
6085
6086 /* enable irqs */
6087 cik_enable_interrupts(rdev);
6088
6089 return ret;
6090}
6091
6092/**
6093 * cik_irq_set - enable/disable interrupt sources
6094 *
6095 * @rdev: radeon_device pointer
6096 *
6097 * Enable interrupt sources on the GPU (vblanks, hpd,
6098 * etc.) (CIK).
6099 * Returns 0 for success, errors for failure.
6100 */
6101int cik_irq_set(struct radeon_device *rdev)
6102{
Alex Deucher4214faf2013-09-03 10:17:13 -04006103 u32 cp_int_cntl;
Alex Deucher2b0781a2013-04-09 14:26:16 -04006104 u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
6105 u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
Alex Deuchera59781b2012-11-09 10:45:57 -05006106 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
6107 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
6108 u32 grbm_int_cntl = 0;
Alex Deucher21a93e12013-04-09 12:47:11 -04006109 u32 dma_cntl, dma_cntl1;
Alex Deucher41a524a2013-08-14 01:01:40 -04006110 u32 thermal_int;
Alex Deuchera59781b2012-11-09 10:45:57 -05006111
6112 if (!rdev->irq.installed) {
6113 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
6114 return -EINVAL;
6115 }
6116 /* don't enable anything if the ih is disabled */
6117 if (!rdev->ih.enabled) {
6118 cik_disable_interrupts(rdev);
6119 /* force the active interrupt state to all disabled */
6120 cik_disable_interrupt_state(rdev);
6121 return 0;
6122 }
6123
Alex Deucher4214faf2013-09-03 10:17:13 -04006124 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
6125 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6126 cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
6127
Alex Deuchera59781b2012-11-09 10:45:57 -05006128 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
6129 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
6130 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
6131 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
6132 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
6133 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
6134
Alex Deucher21a93e12013-04-09 12:47:11 -04006135 dma_cntl = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
6136 dma_cntl1 = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
6137
Alex Deucher2b0781a2013-04-09 14:26:16 -04006138 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6139 cp_m1p1 = RREG32(CP_ME1_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6140 cp_m1p2 = RREG32(CP_ME1_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6141 cp_m1p3 = RREG32(CP_ME1_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6142 cp_m2p0 = RREG32(CP_ME2_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6143 cp_m2p1 = RREG32(CP_ME2_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6144 cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6145 cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
6146
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04006147 if (rdev->flags & RADEON_IS_IGP)
6148 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
6149 ~(THERM_INTH_MASK | THERM_INTL_MASK);
6150 else
6151 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
6152 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
Alex Deucher41a524a2013-08-14 01:01:40 -04006153
Alex Deuchera59781b2012-11-09 10:45:57 -05006154 /* enable CP interrupts on all rings */
6155 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
6156 DRM_DEBUG("cik_irq_set: sw int gfx\n");
6157 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
6158 }
Alex Deucher2b0781a2013-04-09 14:26:16 -04006159 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
6160 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6161 DRM_DEBUG("si_irq_set: sw int cp1\n");
6162 if (ring->me == 1) {
6163 switch (ring->pipe) {
6164 case 0:
6165 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
6166 break;
6167 case 1:
6168 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
6169 break;
6170 case 2:
6171 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
6172 break;
6173 case 3:
6174 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
6175 break;
6176 default:
6177 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
6178 break;
6179 }
6180 } else if (ring->me == 2) {
6181 switch (ring->pipe) {
6182 case 0:
6183 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
6184 break;
6185 case 1:
6186 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
6187 break;
6188 case 2:
6189 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
6190 break;
6191 case 3:
6192 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
6193 break;
6194 default:
6195 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
6196 break;
6197 }
6198 } else {
6199 DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring->me);
6200 }
6201 }
6202 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
6203 struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6204 DRM_DEBUG("si_irq_set: sw int cp2\n");
6205 if (ring->me == 1) {
6206 switch (ring->pipe) {
6207 case 0:
6208 cp_m1p0 |= TIME_STAMP_INT_ENABLE;
6209 break;
6210 case 1:
6211 cp_m1p1 |= TIME_STAMP_INT_ENABLE;
6212 break;
6213 case 2:
6214 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
6215 break;
6216 case 3:
6217 cp_m1p2 |= TIME_STAMP_INT_ENABLE;
6218 break;
6219 default:
6220 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
6221 break;
6222 }
6223 } else if (ring->me == 2) {
6224 switch (ring->pipe) {
6225 case 0:
6226 cp_m2p0 |= TIME_STAMP_INT_ENABLE;
6227 break;
6228 case 1:
6229 cp_m2p1 |= TIME_STAMP_INT_ENABLE;
6230 break;
6231 case 2:
6232 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
6233 break;
6234 case 3:
6235 cp_m2p2 |= TIME_STAMP_INT_ENABLE;
6236 break;
6237 default:
6238 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
6239 break;
6240 }
6241 } else {
6242 DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring->me);
6243 }
6244 }
Alex Deuchera59781b2012-11-09 10:45:57 -05006245
Alex Deucher21a93e12013-04-09 12:47:11 -04006246 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
6247 DRM_DEBUG("cik_irq_set: sw int dma\n");
6248 dma_cntl |= TRAP_ENABLE;
6249 }
6250
6251 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
6252 DRM_DEBUG("cik_irq_set: sw int dma1\n");
6253 dma_cntl1 |= TRAP_ENABLE;
6254 }
6255
Alex Deuchera59781b2012-11-09 10:45:57 -05006256 if (rdev->irq.crtc_vblank_int[0] ||
6257 atomic_read(&rdev->irq.pflip[0])) {
6258 DRM_DEBUG("cik_irq_set: vblank 0\n");
6259 crtc1 |= VBLANK_INTERRUPT_MASK;
6260 }
6261 if (rdev->irq.crtc_vblank_int[1] ||
6262 atomic_read(&rdev->irq.pflip[1])) {
6263 DRM_DEBUG("cik_irq_set: vblank 1\n");
6264 crtc2 |= VBLANK_INTERRUPT_MASK;
6265 }
6266 if (rdev->irq.crtc_vblank_int[2] ||
6267 atomic_read(&rdev->irq.pflip[2])) {
6268 DRM_DEBUG("cik_irq_set: vblank 2\n");
6269 crtc3 |= VBLANK_INTERRUPT_MASK;
6270 }
6271 if (rdev->irq.crtc_vblank_int[3] ||
6272 atomic_read(&rdev->irq.pflip[3])) {
6273 DRM_DEBUG("cik_irq_set: vblank 3\n");
6274 crtc4 |= VBLANK_INTERRUPT_MASK;
6275 }
6276 if (rdev->irq.crtc_vblank_int[4] ||
6277 atomic_read(&rdev->irq.pflip[4])) {
6278 DRM_DEBUG("cik_irq_set: vblank 4\n");
6279 crtc5 |= VBLANK_INTERRUPT_MASK;
6280 }
6281 if (rdev->irq.crtc_vblank_int[5] ||
6282 atomic_read(&rdev->irq.pflip[5])) {
6283 DRM_DEBUG("cik_irq_set: vblank 5\n");
6284 crtc6 |= VBLANK_INTERRUPT_MASK;
6285 }
6286 if (rdev->irq.hpd[0]) {
6287 DRM_DEBUG("cik_irq_set: hpd 1\n");
6288 hpd1 |= DC_HPDx_INT_EN;
6289 }
6290 if (rdev->irq.hpd[1]) {
6291 DRM_DEBUG("cik_irq_set: hpd 2\n");
6292 hpd2 |= DC_HPDx_INT_EN;
6293 }
6294 if (rdev->irq.hpd[2]) {
6295 DRM_DEBUG("cik_irq_set: hpd 3\n");
6296 hpd3 |= DC_HPDx_INT_EN;
6297 }
6298 if (rdev->irq.hpd[3]) {
6299 DRM_DEBUG("cik_irq_set: hpd 4\n");
6300 hpd4 |= DC_HPDx_INT_EN;
6301 }
6302 if (rdev->irq.hpd[4]) {
6303 DRM_DEBUG("cik_irq_set: hpd 5\n");
6304 hpd5 |= DC_HPDx_INT_EN;
6305 }
6306 if (rdev->irq.hpd[5]) {
6307 DRM_DEBUG("cik_irq_set: hpd 6\n");
6308 hpd6 |= DC_HPDx_INT_EN;
6309 }
6310
Alex Deucher41a524a2013-08-14 01:01:40 -04006311 if (rdev->irq.dpm_thermal) {
6312 DRM_DEBUG("dpm thermal\n");
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04006313 if (rdev->flags & RADEON_IS_IGP)
6314 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
6315 else
6316 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
Alex Deucher41a524a2013-08-14 01:01:40 -04006317 }
6318
Alex Deuchera59781b2012-11-09 10:45:57 -05006319 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
6320
Alex Deucher21a93e12013-04-09 12:47:11 -04006321 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
6322 WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, dma_cntl1);
6323
Alex Deucher2b0781a2013-04-09 14:26:16 -04006324 WREG32(CP_ME1_PIPE0_INT_CNTL, cp_m1p0);
6325 WREG32(CP_ME1_PIPE1_INT_CNTL, cp_m1p1);
6326 WREG32(CP_ME1_PIPE2_INT_CNTL, cp_m1p2);
6327 WREG32(CP_ME1_PIPE3_INT_CNTL, cp_m1p3);
6328 WREG32(CP_ME2_PIPE0_INT_CNTL, cp_m2p0);
6329 WREG32(CP_ME2_PIPE1_INT_CNTL, cp_m2p1);
6330 WREG32(CP_ME2_PIPE2_INT_CNTL, cp_m2p2);
6331 WREG32(CP_ME2_PIPE3_INT_CNTL, cp_m2p3);
6332
Alex Deuchera59781b2012-11-09 10:45:57 -05006333 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
6334
6335 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
6336 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
6337 if (rdev->num_crtc >= 4) {
6338 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
6339 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
6340 }
6341 if (rdev->num_crtc >= 6) {
6342 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
6343 WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
6344 }
6345
6346 WREG32(DC_HPD1_INT_CONTROL, hpd1);
6347 WREG32(DC_HPD2_INT_CONTROL, hpd2);
6348 WREG32(DC_HPD3_INT_CONTROL, hpd3);
6349 WREG32(DC_HPD4_INT_CONTROL, hpd4);
6350 WREG32(DC_HPD5_INT_CONTROL, hpd5);
6351 WREG32(DC_HPD6_INT_CONTROL, hpd6);
6352
Alex Deuchercc8dbbb2013-08-14 01:03:41 -04006353 if (rdev->flags & RADEON_IS_IGP)
6354 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
6355 else
6356 WREG32_SMC(CG_THERMAL_INT, thermal_int);
Alex Deucher41a524a2013-08-14 01:01:40 -04006357
Alex Deuchera59781b2012-11-09 10:45:57 -05006358 return 0;
6359}
6360
6361/**
6362 * cik_irq_ack - ack interrupt sources
6363 *
6364 * @rdev: radeon_device pointer
6365 *
6366 * Ack interrupt sources on the GPU (vblanks, hpd,
6367 * etc.) (CIK). Certain interrupts sources are sw
6368 * generated and do not require an explicit ack.
6369 */
6370static inline void cik_irq_ack(struct radeon_device *rdev)
6371{
6372 u32 tmp;
6373
6374 rdev->irq.stat_regs.cik.disp_int = RREG32(DISP_INTERRUPT_STATUS);
6375 rdev->irq.stat_regs.cik.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
6376 rdev->irq.stat_regs.cik.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
6377 rdev->irq.stat_regs.cik.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
6378 rdev->irq.stat_regs.cik.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
6379 rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
6380 rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
6381
6382 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
6383 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
6384 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
6385 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
6386 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
6387 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
6388 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)
6389 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
6390
6391 if (rdev->num_crtc >= 4) {
6392 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
6393 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
6394 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
6395 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
6396 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
6397 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
6398 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
6399 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
6400 }
6401
6402 if (rdev->num_crtc >= 6) {
6403 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
6404 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
6405 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
6406 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
6407 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
6408 WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
6409 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
6410 WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
6411 }
6412
6413 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
6414 tmp = RREG32(DC_HPD1_INT_CONTROL);
6415 tmp |= DC_HPDx_INT_ACK;
6416 WREG32(DC_HPD1_INT_CONTROL, tmp);
6417 }
6418 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
6419 tmp = RREG32(DC_HPD2_INT_CONTROL);
6420 tmp |= DC_HPDx_INT_ACK;
6421 WREG32(DC_HPD2_INT_CONTROL, tmp);
6422 }
6423 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
6424 tmp = RREG32(DC_HPD3_INT_CONTROL);
6425 tmp |= DC_HPDx_INT_ACK;
6426 WREG32(DC_HPD3_INT_CONTROL, tmp);
6427 }
6428 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
6429 tmp = RREG32(DC_HPD4_INT_CONTROL);
6430 tmp |= DC_HPDx_INT_ACK;
6431 WREG32(DC_HPD4_INT_CONTROL, tmp);
6432 }
6433 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
6434 tmp = RREG32(DC_HPD5_INT_CONTROL);
6435 tmp |= DC_HPDx_INT_ACK;
6436 WREG32(DC_HPD5_INT_CONTROL, tmp);
6437 }
6438 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6439 tmp = RREG32(DC_HPD5_INT_CONTROL);
6440 tmp |= DC_HPDx_INT_ACK;
6441 WREG32(DC_HPD6_INT_CONTROL, tmp);
6442 }
6443}
6444
6445/**
6446 * cik_irq_disable - disable interrupts
6447 *
6448 * @rdev: radeon_device pointer
6449 *
6450 * Disable interrupts on the hw (CIK).
6451 */
6452static void cik_irq_disable(struct radeon_device *rdev)
6453{
6454 cik_disable_interrupts(rdev);
6455 /* Wait and acknowledge irq */
6456 mdelay(1);
6457 cik_irq_ack(rdev);
6458 cik_disable_interrupt_state(rdev);
6459}
6460
6461/**
6462 * cik_irq_disable - disable interrupts for suspend
6463 *
6464 * @rdev: radeon_device pointer
6465 *
6466 * Disable interrupts and stop the RLC (CIK).
6467 * Used for suspend.
6468 */
6469static void cik_irq_suspend(struct radeon_device *rdev)
6470{
6471 cik_irq_disable(rdev);
6472 cik_rlc_stop(rdev);
6473}
6474
6475/**
6476 * cik_irq_fini - tear down interrupt support
6477 *
6478 * @rdev: radeon_device pointer
6479 *
6480 * Disable interrupts on the hw and free the IH ring
6481 * buffer (CIK).
6482 * Used for driver unload.
6483 */
6484static void cik_irq_fini(struct radeon_device *rdev)
6485{
6486 cik_irq_suspend(rdev);
6487 r600_ih_ring_fini(rdev);
6488}
6489
6490/**
6491 * cik_get_ih_wptr - get the IH ring buffer wptr
6492 *
6493 * @rdev: radeon_device pointer
6494 *
6495 * Get the IH ring buffer wptr from either the register
6496 * or the writeback memory buffer (CIK). Also check for
6497 * ring buffer overflow and deal with it.
6498 * Used by cik_irq_process().
6499 * Returns the value of the wptr.
6500 */
6501static inline u32 cik_get_ih_wptr(struct radeon_device *rdev)
6502{
6503 u32 wptr, tmp;
6504
6505 if (rdev->wb.enabled)
6506 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
6507 else
6508 wptr = RREG32(IH_RB_WPTR);
6509
6510 if (wptr & RB_OVERFLOW) {
6511 /* When a ring buffer overflow happen start parsing interrupt
6512 * from the last not overwritten vector (wptr + 16). Hopefully
6513 * this should allow us to catchup.
6514 */
6515 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n",
6516 wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
6517 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
6518 tmp = RREG32(IH_RB_CNTL);
6519 tmp |= IH_WPTR_OVERFLOW_CLEAR;
6520 WREG32(IH_RB_CNTL, tmp);
6521 }
6522 return (wptr & rdev->ih.ptr_mask);
6523}
6524
6525/* CIK IV Ring
6526 * Each IV ring entry is 128 bits:
6527 * [7:0] - interrupt source id
6528 * [31:8] - reserved
6529 * [59:32] - interrupt source data
6530 * [63:60] - reserved
Alex Deucher21a93e12013-04-09 12:47:11 -04006531 * [71:64] - RINGID
6532 * CP:
6533 * ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
Alex Deuchera59781b2012-11-09 10:45:57 -05006534 * QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
6535 * - for gfx, hw shader state (0=PS...5=LS, 6=CS)
6536 * ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
6537 * PIPE_ID - ME0 0=3D
6538 * - ME1&2 compute dispatcher (4 pipes each)
Alex Deucher21a93e12013-04-09 12:47:11 -04006539 * SDMA:
6540 * INSTANCE_ID [1:0], QUEUE_ID[1:0]
6541 * INSTANCE_ID - 0 = sdma0, 1 = sdma1
6542 * QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
Alex Deuchera59781b2012-11-09 10:45:57 -05006543 * [79:72] - VMID
6544 * [95:80] - PASID
6545 * [127:96] - reserved
6546 */
6547/**
6548 * cik_irq_process - interrupt handler
6549 *
6550 * @rdev: radeon_device pointer
6551 *
6552 * Interrupt hander (CIK). Walk the IH ring,
6553 * ack interrupts and schedule work to handle
6554 * interrupt events.
6555 * Returns irq process return code.
6556 */
6557int cik_irq_process(struct radeon_device *rdev)
6558{
Alex Deucher2b0781a2013-04-09 14:26:16 -04006559 struct radeon_ring *cp1_ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6560 struct radeon_ring *cp2_ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
Alex Deuchera59781b2012-11-09 10:45:57 -05006561 u32 wptr;
6562 u32 rptr;
6563 u32 src_id, src_data, ring_id;
6564 u8 me_id, pipe_id, queue_id;
6565 u32 ring_index;
6566 bool queue_hotplug = false;
6567 bool queue_reset = false;
Alex Deucher3ec7d112013-06-14 10:42:22 -04006568 u32 addr, status, mc_client;
Alex Deucher41a524a2013-08-14 01:01:40 -04006569 bool queue_thermal = false;
Alex Deuchera59781b2012-11-09 10:45:57 -05006570
6571 if (!rdev->ih.enabled || rdev->shutdown)
6572 return IRQ_NONE;
6573
6574 wptr = cik_get_ih_wptr(rdev);
6575
6576restart_ih:
6577 /* is somebody else already processing irqs? */
6578 if (atomic_xchg(&rdev->ih.lock, 1))
6579 return IRQ_NONE;
6580
6581 rptr = rdev->ih.rptr;
6582 DRM_DEBUG("cik_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
6583
6584 /* Order reading of wptr vs. reading of IH ring data */
6585 rmb();
6586
6587 /* display interrupts */
6588 cik_irq_ack(rdev);
6589
6590 while (rptr != wptr) {
6591 /* wptr/rptr are in bytes! */
6592 ring_index = rptr / 4;
6593 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
6594 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
6595 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
Alex Deuchera59781b2012-11-09 10:45:57 -05006596
6597 switch (src_id) {
6598 case 1: /* D1 vblank/vline */
6599 switch (src_data) {
6600 case 0: /* D1 vblank */
6601 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) {
6602 if (rdev->irq.crtc_vblank_int[0]) {
6603 drm_handle_vblank(rdev->ddev, 0);
6604 rdev->pm.vblank_sync = true;
6605 wake_up(&rdev->irq.vblank_queue);
6606 }
6607 if (atomic_read(&rdev->irq.pflip[0]))
6608 radeon_crtc_handle_flip(rdev, 0);
6609 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
6610 DRM_DEBUG("IH: D1 vblank\n");
6611 }
6612 break;
6613 case 1: /* D1 vline */
6614 if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) {
6615 rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT;
6616 DRM_DEBUG("IH: D1 vline\n");
6617 }
6618 break;
6619 default:
6620 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6621 break;
6622 }
6623 break;
6624 case 2: /* D2 vblank/vline */
6625 switch (src_data) {
6626 case 0: /* D2 vblank */
6627 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
6628 if (rdev->irq.crtc_vblank_int[1]) {
6629 drm_handle_vblank(rdev->ddev, 1);
6630 rdev->pm.vblank_sync = true;
6631 wake_up(&rdev->irq.vblank_queue);
6632 }
6633 if (atomic_read(&rdev->irq.pflip[1]))
6634 radeon_crtc_handle_flip(rdev, 1);
6635 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
6636 DRM_DEBUG("IH: D2 vblank\n");
6637 }
6638 break;
6639 case 1: /* D2 vline */
6640 if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
6641 rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
6642 DRM_DEBUG("IH: D2 vline\n");
6643 }
6644 break;
6645 default:
6646 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6647 break;
6648 }
6649 break;
6650 case 3: /* D3 vblank/vline */
6651 switch (src_data) {
6652 case 0: /* D3 vblank */
6653 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
6654 if (rdev->irq.crtc_vblank_int[2]) {
6655 drm_handle_vblank(rdev->ddev, 2);
6656 rdev->pm.vblank_sync = true;
6657 wake_up(&rdev->irq.vblank_queue);
6658 }
6659 if (atomic_read(&rdev->irq.pflip[2]))
6660 radeon_crtc_handle_flip(rdev, 2);
6661 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
6662 DRM_DEBUG("IH: D3 vblank\n");
6663 }
6664 break;
6665 case 1: /* D3 vline */
6666 if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
6667 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
6668 DRM_DEBUG("IH: D3 vline\n");
6669 }
6670 break;
6671 default:
6672 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6673 break;
6674 }
6675 break;
6676 case 4: /* D4 vblank/vline */
6677 switch (src_data) {
6678 case 0: /* D4 vblank */
6679 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
6680 if (rdev->irq.crtc_vblank_int[3]) {
6681 drm_handle_vblank(rdev->ddev, 3);
6682 rdev->pm.vblank_sync = true;
6683 wake_up(&rdev->irq.vblank_queue);
6684 }
6685 if (atomic_read(&rdev->irq.pflip[3]))
6686 radeon_crtc_handle_flip(rdev, 3);
6687 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
6688 DRM_DEBUG("IH: D4 vblank\n");
6689 }
6690 break;
6691 case 1: /* D4 vline */
6692 if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
6693 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
6694 DRM_DEBUG("IH: D4 vline\n");
6695 }
6696 break;
6697 default:
6698 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6699 break;
6700 }
6701 break;
6702 case 5: /* D5 vblank/vline */
6703 switch (src_data) {
6704 case 0: /* D5 vblank */
6705 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
6706 if (rdev->irq.crtc_vblank_int[4]) {
6707 drm_handle_vblank(rdev->ddev, 4);
6708 rdev->pm.vblank_sync = true;
6709 wake_up(&rdev->irq.vblank_queue);
6710 }
6711 if (atomic_read(&rdev->irq.pflip[4]))
6712 radeon_crtc_handle_flip(rdev, 4);
6713 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
6714 DRM_DEBUG("IH: D5 vblank\n");
6715 }
6716 break;
6717 case 1: /* D5 vline */
6718 if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
6719 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
6720 DRM_DEBUG("IH: D5 vline\n");
6721 }
6722 break;
6723 default:
6724 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6725 break;
6726 }
6727 break;
6728 case 6: /* D6 vblank/vline */
6729 switch (src_data) {
6730 case 0: /* D6 vblank */
6731 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
6732 if (rdev->irq.crtc_vblank_int[5]) {
6733 drm_handle_vblank(rdev->ddev, 5);
6734 rdev->pm.vblank_sync = true;
6735 wake_up(&rdev->irq.vblank_queue);
6736 }
6737 if (atomic_read(&rdev->irq.pflip[5]))
6738 radeon_crtc_handle_flip(rdev, 5);
6739 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
6740 DRM_DEBUG("IH: D6 vblank\n");
6741 }
6742 break;
6743 case 1: /* D6 vline */
6744 if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
6745 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
6746 DRM_DEBUG("IH: D6 vline\n");
6747 }
6748 break;
6749 default:
6750 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6751 break;
6752 }
6753 break;
6754 case 42: /* HPD hotplug */
6755 switch (src_data) {
6756 case 0:
6757 if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
6758 rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT;
6759 queue_hotplug = true;
6760 DRM_DEBUG("IH: HPD1\n");
6761 }
6762 break;
6763 case 1:
6764 if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
6765 rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT;
6766 queue_hotplug = true;
6767 DRM_DEBUG("IH: HPD2\n");
6768 }
6769 break;
6770 case 2:
6771 if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
6772 rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
6773 queue_hotplug = true;
6774 DRM_DEBUG("IH: HPD3\n");
6775 }
6776 break;
6777 case 3:
6778 if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
6779 rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
6780 queue_hotplug = true;
6781 DRM_DEBUG("IH: HPD4\n");
6782 }
6783 break;
6784 case 4:
6785 if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
6786 rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
6787 queue_hotplug = true;
6788 DRM_DEBUG("IH: HPD5\n");
6789 }
6790 break;
6791 case 5:
6792 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6793 rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
6794 queue_hotplug = true;
6795 DRM_DEBUG("IH: HPD6\n");
6796 }
6797 break;
6798 default:
6799 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6800 break;
6801 }
6802 break;
Christian König6a3808b2013-08-30 11:10:33 +02006803 case 124: /* UVD */
6804 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
6805 radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
6806 break;
Alex Deucher9d97c992012-09-06 14:24:48 -04006807 case 146:
6808 case 147:
Alex Deucher3ec7d112013-06-14 10:42:22 -04006809 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
6810 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
6811 mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
Alex Deucher9d97c992012-09-06 14:24:48 -04006812 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
6813 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04006814 addr);
Alex Deucher9d97c992012-09-06 14:24:48 -04006815 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
Alex Deucher3ec7d112013-06-14 10:42:22 -04006816 status);
6817 cik_vm_decode_fault(rdev, status, addr, mc_client);
Alex Deucher9d97c992012-09-06 14:24:48 -04006818 /* reset addr and status */
6819 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
6820 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05006821 case 176: /* GFX RB CP_INT */
6822 case 177: /* GFX IB CP_INT */
6823 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6824 break;
6825 case 181: /* CP EOP event */
6826 DRM_DEBUG("IH: CP EOP\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04006827 /* XXX check the bitfield order! */
6828 me_id = (ring_id & 0x60) >> 5;
6829 pipe_id = (ring_id & 0x18) >> 3;
6830 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05006831 switch (me_id) {
6832 case 0:
6833 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6834 break;
6835 case 1:
Alex Deuchera59781b2012-11-09 10:45:57 -05006836 case 2:
Alex Deucher2b0781a2013-04-09 14:26:16 -04006837 if ((cp1_ring->me == me_id) & (cp1_ring->pipe == pipe_id))
6838 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6839 if ((cp2_ring->me == me_id) & (cp2_ring->pipe == pipe_id))
6840 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
Alex Deuchera59781b2012-11-09 10:45:57 -05006841 break;
6842 }
6843 break;
6844 case 184: /* CP Privileged reg access */
6845 DRM_ERROR("Illegal register access in command stream\n");
6846 /* XXX check the bitfield order! */
6847 me_id = (ring_id & 0x60) >> 5;
6848 pipe_id = (ring_id & 0x18) >> 3;
6849 queue_id = (ring_id & 0x7) >> 0;
6850 switch (me_id) {
6851 case 0:
6852 /* This results in a full GPU reset, but all we need to do is soft
6853 * reset the CP for gfx
6854 */
6855 queue_reset = true;
6856 break;
6857 case 1:
6858 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04006859 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05006860 break;
6861 case 2:
6862 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04006863 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05006864 break;
6865 }
6866 break;
6867 case 185: /* CP Privileged inst */
6868 DRM_ERROR("Illegal instruction in command stream\n");
Alex Deucher21a93e12013-04-09 12:47:11 -04006869 /* XXX check the bitfield order! */
6870 me_id = (ring_id & 0x60) >> 5;
6871 pipe_id = (ring_id & 0x18) >> 3;
6872 queue_id = (ring_id & 0x7) >> 0;
Alex Deuchera59781b2012-11-09 10:45:57 -05006873 switch (me_id) {
6874 case 0:
6875 /* This results in a full GPU reset, but all we need to do is soft
6876 * reset the CP for gfx
6877 */
6878 queue_reset = true;
6879 break;
6880 case 1:
6881 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04006882 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05006883 break;
6884 case 2:
6885 /* XXX compute */
Alex Deucher2b0781a2013-04-09 14:26:16 -04006886 queue_reset = true;
Alex Deuchera59781b2012-11-09 10:45:57 -05006887 break;
6888 }
6889 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04006890 case 224: /* SDMA trap event */
6891 /* XXX check the bitfield order! */
6892 me_id = (ring_id & 0x3) >> 0;
6893 queue_id = (ring_id & 0xc) >> 2;
6894 DRM_DEBUG("IH: SDMA trap\n");
6895 switch (me_id) {
6896 case 0:
6897 switch (queue_id) {
6898 case 0:
6899 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
6900 break;
6901 case 1:
6902 /* XXX compute */
6903 break;
6904 case 2:
6905 /* XXX compute */
6906 break;
6907 }
6908 break;
6909 case 1:
6910 switch (queue_id) {
6911 case 0:
6912 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
6913 break;
6914 case 1:
6915 /* XXX compute */
6916 break;
6917 case 2:
6918 /* XXX compute */
6919 break;
6920 }
6921 break;
6922 }
6923 break;
Alex Deucher41a524a2013-08-14 01:01:40 -04006924 case 230: /* thermal low to high */
6925 DRM_DEBUG("IH: thermal low to high\n");
6926 rdev->pm.dpm.thermal.high_to_low = false;
6927 queue_thermal = true;
6928 break;
6929 case 231: /* thermal high to low */
6930 DRM_DEBUG("IH: thermal high to low\n");
6931 rdev->pm.dpm.thermal.high_to_low = true;
6932 queue_thermal = true;
6933 break;
6934 case 233: /* GUI IDLE */
6935 DRM_DEBUG("IH: GUI idle\n");
6936 break;
Alex Deucher21a93e12013-04-09 12:47:11 -04006937 case 241: /* SDMA Privileged inst */
6938 case 247: /* SDMA Privileged inst */
6939 DRM_ERROR("Illegal instruction in SDMA command stream\n");
6940 /* XXX check the bitfield order! */
6941 me_id = (ring_id & 0x3) >> 0;
6942 queue_id = (ring_id & 0xc) >> 2;
6943 switch (me_id) {
6944 case 0:
6945 switch (queue_id) {
6946 case 0:
6947 queue_reset = true;
6948 break;
6949 case 1:
6950 /* XXX compute */
6951 queue_reset = true;
6952 break;
6953 case 2:
6954 /* XXX compute */
6955 queue_reset = true;
6956 break;
6957 }
6958 break;
6959 case 1:
6960 switch (queue_id) {
6961 case 0:
6962 queue_reset = true;
6963 break;
6964 case 1:
6965 /* XXX compute */
6966 queue_reset = true;
6967 break;
6968 case 2:
6969 /* XXX compute */
6970 queue_reset = true;
6971 break;
6972 }
6973 break;
6974 }
6975 break;
Alex Deuchera59781b2012-11-09 10:45:57 -05006976 default:
6977 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6978 break;
6979 }
6980
6981 /* wptr/rptr are in bytes! */
6982 rptr += 16;
6983 rptr &= rdev->ih.ptr_mask;
6984 }
6985 if (queue_hotplug)
6986 schedule_work(&rdev->hotplug_work);
6987 if (queue_reset)
6988 schedule_work(&rdev->reset_work);
Alex Deucher41a524a2013-08-14 01:01:40 -04006989 if (queue_thermal)
6990 schedule_work(&rdev->pm.dpm.thermal.work);
Alex Deuchera59781b2012-11-09 10:45:57 -05006991 rdev->ih.rptr = rptr;
6992 WREG32(IH_RB_RPTR, rdev->ih.rptr);
6993 atomic_set(&rdev->ih.lock, 0);
6994
6995 /* make sure wptr hasn't changed while processing */
6996 wptr = cik_get_ih_wptr(rdev);
6997 if (wptr != rptr)
6998 goto restart_ih;
6999
7000 return IRQ_HANDLED;
7001}
Alex Deucher7bf94a22012-08-17 11:48:29 -04007002
7003/*
7004 * startup/shutdown callbacks
7005 */
7006/**
7007 * cik_startup - program the asic to a functional state
7008 *
7009 * @rdev: radeon_device pointer
7010 *
7011 * Programs the asic to a functional state (CIK).
7012 * Called by cik_init() and cik_resume().
7013 * Returns 0 for success, error for failure.
7014 */
7015static int cik_startup(struct radeon_device *rdev)
7016{
7017 struct radeon_ring *ring;
7018 int r;
7019
Alex Deucher8a7cd272013-08-06 11:29:39 -04007020 /* enable pcie gen2/3 link */
7021 cik_pcie_gen3_enable(rdev);
Alex Deucher7235711a42013-04-04 13:58:09 -04007022 /* enable aspm */
7023 cik_program_aspm(rdev);
Alex Deucher8a7cd272013-08-06 11:29:39 -04007024
Alex Deuchere5903d32013-08-30 08:58:20 -04007025 /* scratch needs to be initialized before MC */
7026 r = r600_vram_scratch_init(rdev);
7027 if (r)
7028 return r;
7029
Alex Deucher6fab3feb2013-08-04 12:13:17 -04007030 cik_mc_program(rdev);
7031
Alex Deucher7bf94a22012-08-17 11:48:29 -04007032 if (rdev->flags & RADEON_IS_IGP) {
7033 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
7034 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
7035 r = cik_init_microcode(rdev);
7036 if (r) {
7037 DRM_ERROR("Failed to load firmware!\n");
7038 return r;
7039 }
7040 }
7041 } else {
7042 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
7043 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
7044 !rdev->mc_fw) {
7045 r = cik_init_microcode(rdev);
7046 if (r) {
7047 DRM_ERROR("Failed to load firmware!\n");
7048 return r;
7049 }
7050 }
7051
7052 r = ci_mc_load_microcode(rdev);
7053 if (r) {
7054 DRM_ERROR("Failed to load MC firmware!\n");
7055 return r;
7056 }
7057 }
7058
Alex Deucher7bf94a22012-08-17 11:48:29 -04007059 r = cik_pcie_gart_enable(rdev);
7060 if (r)
7061 return r;
7062 cik_gpu_init(rdev);
7063
7064 /* allocate rlc buffers */
Alex Deucher22c775c2013-07-23 09:41:05 -04007065 if (rdev->flags & RADEON_IS_IGP) {
7066 if (rdev->family == CHIP_KAVERI) {
7067 rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
7068 rdev->rlc.reg_list_size =
7069 (u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
7070 } else {
7071 rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
7072 rdev->rlc.reg_list_size =
7073 (u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
7074 }
7075 }
7076 rdev->rlc.cs_data = ci_cs_data;
7077 rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
Alex Deucher1fd11772013-04-17 17:53:50 -04007078 r = sumo_rlc_init(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007079 if (r) {
7080 DRM_ERROR("Failed to init rlc BOs!\n");
7081 return r;
7082 }
7083
7084 /* allocate wb buffer */
7085 r = radeon_wb_init(rdev);
7086 if (r)
7087 return r;
7088
Alex Deucher963e81f2013-06-26 17:37:11 -04007089 /* allocate mec buffers */
7090 r = cik_mec_init(rdev);
7091 if (r) {
7092 DRM_ERROR("Failed to init MEC BOs!\n");
7093 return r;
7094 }
7095
Alex Deucher7bf94a22012-08-17 11:48:29 -04007096 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
7097 if (r) {
7098 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
7099 return r;
7100 }
7101
Alex Deucher963e81f2013-06-26 17:37:11 -04007102 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
7103 if (r) {
7104 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
7105 return r;
7106 }
7107
7108 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
7109 if (r) {
7110 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
7111 return r;
7112 }
7113
Alex Deucher7bf94a22012-08-17 11:48:29 -04007114 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
7115 if (r) {
7116 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
7117 return r;
7118 }
7119
7120 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
7121 if (r) {
7122 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
7123 return r;
7124 }
7125
Alex Deucher2ce529d2013-08-28 18:12:59 -04007126 r = radeon_uvd_resume(rdev);
Christian König87167bb2013-04-09 13:39:21 -04007127 if (!r) {
Alex Deucher2ce529d2013-08-28 18:12:59 -04007128 r = uvd_v4_2_resume(rdev);
7129 if (!r) {
7130 r = radeon_fence_driver_start_ring(rdev,
7131 R600_RING_TYPE_UVD_INDEX);
7132 if (r)
7133 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
7134 }
Christian König87167bb2013-04-09 13:39:21 -04007135 }
7136 if (r)
7137 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
7138
Alex Deucher7bf94a22012-08-17 11:48:29 -04007139 /* Enable IRQ */
7140 if (!rdev->irq.installed) {
7141 r = radeon_irq_kms_init(rdev);
7142 if (r)
7143 return r;
7144 }
7145
7146 r = cik_irq_init(rdev);
7147 if (r) {
7148 DRM_ERROR("radeon: IH init failed (%d).\n", r);
7149 radeon_irq_kms_fini(rdev);
7150 return r;
7151 }
7152 cik_irq_set(rdev);
7153
7154 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
7155 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
7156 CP_RB0_RPTR, CP_RB0_WPTR,
Marek Olšák1dac28e2013-10-30 14:41:35 +01007157 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher7bf94a22012-08-17 11:48:29 -04007158 if (r)
7159 return r;
7160
Alex Deucher963e81f2013-06-26 17:37:11 -04007161 /* set up the compute queues */
Alex Deucher2615b532013-06-03 11:21:58 -04007162 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04007163 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7164 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
7165 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR,
Christian König2e1e6da2013-08-13 11:56:52 +02007166 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher963e81f2013-06-26 17:37:11 -04007167 if (r)
7168 return r;
7169 ring->me = 1; /* first MEC */
7170 ring->pipe = 0; /* first pipe */
7171 ring->queue = 0; /* first queue */
7172 ring->wptr_offs = CIK_WB_CP1_WPTR_OFFSET;
7173
Alex Deucher2615b532013-06-03 11:21:58 -04007174 /* type-2 packets are deprecated on MEC, use type-3 instead */
Alex Deucher963e81f2013-06-26 17:37:11 -04007175 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7176 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
7177 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR,
Christian König2e1e6da2013-08-13 11:56:52 +02007178 PACKET3(PACKET3_NOP, 0x3FFF));
Alex Deucher963e81f2013-06-26 17:37:11 -04007179 if (r)
7180 return r;
7181 /* dGPU only have 1 MEC */
7182 ring->me = 1; /* first MEC */
7183 ring->pipe = 0; /* first pipe */
7184 ring->queue = 1; /* second queue */
7185 ring->wptr_offs = CIK_WB_CP2_WPTR_OFFSET;
7186
Alex Deucher7bf94a22012-08-17 11:48:29 -04007187 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
7188 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
7189 SDMA0_GFX_RB_RPTR + SDMA0_REGISTER_OFFSET,
7190 SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02007191 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04007192 if (r)
7193 return r;
7194
7195 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
7196 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
7197 SDMA0_GFX_RB_RPTR + SDMA1_REGISTER_OFFSET,
7198 SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET,
Christian König2e1e6da2013-08-13 11:56:52 +02007199 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
Alex Deucher7bf94a22012-08-17 11:48:29 -04007200 if (r)
7201 return r;
7202
7203 r = cik_cp_resume(rdev);
7204 if (r)
7205 return r;
7206
7207 r = cik_sdma_resume(rdev);
7208 if (r)
7209 return r;
7210
Christian König87167bb2013-04-09 13:39:21 -04007211 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
7212 if (ring->ring_size) {
Christian König02c9f7f2013-08-13 11:56:51 +02007213 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
Christian König87167bb2013-04-09 13:39:21 -04007214 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
Christian König2e1e6da2013-08-13 11:56:52 +02007215 RADEON_CP_PACKET2);
Christian König87167bb2013-04-09 13:39:21 -04007216 if (!r)
Christian Könige409b122013-08-13 11:56:53 +02007217 r = uvd_v1_0_init(rdev);
Christian König87167bb2013-04-09 13:39:21 -04007218 if (r)
7219 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
7220 }
7221
Alex Deucher7bf94a22012-08-17 11:48:29 -04007222 r = radeon_ib_pool_init(rdev);
7223 if (r) {
7224 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
7225 return r;
7226 }
7227
7228 r = radeon_vm_manager_init(rdev);
7229 if (r) {
7230 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
7231 return r;
7232 }
7233
Alex Deucherb5306022013-07-31 16:51:33 -04007234 r = dce6_audio_init(rdev);
7235 if (r)
7236 return r;
7237
Alex Deucher7bf94a22012-08-17 11:48:29 -04007238 return 0;
7239}
7240
7241/**
7242 * cik_resume - resume the asic to a functional state
7243 *
7244 * @rdev: radeon_device pointer
7245 *
7246 * Programs the asic to a functional state (CIK).
7247 * Called at resume.
7248 * Returns 0 for success, error for failure.
7249 */
7250int cik_resume(struct radeon_device *rdev)
7251{
7252 int r;
7253
7254 /* post card */
7255 atom_asic_init(rdev->mode_info.atom_context);
7256
Alex Deucher0aafd312013-04-09 14:43:30 -04007257 /* init golden registers */
7258 cik_init_golden_registers(rdev);
7259
Alex Deucher7bf94a22012-08-17 11:48:29 -04007260 rdev->accel_working = true;
7261 r = cik_startup(rdev);
7262 if (r) {
7263 DRM_ERROR("cik startup failed on resume\n");
7264 rdev->accel_working = false;
7265 return r;
7266 }
7267
7268 return r;
7269
7270}
7271
7272/**
7273 * cik_suspend - suspend the asic
7274 *
7275 * @rdev: radeon_device pointer
7276 *
7277 * Bring the chip into a state suitable for suspend (CIK).
7278 * Called at suspend.
7279 * Returns 0 for success.
7280 */
7281int cik_suspend(struct radeon_device *rdev)
7282{
Alex Deucherb5306022013-07-31 16:51:33 -04007283 dce6_audio_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007284 radeon_vm_manager_fini(rdev);
7285 cik_cp_enable(rdev, false);
7286 cik_sdma_enable(rdev, false);
Christian Könige409b122013-08-13 11:56:53 +02007287 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04007288 radeon_uvd_suspend(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04007289 cik_fini_pg(rdev);
7290 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007291 cik_irq_suspend(rdev);
7292 radeon_wb_disable(rdev);
7293 cik_pcie_gart_disable(rdev);
7294 return 0;
7295}
7296
7297/* Plan is to move initialization in that function and use
7298 * helper function so that radeon_device_init pretty much
7299 * do nothing more than calling asic specific function. This
7300 * should also allow to remove a bunch of callback function
7301 * like vram_info.
7302 */
7303/**
7304 * cik_init - asic specific driver and hw init
7305 *
7306 * @rdev: radeon_device pointer
7307 *
7308 * Setup asic specific driver variables and program the hw
7309 * to a functional state (CIK).
7310 * Called at driver startup.
7311 * Returns 0 for success, errors for failure.
7312 */
7313int cik_init(struct radeon_device *rdev)
7314{
7315 struct radeon_ring *ring;
7316 int r;
7317
7318 /* Read BIOS */
7319 if (!radeon_get_bios(rdev)) {
7320 if (ASIC_IS_AVIVO(rdev))
7321 return -EINVAL;
7322 }
7323 /* Must be an ATOMBIOS */
7324 if (!rdev->is_atom_bios) {
7325 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
7326 return -EINVAL;
7327 }
7328 r = radeon_atombios_init(rdev);
7329 if (r)
7330 return r;
7331
7332 /* Post card if necessary */
7333 if (!radeon_card_posted(rdev)) {
7334 if (!rdev->bios) {
7335 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
7336 return -EINVAL;
7337 }
7338 DRM_INFO("GPU not posted. posting now...\n");
7339 atom_asic_init(rdev->mode_info.atom_context);
7340 }
Alex Deucher0aafd312013-04-09 14:43:30 -04007341 /* init golden registers */
7342 cik_init_golden_registers(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007343 /* Initialize scratch registers */
7344 cik_scratch_init(rdev);
7345 /* Initialize surface registers */
7346 radeon_surface_init(rdev);
7347 /* Initialize clocks */
7348 radeon_get_clock_info(rdev->ddev);
7349
7350 /* Fence driver */
7351 r = radeon_fence_driver_init(rdev);
7352 if (r)
7353 return r;
7354
7355 /* initialize memory controller */
7356 r = cik_mc_init(rdev);
7357 if (r)
7358 return r;
7359 /* Memory manager */
7360 r = radeon_bo_init(rdev);
7361 if (r)
7362 return r;
7363
7364 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
7365 ring->ring_obj = NULL;
7366 r600_ring_init(rdev, ring, 1024 * 1024);
7367
Alex Deucher963e81f2013-06-26 17:37:11 -04007368 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7369 ring->ring_obj = NULL;
7370 r600_ring_init(rdev, ring, 1024 * 1024);
7371 r = radeon_doorbell_get(rdev, &ring->doorbell_page_num);
7372 if (r)
7373 return r;
7374
7375 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7376 ring->ring_obj = NULL;
7377 r600_ring_init(rdev, ring, 1024 * 1024);
7378 r = radeon_doorbell_get(rdev, &ring->doorbell_page_num);
7379 if (r)
7380 return r;
7381
Alex Deucher7bf94a22012-08-17 11:48:29 -04007382 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
7383 ring->ring_obj = NULL;
7384 r600_ring_init(rdev, ring, 256 * 1024);
7385
7386 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
7387 ring->ring_obj = NULL;
7388 r600_ring_init(rdev, ring, 256 * 1024);
7389
Christian König87167bb2013-04-09 13:39:21 -04007390 r = radeon_uvd_init(rdev);
7391 if (!r) {
7392 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
7393 ring->ring_obj = NULL;
7394 r600_ring_init(rdev, ring, 4096);
7395 }
7396
Alex Deucher7bf94a22012-08-17 11:48:29 -04007397 rdev->ih.ring_obj = NULL;
7398 r600_ih_ring_init(rdev, 64 * 1024);
7399
7400 r = r600_pcie_gart_init(rdev);
7401 if (r)
7402 return r;
7403
7404 rdev->accel_working = true;
7405 r = cik_startup(rdev);
7406 if (r) {
7407 dev_err(rdev->dev, "disabling GPU acceleration\n");
7408 cik_cp_fini(rdev);
7409 cik_sdma_fini(rdev);
7410 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04007411 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04007412 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007413 radeon_wb_fini(rdev);
7414 radeon_ib_pool_fini(rdev);
7415 radeon_vm_manager_fini(rdev);
7416 radeon_irq_kms_fini(rdev);
7417 cik_pcie_gart_fini(rdev);
7418 rdev->accel_working = false;
7419 }
7420
7421 /* Don't start up if the MC ucode is missing.
7422 * The default clocks and voltages before the MC ucode
7423 * is loaded are not suffient for advanced operations.
7424 */
7425 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
7426 DRM_ERROR("radeon: MC ucode required for NI+.\n");
7427 return -EINVAL;
7428 }
7429
7430 return 0;
7431}
7432
7433/**
7434 * cik_fini - asic specific driver and hw fini
7435 *
7436 * @rdev: radeon_device pointer
7437 *
7438 * Tear down the asic specific driver variables and program the hw
7439 * to an idle state (CIK).
7440 * Called at driver unload.
7441 */
7442void cik_fini(struct radeon_device *rdev)
7443{
7444 cik_cp_fini(rdev);
7445 cik_sdma_fini(rdev);
Alex Deucher473359b2013-08-09 11:18:39 -04007446 cik_fini_pg(rdev);
7447 cik_fini_cg(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007448 cik_irq_fini(rdev);
Alex Deucher1fd11772013-04-17 17:53:50 -04007449 sumo_rlc_fini(rdev);
Alex Deucher963e81f2013-06-26 17:37:11 -04007450 cik_mec_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007451 radeon_wb_fini(rdev);
7452 radeon_vm_manager_fini(rdev);
7453 radeon_ib_pool_fini(rdev);
7454 radeon_irq_kms_fini(rdev);
Christian Könige409b122013-08-13 11:56:53 +02007455 uvd_v1_0_fini(rdev);
Christian König87167bb2013-04-09 13:39:21 -04007456 radeon_uvd_fini(rdev);
Alex Deucher7bf94a22012-08-17 11:48:29 -04007457 cik_pcie_gart_fini(rdev);
7458 r600_vram_scratch_fini(rdev);
7459 radeon_gem_fini(rdev);
7460 radeon_fence_driver_fini(rdev);
7461 radeon_bo_fini(rdev);
7462 radeon_atombios_fini(rdev);
7463 kfree(rdev->bios);
7464 rdev->bios = NULL;
7465}
Alex Deuchercd84a272012-07-20 17:13:13 -04007466
Alex Deucher134b4802013-09-23 12:22:11 -04007467void dce8_program_fmt(struct drm_encoder *encoder)
7468{
7469 struct drm_device *dev = encoder->dev;
7470 struct radeon_device *rdev = dev->dev_private;
7471 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
7472 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
7473 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
7474 int bpc = 0;
7475 u32 tmp = 0;
Alex Deucher6214bb72013-09-24 17:26:26 -04007476 enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
Alex Deucher134b4802013-09-23 12:22:11 -04007477
Alex Deucher6214bb72013-09-24 17:26:26 -04007478 if (connector) {
7479 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
Alex Deucher134b4802013-09-23 12:22:11 -04007480 bpc = radeon_get_monitor_bpc(connector);
Alex Deucher6214bb72013-09-24 17:26:26 -04007481 dither = radeon_connector->dither;
7482 }
Alex Deucher134b4802013-09-23 12:22:11 -04007483
7484 /* LVDS/eDP FMT is set up by atom */
7485 if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
7486 return;
7487
7488 /* not needed for analog */
7489 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
7490 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
7491 return;
7492
7493 if (bpc == 0)
7494 return;
7495
7496 switch (bpc) {
7497 case 6:
Alex Deucher6214bb72013-09-24 17:26:26 -04007498 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04007499 /* XXX sort out optimal dither settings */
7500 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
7501 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(0));
7502 else
7503 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(0));
7504 break;
7505 case 8:
Alex Deucher6214bb72013-09-24 17:26:26 -04007506 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04007507 /* XXX sort out optimal dither settings */
7508 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
7509 FMT_RGB_RANDOM_ENABLE |
7510 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(1));
7511 else
7512 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(1));
7513 break;
7514 case 10:
Alex Deucher6214bb72013-09-24 17:26:26 -04007515 if (dither == RADEON_FMT_DITHER_ENABLE)
Alex Deucher134b4802013-09-23 12:22:11 -04007516 /* XXX sort out optimal dither settings */
7517 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
7518 FMT_RGB_RANDOM_ENABLE |
7519 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(2));
7520 else
7521 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(2));
7522 break;
7523 default:
7524 /* not needed */
7525 break;
7526 }
7527
7528 WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
7529}
7530
Alex Deuchercd84a272012-07-20 17:13:13 -04007531/* display watermark setup */
7532/**
7533 * dce8_line_buffer_adjust - Set up the line buffer
7534 *
7535 * @rdev: radeon_device pointer
7536 * @radeon_crtc: the selected display controller
7537 * @mode: the current display mode on the selected display
7538 * controller
7539 *
7540 * Setup up the line buffer allocation for
7541 * the selected display controller (CIK).
7542 * Returns the line buffer size in pixels.
7543 */
7544static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
7545 struct radeon_crtc *radeon_crtc,
7546 struct drm_display_mode *mode)
7547{
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007548 u32 tmp, buffer_alloc, i;
7549 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
Alex Deuchercd84a272012-07-20 17:13:13 -04007550 /*
7551 * Line Buffer Setup
7552 * There are 6 line buffers, one for each display controllers.
7553 * There are 3 partitions per LB. Select the number of partitions
7554 * to enable based on the display width. For display widths larger
7555 * than 4096, you need use to use 2 display controllers and combine
7556 * them using the stereo blender.
7557 */
7558 if (radeon_crtc->base.enabled && mode) {
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007559 if (mode->crtc_hdisplay < 1920) {
Alex Deuchercd84a272012-07-20 17:13:13 -04007560 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007561 buffer_alloc = 2;
7562 } else if (mode->crtc_hdisplay < 2560) {
Alex Deuchercd84a272012-07-20 17:13:13 -04007563 tmp = 2;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007564 buffer_alloc = 2;
7565 } else if (mode->crtc_hdisplay < 4096) {
Alex Deuchercd84a272012-07-20 17:13:13 -04007566 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007567 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
7568 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04007569 DRM_DEBUG_KMS("Mode too big for LB!\n");
7570 tmp = 0;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007571 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
Alex Deuchercd84a272012-07-20 17:13:13 -04007572 }
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007573 } else {
Alex Deuchercd84a272012-07-20 17:13:13 -04007574 tmp = 1;
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007575 buffer_alloc = 0;
7576 }
Alex Deuchercd84a272012-07-20 17:13:13 -04007577
7578 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
7579 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
7580
Alex Deucherbc01a8c2013-08-19 11:39:27 -04007581 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
7582 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
7583 for (i = 0; i < rdev->usec_timeout; i++) {
7584 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
7585 DMIF_BUFFERS_ALLOCATED_COMPLETED)
7586 break;
7587 udelay(1);
7588 }
7589
Alex Deuchercd84a272012-07-20 17:13:13 -04007590 if (radeon_crtc->base.enabled && mode) {
7591 switch (tmp) {
7592 case 0:
7593 default:
7594 return 4096 * 2;
7595 case 1:
7596 return 1920 * 2;
7597 case 2:
7598 return 2560 * 2;
7599 }
7600 }
7601
7602 /* controller not enabled, so no lb used */
7603 return 0;
7604}
7605
7606/**
7607 * cik_get_number_of_dram_channels - get the number of dram channels
7608 *
7609 * @rdev: radeon_device pointer
7610 *
7611 * Look up the number of video ram channels (CIK).
7612 * Used for display watermark bandwidth calculations
7613 * Returns the number of dram channels
7614 */
7615static u32 cik_get_number_of_dram_channels(struct radeon_device *rdev)
7616{
7617 u32 tmp = RREG32(MC_SHARED_CHMAP);
7618
7619 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
7620 case 0:
7621 default:
7622 return 1;
7623 case 1:
7624 return 2;
7625 case 2:
7626 return 4;
7627 case 3:
7628 return 8;
7629 case 4:
7630 return 3;
7631 case 5:
7632 return 6;
7633 case 6:
7634 return 10;
7635 case 7:
7636 return 12;
7637 case 8:
7638 return 16;
7639 }
7640}
7641
7642struct dce8_wm_params {
7643 u32 dram_channels; /* number of dram channels */
7644 u32 yclk; /* bandwidth per dram data pin in kHz */
7645 u32 sclk; /* engine clock in kHz */
7646 u32 disp_clk; /* display clock in kHz */
7647 u32 src_width; /* viewport width */
7648 u32 active_time; /* active display time in ns */
7649 u32 blank_time; /* blank time in ns */
7650 bool interlaced; /* mode is interlaced */
7651 fixed20_12 vsc; /* vertical scale ratio */
7652 u32 num_heads; /* number of active crtcs */
7653 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
7654 u32 lb_size; /* line buffer allocated to pipe */
7655 u32 vtaps; /* vertical scaler taps */
7656};
7657
7658/**
7659 * dce8_dram_bandwidth - get the dram bandwidth
7660 *
7661 * @wm: watermark calculation data
7662 *
7663 * Calculate the raw dram bandwidth (CIK).
7664 * Used for display watermark bandwidth calculations
7665 * Returns the dram bandwidth in MBytes/s
7666 */
7667static u32 dce8_dram_bandwidth(struct dce8_wm_params *wm)
7668{
7669 /* Calculate raw DRAM Bandwidth */
7670 fixed20_12 dram_efficiency; /* 0.7 */
7671 fixed20_12 yclk, dram_channels, bandwidth;
7672 fixed20_12 a;
7673
7674 a.full = dfixed_const(1000);
7675 yclk.full = dfixed_const(wm->yclk);
7676 yclk.full = dfixed_div(yclk, a);
7677 dram_channels.full = dfixed_const(wm->dram_channels * 4);
7678 a.full = dfixed_const(10);
7679 dram_efficiency.full = dfixed_const(7);
7680 dram_efficiency.full = dfixed_div(dram_efficiency, a);
7681 bandwidth.full = dfixed_mul(dram_channels, yclk);
7682 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
7683
7684 return dfixed_trunc(bandwidth);
7685}
7686
7687/**
7688 * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
7689 *
7690 * @wm: watermark calculation data
7691 *
7692 * Calculate the dram bandwidth used for display (CIK).
7693 * Used for display watermark bandwidth calculations
7694 * Returns the dram bandwidth for display in MBytes/s
7695 */
7696static u32 dce8_dram_bandwidth_for_display(struct dce8_wm_params *wm)
7697{
7698 /* Calculate DRAM Bandwidth and the part allocated to display. */
7699 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
7700 fixed20_12 yclk, dram_channels, bandwidth;
7701 fixed20_12 a;
7702
7703 a.full = dfixed_const(1000);
7704 yclk.full = dfixed_const(wm->yclk);
7705 yclk.full = dfixed_div(yclk, a);
7706 dram_channels.full = dfixed_const(wm->dram_channels * 4);
7707 a.full = dfixed_const(10);
7708 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
7709 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
7710 bandwidth.full = dfixed_mul(dram_channels, yclk);
7711 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
7712
7713 return dfixed_trunc(bandwidth);
7714}
7715
7716/**
7717 * dce8_data_return_bandwidth - get the data return bandwidth
7718 *
7719 * @wm: watermark calculation data
7720 *
7721 * Calculate the data return bandwidth used for display (CIK).
7722 * Used for display watermark bandwidth calculations
7723 * Returns the data return bandwidth in MBytes/s
7724 */
7725static u32 dce8_data_return_bandwidth(struct dce8_wm_params *wm)
7726{
7727 /* Calculate the display Data return Bandwidth */
7728 fixed20_12 return_efficiency; /* 0.8 */
7729 fixed20_12 sclk, bandwidth;
7730 fixed20_12 a;
7731
7732 a.full = dfixed_const(1000);
7733 sclk.full = dfixed_const(wm->sclk);
7734 sclk.full = dfixed_div(sclk, a);
7735 a.full = dfixed_const(10);
7736 return_efficiency.full = dfixed_const(8);
7737 return_efficiency.full = dfixed_div(return_efficiency, a);
7738 a.full = dfixed_const(32);
7739 bandwidth.full = dfixed_mul(a, sclk);
7740 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
7741
7742 return dfixed_trunc(bandwidth);
7743}
7744
7745/**
7746 * dce8_dmif_request_bandwidth - get the dmif bandwidth
7747 *
7748 * @wm: watermark calculation data
7749 *
7750 * Calculate the dmif bandwidth used for display (CIK).
7751 * Used for display watermark bandwidth calculations
7752 * Returns the dmif bandwidth in MBytes/s
7753 */
7754static u32 dce8_dmif_request_bandwidth(struct dce8_wm_params *wm)
7755{
7756 /* Calculate the DMIF Request Bandwidth */
7757 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
7758 fixed20_12 disp_clk, bandwidth;
7759 fixed20_12 a, b;
7760
7761 a.full = dfixed_const(1000);
7762 disp_clk.full = dfixed_const(wm->disp_clk);
7763 disp_clk.full = dfixed_div(disp_clk, a);
7764 a.full = dfixed_const(32);
7765 b.full = dfixed_mul(a, disp_clk);
7766
7767 a.full = dfixed_const(10);
7768 disp_clk_request_efficiency.full = dfixed_const(8);
7769 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
7770
7771 bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
7772
7773 return dfixed_trunc(bandwidth);
7774}
7775
7776/**
7777 * dce8_available_bandwidth - get the min available bandwidth
7778 *
7779 * @wm: watermark calculation data
7780 *
7781 * Calculate the min available bandwidth used for display (CIK).
7782 * Used for display watermark bandwidth calculations
7783 * Returns the min available bandwidth in MBytes/s
7784 */
7785static u32 dce8_available_bandwidth(struct dce8_wm_params *wm)
7786{
7787 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
7788 u32 dram_bandwidth = dce8_dram_bandwidth(wm);
7789 u32 data_return_bandwidth = dce8_data_return_bandwidth(wm);
7790 u32 dmif_req_bandwidth = dce8_dmif_request_bandwidth(wm);
7791
7792 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
7793}
7794
7795/**
7796 * dce8_average_bandwidth - get the average available bandwidth
7797 *
7798 * @wm: watermark calculation data
7799 *
7800 * Calculate the average available bandwidth used for display (CIK).
7801 * Used for display watermark bandwidth calculations
7802 * Returns the average available bandwidth in MBytes/s
7803 */
7804static u32 dce8_average_bandwidth(struct dce8_wm_params *wm)
7805{
7806 /* Calculate the display mode Average Bandwidth
7807 * DisplayMode should contain the source and destination dimensions,
7808 * timing, etc.
7809 */
7810 fixed20_12 bpp;
7811 fixed20_12 line_time;
7812 fixed20_12 src_width;
7813 fixed20_12 bandwidth;
7814 fixed20_12 a;
7815
7816 a.full = dfixed_const(1000);
7817 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
7818 line_time.full = dfixed_div(line_time, a);
7819 bpp.full = dfixed_const(wm->bytes_per_pixel);
7820 src_width.full = dfixed_const(wm->src_width);
7821 bandwidth.full = dfixed_mul(src_width, bpp);
7822 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
7823 bandwidth.full = dfixed_div(bandwidth, line_time);
7824
7825 return dfixed_trunc(bandwidth);
7826}
7827
7828/**
7829 * dce8_latency_watermark - get the latency watermark
7830 *
7831 * @wm: watermark calculation data
7832 *
7833 * Calculate the latency watermark (CIK).
7834 * Used for display watermark bandwidth calculations
7835 * Returns the latency watermark in ns
7836 */
7837static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
7838{
7839 /* First calculate the latency in ns */
7840 u32 mc_latency = 2000; /* 2000 ns. */
7841 u32 available_bandwidth = dce8_available_bandwidth(wm);
7842 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
7843 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
7844 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
7845 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
7846 (wm->num_heads * cursor_line_pair_return_time);
7847 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
7848 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
7849 u32 tmp, dmif_size = 12288;
7850 fixed20_12 a, b, c;
7851
7852 if (wm->num_heads == 0)
7853 return 0;
7854
7855 a.full = dfixed_const(2);
7856 b.full = dfixed_const(1);
7857 if ((wm->vsc.full > a.full) ||
7858 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
7859 (wm->vtaps >= 5) ||
7860 ((wm->vsc.full >= a.full) && wm->interlaced))
7861 max_src_lines_per_dst_line = 4;
7862 else
7863 max_src_lines_per_dst_line = 2;
7864
7865 a.full = dfixed_const(available_bandwidth);
7866 b.full = dfixed_const(wm->num_heads);
7867 a.full = dfixed_div(a, b);
7868
7869 b.full = dfixed_const(mc_latency + 512);
7870 c.full = dfixed_const(wm->disp_clk);
7871 b.full = dfixed_div(b, c);
7872
7873 c.full = dfixed_const(dmif_size);
7874 b.full = dfixed_div(c, b);
7875
7876 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
7877
7878 b.full = dfixed_const(1000);
7879 c.full = dfixed_const(wm->disp_clk);
7880 b.full = dfixed_div(c, b);
7881 c.full = dfixed_const(wm->bytes_per_pixel);
7882 b.full = dfixed_mul(b, c);
7883
7884 lb_fill_bw = min(tmp, dfixed_trunc(b));
7885
7886 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
7887 b.full = dfixed_const(1000);
7888 c.full = dfixed_const(lb_fill_bw);
7889 b.full = dfixed_div(c, b);
7890 a.full = dfixed_div(a, b);
7891 line_fill_time = dfixed_trunc(a);
7892
7893 if (line_fill_time < wm->active_time)
7894 return latency;
7895 else
7896 return latency + (line_fill_time - wm->active_time);
7897
7898}
7899
7900/**
7901 * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
7902 * average and available dram bandwidth
7903 *
7904 * @wm: watermark calculation data
7905 *
7906 * Check if the display average bandwidth fits in the display
7907 * dram bandwidth (CIK).
7908 * Used for display watermark bandwidth calculations
7909 * Returns true if the display fits, false if not.
7910 */
7911static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params *wm)
7912{
7913 if (dce8_average_bandwidth(wm) <=
7914 (dce8_dram_bandwidth_for_display(wm) / wm->num_heads))
7915 return true;
7916 else
7917 return false;
7918}
7919
7920/**
7921 * dce8_average_bandwidth_vs_available_bandwidth - check
7922 * average and available bandwidth
7923 *
7924 * @wm: watermark calculation data
7925 *
7926 * Check if the display average bandwidth fits in the display
7927 * available bandwidth (CIK).
7928 * Used for display watermark bandwidth calculations
7929 * Returns true if the display fits, false if not.
7930 */
7931static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params *wm)
7932{
7933 if (dce8_average_bandwidth(wm) <=
7934 (dce8_available_bandwidth(wm) / wm->num_heads))
7935 return true;
7936 else
7937 return false;
7938}
7939
7940/**
7941 * dce8_check_latency_hiding - check latency hiding
7942 *
7943 * @wm: watermark calculation data
7944 *
7945 * Check latency hiding (CIK).
7946 * Used for display watermark bandwidth calculations
7947 * Returns true if the display fits, false if not.
7948 */
7949static bool dce8_check_latency_hiding(struct dce8_wm_params *wm)
7950{
7951 u32 lb_partitions = wm->lb_size / wm->src_width;
7952 u32 line_time = wm->active_time + wm->blank_time;
7953 u32 latency_tolerant_lines;
7954 u32 latency_hiding;
7955 fixed20_12 a;
7956
7957 a.full = dfixed_const(1);
7958 if (wm->vsc.full > a.full)
7959 latency_tolerant_lines = 1;
7960 else {
7961 if (lb_partitions <= (wm->vtaps + 1))
7962 latency_tolerant_lines = 1;
7963 else
7964 latency_tolerant_lines = 2;
7965 }
7966
7967 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
7968
7969 if (dce8_latency_watermark(wm) <= latency_hiding)
7970 return true;
7971 else
7972 return false;
7973}
7974
7975/**
7976 * dce8_program_watermarks - program display watermarks
7977 *
7978 * @rdev: radeon_device pointer
7979 * @radeon_crtc: the selected display controller
7980 * @lb_size: line buffer size
7981 * @num_heads: number of display controllers in use
7982 *
7983 * Calculate and program the display watermarks for the
7984 * selected display controller (CIK).
7985 */
7986static void dce8_program_watermarks(struct radeon_device *rdev,
7987 struct radeon_crtc *radeon_crtc,
7988 u32 lb_size, u32 num_heads)
7989{
7990 struct drm_display_mode *mode = &radeon_crtc->base.mode;
Alex Deucher58ea2de2013-01-24 10:03:39 -05007991 struct dce8_wm_params wm_low, wm_high;
Alex Deuchercd84a272012-07-20 17:13:13 -04007992 u32 pixel_period;
7993 u32 line_time = 0;
7994 u32 latency_watermark_a = 0, latency_watermark_b = 0;
7995 u32 tmp, wm_mask;
7996
7997 if (radeon_crtc->base.enabled && num_heads && mode) {
7998 pixel_period = 1000000 / (u32)mode->clock;
7999 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
8000
Alex Deucher58ea2de2013-01-24 10:03:39 -05008001 /* watermark for high clocks */
8002 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
8003 rdev->pm.dpm_enabled) {
8004 wm_high.yclk =
8005 radeon_dpm_get_mclk(rdev, false) * 10;
8006 wm_high.sclk =
8007 radeon_dpm_get_sclk(rdev, false) * 10;
8008 } else {
8009 wm_high.yclk = rdev->pm.current_mclk * 10;
8010 wm_high.sclk = rdev->pm.current_sclk * 10;
8011 }
8012
8013 wm_high.disp_clk = mode->clock;
8014 wm_high.src_width = mode->crtc_hdisplay;
8015 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
8016 wm_high.blank_time = line_time - wm_high.active_time;
8017 wm_high.interlaced = false;
Alex Deuchercd84a272012-07-20 17:13:13 -04008018 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
Alex Deucher58ea2de2013-01-24 10:03:39 -05008019 wm_high.interlaced = true;
8020 wm_high.vsc = radeon_crtc->vsc;
8021 wm_high.vtaps = 1;
Alex Deuchercd84a272012-07-20 17:13:13 -04008022 if (radeon_crtc->rmx_type != RMX_OFF)
Alex Deucher58ea2de2013-01-24 10:03:39 -05008023 wm_high.vtaps = 2;
8024 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
8025 wm_high.lb_size = lb_size;
8026 wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
8027 wm_high.num_heads = num_heads;
Alex Deuchercd84a272012-07-20 17:13:13 -04008028
8029 /* set for high clocks */
Alex Deucher58ea2de2013-01-24 10:03:39 -05008030 latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
Alex Deuchercd84a272012-07-20 17:13:13 -04008031
8032 /* possibly force display priority to high */
8033 /* should really do this at mode validation time... */
Alex Deucher58ea2de2013-01-24 10:03:39 -05008034 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
8035 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
8036 !dce8_check_latency_hiding(&wm_high) ||
8037 (rdev->disp_priority == 2)) {
8038 DRM_DEBUG_KMS("force priority to high\n");
8039 }
8040
8041 /* watermark for low clocks */
8042 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
8043 rdev->pm.dpm_enabled) {
8044 wm_low.yclk =
8045 radeon_dpm_get_mclk(rdev, true) * 10;
8046 wm_low.sclk =
8047 radeon_dpm_get_sclk(rdev, true) * 10;
8048 } else {
8049 wm_low.yclk = rdev->pm.current_mclk * 10;
8050 wm_low.sclk = rdev->pm.current_sclk * 10;
8051 }
8052
8053 wm_low.disp_clk = mode->clock;
8054 wm_low.src_width = mode->crtc_hdisplay;
8055 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
8056 wm_low.blank_time = line_time - wm_low.active_time;
8057 wm_low.interlaced = false;
8058 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
8059 wm_low.interlaced = true;
8060 wm_low.vsc = radeon_crtc->vsc;
8061 wm_low.vtaps = 1;
8062 if (radeon_crtc->rmx_type != RMX_OFF)
8063 wm_low.vtaps = 2;
8064 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
8065 wm_low.lb_size = lb_size;
8066 wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
8067 wm_low.num_heads = num_heads;
8068
8069 /* set for low clocks */
8070 latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
8071
8072 /* possibly force display priority to high */
8073 /* should really do this at mode validation time... */
8074 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
8075 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
8076 !dce8_check_latency_hiding(&wm_low) ||
Alex Deuchercd84a272012-07-20 17:13:13 -04008077 (rdev->disp_priority == 2)) {
8078 DRM_DEBUG_KMS("force priority to high\n");
8079 }
8080 }
8081
8082 /* select wm A */
8083 wm_mask = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
8084 tmp = wm_mask;
8085 tmp &= ~LATENCY_WATERMARK_MASK(3);
8086 tmp |= LATENCY_WATERMARK_MASK(1);
8087 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
8088 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
8089 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
8090 LATENCY_HIGH_WATERMARK(line_time)));
8091 /* select wm B */
8092 tmp = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
8093 tmp &= ~LATENCY_WATERMARK_MASK(3);
8094 tmp |= LATENCY_WATERMARK_MASK(2);
8095 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
8096 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
8097 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
8098 LATENCY_HIGH_WATERMARK(line_time)));
8099 /* restore original selection */
8100 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
Alex Deucher58ea2de2013-01-24 10:03:39 -05008101
8102 /* save values for DPM */
8103 radeon_crtc->line_time = line_time;
8104 radeon_crtc->wm_high = latency_watermark_a;
8105 radeon_crtc->wm_low = latency_watermark_b;
Alex Deuchercd84a272012-07-20 17:13:13 -04008106}
8107
8108/**
8109 * dce8_bandwidth_update - program display watermarks
8110 *
8111 * @rdev: radeon_device pointer
8112 *
8113 * Calculate and program the display watermarks and line
8114 * buffer allocation (CIK).
8115 */
8116void dce8_bandwidth_update(struct radeon_device *rdev)
8117{
8118 struct drm_display_mode *mode = NULL;
8119 u32 num_heads = 0, lb_size;
8120 int i;
8121
8122 radeon_update_display_priority(rdev);
8123
8124 for (i = 0; i < rdev->num_crtc; i++) {
8125 if (rdev->mode_info.crtcs[i]->base.enabled)
8126 num_heads++;
8127 }
8128 for (i = 0; i < rdev->num_crtc; i++) {
8129 mode = &rdev->mode_info.crtcs[i]->base.mode;
8130 lb_size = dce8_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode);
8131 dce8_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
8132 }
8133}
Alex Deucher44fa3462012-12-18 22:17:00 -05008134
8135/**
8136 * cik_get_gpu_clock_counter - return GPU clock counter snapshot
8137 *
8138 * @rdev: radeon_device pointer
8139 *
8140 * Fetches a GPU clock counter snapshot (SI).
8141 * Returns the 64 bit clock counter snapshot.
8142 */
8143uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
8144{
8145 uint64_t clock;
8146
8147 mutex_lock(&rdev->gpu_clock_mutex);
8148 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
8149 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
8150 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
8151 mutex_unlock(&rdev->gpu_clock_mutex);
8152 return clock;
8153}
8154
Christian König87167bb2013-04-09 13:39:21 -04008155static int cik_set_uvd_clock(struct radeon_device *rdev, u32 clock,
8156 u32 cntl_reg, u32 status_reg)
8157{
8158 int r, i;
8159 struct atom_clock_dividers dividers;
8160 uint32_t tmp;
8161
8162 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
8163 clock, false, &dividers);
8164 if (r)
8165 return r;
8166
8167 tmp = RREG32_SMC(cntl_reg);
8168 tmp &= ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK);
8169 tmp |= dividers.post_divider;
8170 WREG32_SMC(cntl_reg, tmp);
8171
8172 for (i = 0; i < 100; i++) {
8173 if (RREG32_SMC(status_reg) & DCLK_STATUS)
8174 break;
8175 mdelay(10);
8176 }
8177 if (i == 100)
8178 return -ETIMEDOUT;
8179
8180 return 0;
8181}
8182
8183int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
8184{
8185 int r = 0;
8186
8187 r = cik_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
8188 if (r)
8189 return r;
8190
8191 r = cik_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
8192 return r;
8193}
8194
Alex Deucher8a7cd272013-08-06 11:29:39 -04008195static void cik_pcie_gen3_enable(struct radeon_device *rdev)
Christian König87167bb2013-04-09 13:39:21 -04008196{
Alex Deucher8a7cd272013-08-06 11:29:39 -04008197 struct pci_dev *root = rdev->pdev->bus->self;
8198 int bridge_pos, gpu_pos;
8199 u32 speed_cntl, mask, current_data_rate;
8200 int ret, i;
8201 u16 tmp16;
Christian König87167bb2013-04-09 13:39:21 -04008202
Alex Deucher8a7cd272013-08-06 11:29:39 -04008203 if (radeon_pcie_gen2 == 0)
8204 return;
Christian König87167bb2013-04-09 13:39:21 -04008205
Alex Deucher8a7cd272013-08-06 11:29:39 -04008206 if (rdev->flags & RADEON_IS_IGP)
8207 return;
Christian König87167bb2013-04-09 13:39:21 -04008208
Alex Deucher8a7cd272013-08-06 11:29:39 -04008209 if (!(rdev->flags & RADEON_IS_PCIE))
8210 return;
Christian König87167bb2013-04-09 13:39:21 -04008211
Alex Deucher8a7cd272013-08-06 11:29:39 -04008212 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
8213 if (ret != 0)
8214 return;
Christian König87167bb2013-04-09 13:39:21 -04008215
Alex Deucher8a7cd272013-08-06 11:29:39 -04008216 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
8217 return;
Christian König87167bb2013-04-09 13:39:21 -04008218
Alex Deucher8a7cd272013-08-06 11:29:39 -04008219 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8220 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
8221 LC_CURRENT_DATA_RATE_SHIFT;
8222 if (mask & DRM_PCIE_SPEED_80) {
8223 if (current_data_rate == 2) {
8224 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
8225 return;
8226 }
8227 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
8228 } else if (mask & DRM_PCIE_SPEED_50) {
8229 if (current_data_rate == 1) {
8230 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
8231 return;
8232 }
8233 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
8234 }
Christian König87167bb2013-04-09 13:39:21 -04008235
Alex Deucher8a7cd272013-08-06 11:29:39 -04008236 bridge_pos = pci_pcie_cap(root);
8237 if (!bridge_pos)
8238 return;
8239
8240 gpu_pos = pci_pcie_cap(rdev->pdev);
8241 if (!gpu_pos)
8242 return;
8243
8244 if (mask & DRM_PCIE_SPEED_80) {
8245 /* re-try equalization if gen3 is not already enabled */
8246 if (current_data_rate != 2) {
8247 u16 bridge_cfg, gpu_cfg;
8248 u16 bridge_cfg2, gpu_cfg2;
8249 u32 max_lw, current_lw, tmp;
8250
8251 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
8252 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
8253
8254 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
8255 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
8256
8257 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
8258 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
8259
8260 tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
8261 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
8262 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
8263
8264 if (current_lw < max_lw) {
8265 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
8266 if (tmp & LC_RENEGOTIATION_SUPPORT) {
8267 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
8268 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
8269 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
8270 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
8271 }
8272 }
8273
8274 for (i = 0; i < 10; i++) {
8275 /* check status */
8276 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
8277 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
8278 break;
8279
8280 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
8281 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
8282
8283 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
8284 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
8285
8286 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8287 tmp |= LC_SET_QUIESCE;
8288 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8289
8290 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8291 tmp |= LC_REDO_EQ;
8292 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8293
8294 mdelay(100);
8295
8296 /* linkctl */
8297 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
8298 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
8299 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
8300 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
8301
8302 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
8303 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
8304 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
8305 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
8306
8307 /* linkctl2 */
8308 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
8309 tmp16 &= ~((1 << 4) | (7 << 9));
8310 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
8311 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
8312
8313 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
8314 tmp16 &= ~((1 << 4) | (7 << 9));
8315 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
8316 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
8317
8318 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8319 tmp &= ~LC_SET_QUIESCE;
8320 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8321 }
8322 }
8323 }
8324
8325 /* set the link speed */
8326 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
8327 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
8328 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
8329
8330 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
8331 tmp16 &= ~0xf;
8332 if (mask & DRM_PCIE_SPEED_80)
8333 tmp16 |= 3; /* gen3 */
8334 else if (mask & DRM_PCIE_SPEED_50)
8335 tmp16 |= 2; /* gen2 */
8336 else
8337 tmp16 |= 1; /* gen1 */
8338 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
8339
8340 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8341 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
8342 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
8343
8344 for (i = 0; i < rdev->usec_timeout; i++) {
8345 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8346 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
8347 break;
8348 udelay(1);
8349 }
8350}
Alex Deucher7235711a42013-04-04 13:58:09 -04008351
8352static void cik_program_aspm(struct radeon_device *rdev)
8353{
8354 u32 data, orig;
8355 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
8356 bool disable_clkreq = false;
8357
8358 if (radeon_aspm == 0)
8359 return;
8360
8361 /* XXX double check IGPs */
8362 if (rdev->flags & RADEON_IS_IGP)
8363 return;
8364
8365 if (!(rdev->flags & RADEON_IS_PCIE))
8366 return;
8367
8368 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
8369 data &= ~LC_XMIT_N_FTS_MASK;
8370 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
8371 if (orig != data)
8372 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
8373
8374 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
8375 data |= LC_GO_TO_RECOVERY;
8376 if (orig != data)
8377 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
8378
8379 orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
8380 data |= P_IGNORE_EDB_ERR;
8381 if (orig != data)
8382 WREG32_PCIE_PORT(PCIE_P_CNTL, data);
8383
8384 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
8385 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
8386 data |= LC_PMI_TO_L1_DIS;
8387 if (!disable_l0s)
8388 data |= LC_L0S_INACTIVITY(7);
8389
8390 if (!disable_l1) {
8391 data |= LC_L1_INACTIVITY(7);
8392 data &= ~LC_PMI_TO_L1_DIS;
8393 if (orig != data)
8394 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8395
8396 if (!disable_plloff_in_l1) {
8397 bool clk_req_support;
8398
8399 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
8400 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
8401 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
8402 if (orig != data)
8403 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
8404
8405 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
8406 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
8407 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
8408 if (orig != data)
8409 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
8410
8411 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
8412 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
8413 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
8414 if (orig != data)
8415 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
8416
8417 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
8418 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
8419 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
8420 if (orig != data)
8421 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
8422
8423 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
8424 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
8425 data |= LC_DYN_LANES_PWR_STATE(3);
8426 if (orig != data)
8427 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
8428
8429 if (!disable_clkreq) {
8430 struct pci_dev *root = rdev->pdev->bus->self;
8431 u32 lnkcap;
8432
8433 clk_req_support = false;
8434 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
8435 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
8436 clk_req_support = true;
8437 } else {
8438 clk_req_support = false;
8439 }
8440
8441 if (clk_req_support) {
8442 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
8443 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
8444 if (orig != data)
8445 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
8446
8447 orig = data = RREG32_SMC(THM_CLK_CNTL);
8448 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
8449 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
8450 if (orig != data)
8451 WREG32_SMC(THM_CLK_CNTL, data);
8452
8453 orig = data = RREG32_SMC(MISC_CLK_CTRL);
8454 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
8455 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
8456 if (orig != data)
8457 WREG32_SMC(MISC_CLK_CTRL, data);
8458
8459 orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
8460 data &= ~BCLK_AS_XCLK;
8461 if (orig != data)
8462 WREG32_SMC(CG_CLKPIN_CNTL, data);
8463
8464 orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
8465 data &= ~FORCE_BIF_REFCLK_EN;
8466 if (orig != data)
8467 WREG32_SMC(CG_CLKPIN_CNTL_2, data);
8468
8469 orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
8470 data &= ~MPLL_CLKOUT_SEL_MASK;
8471 data |= MPLL_CLKOUT_SEL(4);
8472 if (orig != data)
8473 WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
8474 }
8475 }
8476 } else {
8477 if (orig != data)
8478 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8479 }
8480
8481 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
8482 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
8483 if (orig != data)
8484 WREG32_PCIE_PORT(PCIE_CNTL2, data);
8485
8486 if (!disable_l0s) {
8487 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
8488 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
8489 data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
8490 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
8491 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
8492 data &= ~LC_L0S_INACTIVITY_MASK;
8493 if (orig != data)
8494 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8495 }
8496 }
8497 }
Christian König87167bb2013-04-09 13:39:21 -04008498}