2 * Copyright 2012 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
22 * Authors: Alex Deucher
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
29 #include "radeon_asic.h"
30 #include "radeon_audio.h"
33 #include "cik_blit_shaders.h"
34 #include "radeon_ucode.h"
35 #include "clearstate_ci.h"
37 #define SH_MEM_CONFIG_GFX_DEFAULT \
38 ALIGNMENT_MODE(SH_MEM_ALIGNMENT_MODE_UNALIGNED)
40 MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin");
41 MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
42 MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
43 MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
44 MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
45 MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
46 MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
47 MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
48 MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
50 MODULE_FIRMWARE("radeon/bonaire_pfp.bin");
51 MODULE_FIRMWARE("radeon/bonaire_me.bin");
52 MODULE_FIRMWARE("radeon/bonaire_ce.bin");
53 MODULE_FIRMWARE("radeon/bonaire_mec.bin");
54 MODULE_FIRMWARE("radeon/bonaire_mc.bin");
55 MODULE_FIRMWARE("radeon/bonaire_rlc.bin");
56 MODULE_FIRMWARE("radeon/bonaire_sdma.bin");
57 MODULE_FIRMWARE("radeon/bonaire_smc.bin");
58 MODULE_FIRMWARE("radeon/bonaire_k_smc.bin");
60 MODULE_FIRMWARE("radeon/HAWAII_pfp.bin");
61 MODULE_FIRMWARE("radeon/HAWAII_me.bin");
62 MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
63 MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
64 MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
65 MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
66 MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
67 MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
68 MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
70 MODULE_FIRMWARE("radeon/hawaii_pfp.bin");
71 MODULE_FIRMWARE("radeon/hawaii_me.bin");
72 MODULE_FIRMWARE("radeon/hawaii_ce.bin");
73 MODULE_FIRMWARE("radeon/hawaii_mec.bin");
74 MODULE_FIRMWARE("radeon/hawaii_mc.bin");
75 MODULE_FIRMWARE("radeon/hawaii_rlc.bin");
76 MODULE_FIRMWARE("radeon/hawaii_sdma.bin");
77 MODULE_FIRMWARE("radeon/hawaii_smc.bin");
78 MODULE_FIRMWARE("radeon/hawaii_k_smc.bin");
80 MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
81 MODULE_FIRMWARE("radeon/KAVERI_me.bin");
82 MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
83 MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
84 MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
85 MODULE_FIRMWARE("radeon/KAVERI_sdma.bin");
87 MODULE_FIRMWARE("radeon/kaveri_pfp.bin");
88 MODULE_FIRMWARE("radeon/kaveri_me.bin");
89 MODULE_FIRMWARE("radeon/kaveri_ce.bin");
90 MODULE_FIRMWARE("radeon/kaveri_mec.bin");
91 MODULE_FIRMWARE("radeon/kaveri_mec2.bin");
92 MODULE_FIRMWARE("radeon/kaveri_rlc.bin");
93 MODULE_FIRMWARE("radeon/kaveri_sdma.bin");
95 MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
96 MODULE_FIRMWARE("radeon/KABINI_me.bin");
97 MODULE_FIRMWARE("radeon/KABINI_ce.bin");
98 MODULE_FIRMWARE("radeon/KABINI_mec.bin");
99 MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
100 MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
102 MODULE_FIRMWARE("radeon/kabini_pfp.bin");
103 MODULE_FIRMWARE("radeon/kabini_me.bin");
104 MODULE_FIRMWARE("radeon/kabini_ce.bin");
105 MODULE_FIRMWARE("radeon/kabini_mec.bin");
106 MODULE_FIRMWARE("radeon/kabini_rlc.bin");
107 MODULE_FIRMWARE("radeon/kabini_sdma.bin");
109 MODULE_FIRMWARE("radeon/MULLINS_pfp.bin");
110 MODULE_FIRMWARE("radeon/MULLINS_me.bin");
111 MODULE_FIRMWARE("radeon/MULLINS_ce.bin");
112 MODULE_FIRMWARE("radeon/MULLINS_mec.bin");
113 MODULE_FIRMWARE("radeon/MULLINS_rlc.bin");
114 MODULE_FIRMWARE("radeon/MULLINS_sdma.bin");
116 MODULE_FIRMWARE("radeon/mullins_pfp.bin");
117 MODULE_FIRMWARE("radeon/mullins_me.bin");
118 MODULE_FIRMWARE("radeon/mullins_ce.bin");
119 MODULE_FIRMWARE("radeon/mullins_mec.bin");
120 MODULE_FIRMWARE("radeon/mullins_rlc.bin");
121 MODULE_FIRMWARE("radeon/mullins_sdma.bin");
123 extern int r600_ih_ring_alloc(struct radeon_device
*rdev
);
124 extern void r600_ih_ring_fini(struct radeon_device
*rdev
);
125 extern void evergreen_mc_stop(struct radeon_device
*rdev
, struct evergreen_mc_save
*save
);
126 extern void evergreen_mc_resume(struct radeon_device
*rdev
, struct evergreen_mc_save
*save
);
127 extern bool evergreen_is_display_hung(struct radeon_device
*rdev
);
128 extern void sumo_rlc_fini(struct radeon_device
*rdev
);
129 extern int sumo_rlc_init(struct radeon_device
*rdev
);
130 extern void si_vram_gtt_location(struct radeon_device
*rdev
, struct radeon_mc
*mc
);
131 extern void si_rlc_reset(struct radeon_device
*rdev
);
132 extern void si_init_uvd_internal_cg(struct radeon_device
*rdev
);
133 static u32
cik_get_cu_active_bitmap(struct radeon_device
*rdev
, u32 se
, u32 sh
);
134 extern int cik_sdma_resume(struct radeon_device
*rdev
);
135 extern void cik_sdma_enable(struct radeon_device
*rdev
, bool enable
);
136 extern void cik_sdma_fini(struct radeon_device
*rdev
);
137 extern void vce_v2_0_enable_mgcg(struct radeon_device
*rdev
, bool enable
);
138 static void cik_rlc_stop(struct radeon_device
*rdev
);
139 static void cik_pcie_gen3_enable(struct radeon_device
*rdev
);
140 static void cik_program_aspm(struct radeon_device
*rdev
);
141 static void cik_init_pg(struct radeon_device
*rdev
);
142 static void cik_init_cg(struct radeon_device
*rdev
);
143 static void cik_fini_pg(struct radeon_device
*rdev
);
144 static void cik_fini_cg(struct radeon_device
*rdev
);
145 static void cik_enable_gui_idle_interrupt(struct radeon_device
*rdev
,
149 * cik_get_allowed_info_register - fetch the register for the info ioctl
151 * @rdev: radeon_device pointer
152 * @reg: register offset in bytes
153 * @val: register value
155 * Returns 0 for success or -EINVAL for an invalid register
158 int cik_get_allowed_info_register(struct radeon_device
*rdev
,
164 case GRBM_STATUS_SE0
:
165 case GRBM_STATUS_SE1
:
166 case GRBM_STATUS_SE2
:
167 case GRBM_STATUS_SE3
:
170 case (SDMA0_STATUS_REG
+ SDMA0_REGISTER_OFFSET
):
171 case (SDMA0_STATUS_REG
+ SDMA1_REGISTER_OFFSET
):
182 * Indirect registers accessor
184 u32
cik_didt_rreg(struct radeon_device
*rdev
, u32 reg
)
189 spin_lock_irqsave(&rdev
->didt_idx_lock
, flags
);
190 WREG32(CIK_DIDT_IND_INDEX
, (reg
));
191 r
= RREG32(CIK_DIDT_IND_DATA
);
192 spin_unlock_irqrestore(&rdev
->didt_idx_lock
, flags
);
196 void cik_didt_wreg(struct radeon_device
*rdev
, u32 reg
, u32 v
)
200 spin_lock_irqsave(&rdev
->didt_idx_lock
, flags
);
201 WREG32(CIK_DIDT_IND_INDEX
, (reg
));
202 WREG32(CIK_DIDT_IND_DATA
, (v
));
203 spin_unlock_irqrestore(&rdev
->didt_idx_lock
, flags
);
206 /* get temperature in millidegrees */
207 int ci_get_temp(struct radeon_device
*rdev
)
212 temp
= (RREG32_SMC(CG_MULT_THERMAL_STATUS
) & CTF_TEMP_MASK
) >>
218 actual_temp
= temp
& 0x1ff;
220 actual_temp
= actual_temp
* 1000;
225 /* get temperature in millidegrees */
226 int kv_get_temp(struct radeon_device
*rdev
)
231 temp
= RREG32_SMC(0xC0300E0C);
234 actual_temp
= (temp
/ 8) - 49;
238 actual_temp
= actual_temp
* 1000;
244 * Indirect registers accessor
246 u32
cik_pciep_rreg(struct radeon_device
*rdev
, u32 reg
)
251 spin_lock_irqsave(&rdev
->pciep_idx_lock
, flags
);
252 WREG32(PCIE_INDEX
, reg
);
253 (void)RREG32(PCIE_INDEX
);
254 r
= RREG32(PCIE_DATA
);
255 spin_unlock_irqrestore(&rdev
->pciep_idx_lock
, flags
);
259 void cik_pciep_wreg(struct radeon_device
*rdev
, u32 reg
, u32 v
)
263 spin_lock_irqsave(&rdev
->pciep_idx_lock
, flags
);
264 WREG32(PCIE_INDEX
, reg
);
265 (void)RREG32(PCIE_INDEX
);
266 WREG32(PCIE_DATA
, v
);
267 (void)RREG32(PCIE_DATA
);
268 spin_unlock_irqrestore(&rdev
->pciep_idx_lock
, flags
);
271 static const u32 spectre_rlc_save_restore_register_list
[] =
273 (0x0e00 << 16) | (0xc12c >> 2),
275 (0x0e00 << 16) | (0xc140 >> 2),
277 (0x0e00 << 16) | (0xc150 >> 2),
279 (0x0e00 << 16) | (0xc15c >> 2),
281 (0x0e00 << 16) | (0xc168 >> 2),
283 (0x0e00 << 16) | (0xc170 >> 2),
285 (0x0e00 << 16) | (0xc178 >> 2),
287 (0x0e00 << 16) | (0xc204 >> 2),
289 (0x0e00 << 16) | (0xc2b4 >> 2),
291 (0x0e00 << 16) | (0xc2b8 >> 2),
293 (0x0e00 << 16) | (0xc2bc >> 2),
295 (0x0e00 << 16) | (0xc2c0 >> 2),
297 (0x0e00 << 16) | (0x8228 >> 2),
299 (0x0e00 << 16) | (0x829c >> 2),
301 (0x0e00 << 16) | (0x869c >> 2),
303 (0x0600 << 16) | (0x98f4 >> 2),
305 (0x0e00 << 16) | (0x98f8 >> 2),
307 (0x0e00 << 16) | (0x9900 >> 2),
309 (0x0e00 << 16) | (0xc260 >> 2),
311 (0x0e00 << 16) | (0x90e8 >> 2),
313 (0x0e00 << 16) | (0x3c000 >> 2),
315 (0x0e00 << 16) | (0x3c00c >> 2),
317 (0x0e00 << 16) | (0x8c1c >> 2),
319 (0x0e00 << 16) | (0x9700 >> 2),
321 (0x0e00 << 16) | (0xcd20 >> 2),
323 (0x4e00 << 16) | (0xcd20 >> 2),
325 (0x5e00 << 16) | (0xcd20 >> 2),
327 (0x6e00 << 16) | (0xcd20 >> 2),
329 (0x7e00 << 16) | (0xcd20 >> 2),
331 (0x8e00 << 16) | (0xcd20 >> 2),
333 (0x9e00 << 16) | (0xcd20 >> 2),
335 (0xae00 << 16) | (0xcd20 >> 2),
337 (0xbe00 << 16) | (0xcd20 >> 2),
339 (0x0e00 << 16) | (0x89bc >> 2),
341 (0x0e00 << 16) | (0x8900 >> 2),
344 (0x0e00 << 16) | (0xc130 >> 2),
346 (0x0e00 << 16) | (0xc134 >> 2),
348 (0x0e00 << 16) | (0xc1fc >> 2),
350 (0x0e00 << 16) | (0xc208 >> 2),
352 (0x0e00 << 16) | (0xc264 >> 2),
354 (0x0e00 << 16) | (0xc268 >> 2),
356 (0x0e00 << 16) | (0xc26c >> 2),
358 (0x0e00 << 16) | (0xc270 >> 2),
360 (0x0e00 << 16) | (0xc274 >> 2),
362 (0x0e00 << 16) | (0xc278 >> 2),
364 (0x0e00 << 16) | (0xc27c >> 2),
366 (0x0e00 << 16) | (0xc280 >> 2),
368 (0x0e00 << 16) | (0xc284 >> 2),
370 (0x0e00 << 16) | (0xc288 >> 2),
372 (0x0e00 << 16) | (0xc28c >> 2),
374 (0x0e00 << 16) | (0xc290 >> 2),
376 (0x0e00 << 16) | (0xc294 >> 2),
378 (0x0e00 << 16) | (0xc298 >> 2),
380 (0x0e00 << 16) | (0xc29c >> 2),
382 (0x0e00 << 16) | (0xc2a0 >> 2),
384 (0x0e00 << 16) | (0xc2a4 >> 2),
386 (0x0e00 << 16) | (0xc2a8 >> 2),
388 (0x0e00 << 16) | (0xc2ac >> 2),
390 (0x0e00 << 16) | (0xc2b0 >> 2),
392 (0x0e00 << 16) | (0x301d0 >> 2),
394 (0x0e00 << 16) | (0x30238 >> 2),
396 (0x0e00 << 16) | (0x30250 >> 2),
398 (0x0e00 << 16) | (0x30254 >> 2),
400 (0x0e00 << 16) | (0x30258 >> 2),
402 (0x0e00 << 16) | (0x3025c >> 2),
404 (0x4e00 << 16) | (0xc900 >> 2),
406 (0x5e00 << 16) | (0xc900 >> 2),
408 (0x6e00 << 16) | (0xc900 >> 2),
410 (0x7e00 << 16) | (0xc900 >> 2),
412 (0x8e00 << 16) | (0xc900 >> 2),
414 (0x9e00 << 16) | (0xc900 >> 2),
416 (0xae00 << 16) | (0xc900 >> 2),
418 (0xbe00 << 16) | (0xc900 >> 2),
420 (0x4e00 << 16) | (0xc904 >> 2),
422 (0x5e00 << 16) | (0xc904 >> 2),
424 (0x6e00 << 16) | (0xc904 >> 2),
426 (0x7e00 << 16) | (0xc904 >> 2),
428 (0x8e00 << 16) | (0xc904 >> 2),
430 (0x9e00 << 16) | (0xc904 >> 2),
432 (0xae00 << 16) | (0xc904 >> 2),
434 (0xbe00 << 16) | (0xc904 >> 2),
436 (0x4e00 << 16) | (0xc908 >> 2),
438 (0x5e00 << 16) | (0xc908 >> 2),
440 (0x6e00 << 16) | (0xc908 >> 2),
442 (0x7e00 << 16) | (0xc908 >> 2),
444 (0x8e00 << 16) | (0xc908 >> 2),
446 (0x9e00 << 16) | (0xc908 >> 2),
448 (0xae00 << 16) | (0xc908 >> 2),
450 (0xbe00 << 16) | (0xc908 >> 2),
452 (0x4e00 << 16) | (0xc90c >> 2),
454 (0x5e00 << 16) | (0xc90c >> 2),
456 (0x6e00 << 16) | (0xc90c >> 2),
458 (0x7e00 << 16) | (0xc90c >> 2),
460 (0x8e00 << 16) | (0xc90c >> 2),
462 (0x9e00 << 16) | (0xc90c >> 2),
464 (0xae00 << 16) | (0xc90c >> 2),
466 (0xbe00 << 16) | (0xc90c >> 2),
468 (0x4e00 << 16) | (0xc910 >> 2),
470 (0x5e00 << 16) | (0xc910 >> 2),
472 (0x6e00 << 16) | (0xc910 >> 2),
474 (0x7e00 << 16) | (0xc910 >> 2),
476 (0x8e00 << 16) | (0xc910 >> 2),
478 (0x9e00 << 16) | (0xc910 >> 2),
480 (0xae00 << 16) | (0xc910 >> 2),
482 (0xbe00 << 16) | (0xc910 >> 2),
484 (0x0e00 << 16) | (0xc99c >> 2),
486 (0x0e00 << 16) | (0x9834 >> 2),
488 (0x0000 << 16) | (0x30f00 >> 2),
490 (0x0001 << 16) | (0x30f00 >> 2),
492 (0x0000 << 16) | (0x30f04 >> 2),
494 (0x0001 << 16) | (0x30f04 >> 2),
496 (0x0000 << 16) | (0x30f08 >> 2),
498 (0x0001 << 16) | (0x30f08 >> 2),
500 (0x0000 << 16) | (0x30f0c >> 2),
502 (0x0001 << 16) | (0x30f0c >> 2),
504 (0x0600 << 16) | (0x9b7c >> 2),
506 (0x0e00 << 16) | (0x8a14 >> 2),
508 (0x0e00 << 16) | (0x8a18 >> 2),
510 (0x0600 << 16) | (0x30a00 >> 2),
512 (0x0e00 << 16) | (0x8bf0 >> 2),
514 (0x0e00 << 16) | (0x8bcc >> 2),
516 (0x0e00 << 16) | (0x8b24 >> 2),
518 (0x0e00 << 16) | (0x30a04 >> 2),
520 (0x0600 << 16) | (0x30a10 >> 2),
522 (0x0600 << 16) | (0x30a14 >> 2),
524 (0x0600 << 16) | (0x30a18 >> 2),
526 (0x0600 << 16) | (0x30a2c >> 2),
528 (0x0e00 << 16) | (0xc700 >> 2),
530 (0x0e00 << 16) | (0xc704 >> 2),
532 (0x0e00 << 16) | (0xc708 >> 2),
534 (0x0e00 << 16) | (0xc768 >> 2),
536 (0x0400 << 16) | (0xc770 >> 2),
538 (0x0400 << 16) | (0xc774 >> 2),
540 (0x0400 << 16) | (0xc778 >> 2),
542 (0x0400 << 16) | (0xc77c >> 2),
544 (0x0400 << 16) | (0xc780 >> 2),
546 (0x0400 << 16) | (0xc784 >> 2),
548 (0x0400 << 16) | (0xc788 >> 2),
550 (0x0400 << 16) | (0xc78c >> 2),
552 (0x0400 << 16) | (0xc798 >> 2),
554 (0x0400 << 16) | (0xc79c >> 2),
556 (0x0400 << 16) | (0xc7a0 >> 2),
558 (0x0400 << 16) | (0xc7a4 >> 2),
560 (0x0400 << 16) | (0xc7a8 >> 2),
562 (0x0400 << 16) | (0xc7ac >> 2),
564 (0x0400 << 16) | (0xc7b0 >> 2),
566 (0x0400 << 16) | (0xc7b4 >> 2),
568 (0x0e00 << 16) | (0x9100 >> 2),
570 (0x0e00 << 16) | (0x3c010 >> 2),
572 (0x0e00 << 16) | (0x92a8 >> 2),
574 (0x0e00 << 16) | (0x92ac >> 2),
576 (0x0e00 << 16) | (0x92b4 >> 2),
578 (0x0e00 << 16) | (0x92b8 >> 2),
580 (0x0e00 << 16) | (0x92bc >> 2),
582 (0x0e00 << 16) | (0x92c0 >> 2),
584 (0x0e00 << 16) | (0x92c4 >> 2),
586 (0x0e00 << 16) | (0x92c8 >> 2),
588 (0x0e00 << 16) | (0x92cc >> 2),
590 (0x0e00 << 16) | (0x92d0 >> 2),
592 (0x0e00 << 16) | (0x8c00 >> 2),
594 (0x0e00 << 16) | (0x8c04 >> 2),
596 (0x0e00 << 16) | (0x8c20 >> 2),
598 (0x0e00 << 16) | (0x8c38 >> 2),
600 (0x0e00 << 16) | (0x8c3c >> 2),
602 (0x0e00 << 16) | (0xae00 >> 2),
604 (0x0e00 << 16) | (0x9604 >> 2),
606 (0x0e00 << 16) | (0xac08 >> 2),
608 (0x0e00 << 16) | (0xac0c >> 2),
610 (0x0e00 << 16) | (0xac10 >> 2),
612 (0x0e00 << 16) | (0xac14 >> 2),
614 (0x0e00 << 16) | (0xac58 >> 2),
616 (0x0e00 << 16) | (0xac68 >> 2),
618 (0x0e00 << 16) | (0xac6c >> 2),
620 (0x0e00 << 16) | (0xac70 >> 2),
622 (0x0e00 << 16) | (0xac74 >> 2),
624 (0x0e00 << 16) | (0xac78 >> 2),
626 (0x0e00 << 16) | (0xac7c >> 2),
628 (0x0e00 << 16) | (0xac80 >> 2),
630 (0x0e00 << 16) | (0xac84 >> 2),
632 (0x0e00 << 16) | (0xac88 >> 2),
634 (0x0e00 << 16) | (0xac8c >> 2),
636 (0x0e00 << 16) | (0x970c >> 2),
638 (0x0e00 << 16) | (0x9714 >> 2),
640 (0x0e00 << 16) | (0x9718 >> 2),
642 (0x0e00 << 16) | (0x971c >> 2),
644 (0x0e00 << 16) | (0x31068 >> 2),
646 (0x4e00 << 16) | (0x31068 >> 2),
648 (0x5e00 << 16) | (0x31068 >> 2),
650 (0x6e00 << 16) | (0x31068 >> 2),
652 (0x7e00 << 16) | (0x31068 >> 2),
654 (0x8e00 << 16) | (0x31068 >> 2),
656 (0x9e00 << 16) | (0x31068 >> 2),
658 (0xae00 << 16) | (0x31068 >> 2),
660 (0xbe00 << 16) | (0x31068 >> 2),
662 (0x0e00 << 16) | (0xcd10 >> 2),
664 (0x0e00 << 16) | (0xcd14 >> 2),
666 (0x0e00 << 16) | (0x88b0 >> 2),
668 (0x0e00 << 16) | (0x88b4 >> 2),
670 (0x0e00 << 16) | (0x88b8 >> 2),
672 (0x0e00 << 16) | (0x88bc >> 2),
674 (0x0400 << 16) | (0x89c0 >> 2),
676 (0x0e00 << 16) | (0x88c4 >> 2),
678 (0x0e00 << 16) | (0x88c8 >> 2),
680 (0x0e00 << 16) | (0x88d0 >> 2),
682 (0x0e00 << 16) | (0x88d4 >> 2),
684 (0x0e00 << 16) | (0x88d8 >> 2),
686 (0x0e00 << 16) | (0x8980 >> 2),
688 (0x0e00 << 16) | (0x30938 >> 2),
690 (0x0e00 << 16) | (0x3093c >> 2),
692 (0x0e00 << 16) | (0x30940 >> 2),
694 (0x0e00 << 16) | (0x89a0 >> 2),
696 (0x0e00 << 16) | (0x30900 >> 2),
698 (0x0e00 << 16) | (0x30904 >> 2),
700 (0x0e00 << 16) | (0x89b4 >> 2),
702 (0x0e00 << 16) | (0x3c210 >> 2),
704 (0x0e00 << 16) | (0x3c214 >> 2),
706 (0x0e00 << 16) | (0x3c218 >> 2),
708 (0x0e00 << 16) | (0x8904 >> 2),
711 (0x0e00 << 16) | (0x8c28 >> 2),
712 (0x0e00 << 16) | (0x8c2c >> 2),
713 (0x0e00 << 16) | (0x8c30 >> 2),
714 (0x0e00 << 16) | (0x8c34 >> 2),
715 (0x0e00 << 16) | (0x9600 >> 2),
718 static const u32 kalindi_rlc_save_restore_register_list
[] =
720 (0x0e00 << 16) | (0xc12c >> 2),
722 (0x0e00 << 16) | (0xc140 >> 2),
724 (0x0e00 << 16) | (0xc150 >> 2),
726 (0x0e00 << 16) | (0xc15c >> 2),
728 (0x0e00 << 16) | (0xc168 >> 2),
730 (0x0e00 << 16) | (0xc170 >> 2),
732 (0x0e00 << 16) | (0xc204 >> 2),
734 (0x0e00 << 16) | (0xc2b4 >> 2),
736 (0x0e00 << 16) | (0xc2b8 >> 2),
738 (0x0e00 << 16) | (0xc2bc >> 2),
740 (0x0e00 << 16) | (0xc2c0 >> 2),
742 (0x0e00 << 16) | (0x8228 >> 2),
744 (0x0e00 << 16) | (0x829c >> 2),
746 (0x0e00 << 16) | (0x869c >> 2),
748 (0x0600 << 16) | (0x98f4 >> 2),
750 (0x0e00 << 16) | (0x98f8 >> 2),
752 (0x0e00 << 16) | (0x9900 >> 2),
754 (0x0e00 << 16) | (0xc260 >> 2),
756 (0x0e00 << 16) | (0x90e8 >> 2),
758 (0x0e00 << 16) | (0x3c000 >> 2),
760 (0x0e00 << 16) | (0x3c00c >> 2),
762 (0x0e00 << 16) | (0x8c1c >> 2),
764 (0x0e00 << 16) | (0x9700 >> 2),
766 (0x0e00 << 16) | (0xcd20 >> 2),
768 (0x4e00 << 16) | (0xcd20 >> 2),
770 (0x5e00 << 16) | (0xcd20 >> 2),
772 (0x6e00 << 16) | (0xcd20 >> 2),
774 (0x7e00 << 16) | (0xcd20 >> 2),
776 (0x0e00 << 16) | (0x89bc >> 2),
778 (0x0e00 << 16) | (0x8900 >> 2),
781 (0x0e00 << 16) | (0xc130 >> 2),
783 (0x0e00 << 16) | (0xc134 >> 2),
785 (0x0e00 << 16) | (0xc1fc >> 2),
787 (0x0e00 << 16) | (0xc208 >> 2),
789 (0x0e00 << 16) | (0xc264 >> 2),
791 (0x0e00 << 16) | (0xc268 >> 2),
793 (0x0e00 << 16) | (0xc26c >> 2),
795 (0x0e00 << 16) | (0xc270 >> 2),
797 (0x0e00 << 16) | (0xc274 >> 2),
799 (0x0e00 << 16) | (0xc28c >> 2),
801 (0x0e00 << 16) | (0xc290 >> 2),
803 (0x0e00 << 16) | (0xc294 >> 2),
805 (0x0e00 << 16) | (0xc298 >> 2),
807 (0x0e00 << 16) | (0xc2a0 >> 2),
809 (0x0e00 << 16) | (0xc2a4 >> 2),
811 (0x0e00 << 16) | (0xc2a8 >> 2),
813 (0x0e00 << 16) | (0xc2ac >> 2),
815 (0x0e00 << 16) | (0x301d0 >> 2),
817 (0x0e00 << 16) | (0x30238 >> 2),
819 (0x0e00 << 16) | (0x30250 >> 2),
821 (0x0e00 << 16) | (0x30254 >> 2),
823 (0x0e00 << 16) | (0x30258 >> 2),
825 (0x0e00 << 16) | (0x3025c >> 2),
827 (0x4e00 << 16) | (0xc900 >> 2),
829 (0x5e00 << 16) | (0xc900 >> 2),
831 (0x6e00 << 16) | (0xc900 >> 2),
833 (0x7e00 << 16) | (0xc900 >> 2),
835 (0x4e00 << 16) | (0xc904 >> 2),
837 (0x5e00 << 16) | (0xc904 >> 2),
839 (0x6e00 << 16) | (0xc904 >> 2),
841 (0x7e00 << 16) | (0xc904 >> 2),
843 (0x4e00 << 16) | (0xc908 >> 2),
845 (0x5e00 << 16) | (0xc908 >> 2),
847 (0x6e00 << 16) | (0xc908 >> 2),
849 (0x7e00 << 16) | (0xc908 >> 2),
851 (0x4e00 << 16) | (0xc90c >> 2),
853 (0x5e00 << 16) | (0xc90c >> 2),
855 (0x6e00 << 16) | (0xc90c >> 2),
857 (0x7e00 << 16) | (0xc90c >> 2),
859 (0x4e00 << 16) | (0xc910 >> 2),
861 (0x5e00 << 16) | (0xc910 >> 2),
863 (0x6e00 << 16) | (0xc910 >> 2),
865 (0x7e00 << 16) | (0xc910 >> 2),
867 (0x0e00 << 16) | (0xc99c >> 2),
869 (0x0e00 << 16) | (0x9834 >> 2),
871 (0x0000 << 16) | (0x30f00 >> 2),
873 (0x0000 << 16) | (0x30f04 >> 2),
875 (0x0000 << 16) | (0x30f08 >> 2),
877 (0x0000 << 16) | (0x30f0c >> 2),
879 (0x0600 << 16) | (0x9b7c >> 2),
881 (0x0e00 << 16) | (0x8a14 >> 2),
883 (0x0e00 << 16) | (0x8a18 >> 2),
885 (0x0600 << 16) | (0x30a00 >> 2),
887 (0x0e00 << 16) | (0x8bf0 >> 2),
889 (0x0e00 << 16) | (0x8bcc >> 2),
891 (0x0e00 << 16) | (0x8b24 >> 2),
893 (0x0e00 << 16) | (0x30a04 >> 2),
895 (0x0600 << 16) | (0x30a10 >> 2),
897 (0x0600 << 16) | (0x30a14 >> 2),
899 (0x0600 << 16) | (0x30a18 >> 2),
901 (0x0600 << 16) | (0x30a2c >> 2),
903 (0x0e00 << 16) | (0xc700 >> 2),
905 (0x0e00 << 16) | (0xc704 >> 2),
907 (0x0e00 << 16) | (0xc708 >> 2),
909 (0x0e00 << 16) | (0xc768 >> 2),
911 (0x0400 << 16) | (0xc770 >> 2),
913 (0x0400 << 16) | (0xc774 >> 2),
915 (0x0400 << 16) | (0xc798 >> 2),
917 (0x0400 << 16) | (0xc79c >> 2),
919 (0x0e00 << 16) | (0x9100 >> 2),
921 (0x0e00 << 16) | (0x3c010 >> 2),
923 (0x0e00 << 16) | (0x8c00 >> 2),
925 (0x0e00 << 16) | (0x8c04 >> 2),
927 (0x0e00 << 16) | (0x8c20 >> 2),
929 (0x0e00 << 16) | (0x8c38 >> 2),
931 (0x0e00 << 16) | (0x8c3c >> 2),
933 (0x0e00 << 16) | (0xae00 >> 2),
935 (0x0e00 << 16) | (0x9604 >> 2),
937 (0x0e00 << 16) | (0xac08 >> 2),
939 (0x0e00 << 16) | (0xac0c >> 2),
941 (0x0e00 << 16) | (0xac10 >> 2),
943 (0x0e00 << 16) | (0xac14 >> 2),
945 (0x0e00 << 16) | (0xac58 >> 2),
947 (0x0e00 << 16) | (0xac68 >> 2),
949 (0x0e00 << 16) | (0xac6c >> 2),
951 (0x0e00 << 16) | (0xac70 >> 2),
953 (0x0e00 << 16) | (0xac74 >> 2),
955 (0x0e00 << 16) | (0xac78 >> 2),
957 (0x0e00 << 16) | (0xac7c >> 2),
959 (0x0e00 << 16) | (0xac80 >> 2),
961 (0x0e00 << 16) | (0xac84 >> 2),
963 (0x0e00 << 16) | (0xac88 >> 2),
965 (0x0e00 << 16) | (0xac8c >> 2),
967 (0x0e00 << 16) | (0x970c >> 2),
969 (0x0e00 << 16) | (0x9714 >> 2),
971 (0x0e00 << 16) | (0x9718 >> 2),
973 (0x0e00 << 16) | (0x971c >> 2),
975 (0x0e00 << 16) | (0x31068 >> 2),
977 (0x4e00 << 16) | (0x31068 >> 2),
979 (0x5e00 << 16) | (0x31068 >> 2),
981 (0x6e00 << 16) | (0x31068 >> 2),
983 (0x7e00 << 16) | (0x31068 >> 2),
985 (0x0e00 << 16) | (0xcd10 >> 2),
987 (0x0e00 << 16) | (0xcd14 >> 2),
989 (0x0e00 << 16) | (0x88b0 >> 2),
991 (0x0e00 << 16) | (0x88b4 >> 2),
993 (0x0e00 << 16) | (0x88b8 >> 2),
995 (0x0e00 << 16) | (0x88bc >> 2),
997 (0x0400 << 16) | (0x89c0 >> 2),
999 (0x0e00 << 16) | (0x88c4 >> 2),
1001 (0x0e00 << 16) | (0x88c8 >> 2),
1003 (0x0e00 << 16) | (0x88d0 >> 2),
1005 (0x0e00 << 16) | (0x88d4 >> 2),
1007 (0x0e00 << 16) | (0x88d8 >> 2),
1009 (0x0e00 << 16) | (0x8980 >> 2),
1011 (0x0e00 << 16) | (0x30938 >> 2),
1013 (0x0e00 << 16) | (0x3093c >> 2),
1015 (0x0e00 << 16) | (0x30940 >> 2),
1017 (0x0e00 << 16) | (0x89a0 >> 2),
1019 (0x0e00 << 16) | (0x30900 >> 2),
1021 (0x0e00 << 16) | (0x30904 >> 2),
1023 (0x0e00 << 16) | (0x89b4 >> 2),
1025 (0x0e00 << 16) | (0x3e1fc >> 2),
1027 (0x0e00 << 16) | (0x3c210 >> 2),
1029 (0x0e00 << 16) | (0x3c214 >> 2),
1031 (0x0e00 << 16) | (0x3c218 >> 2),
1033 (0x0e00 << 16) | (0x8904 >> 2),
1036 (0x0e00 << 16) | (0x8c28 >> 2),
1037 (0x0e00 << 16) | (0x8c2c >> 2),
1038 (0x0e00 << 16) | (0x8c30 >> 2),
1039 (0x0e00 << 16) | (0x8c34 >> 2),
1040 (0x0e00 << 16) | (0x9600 >> 2),
1043 static const u32 bonaire_golden_spm_registers
[] =
1045 0x30800, 0xe0ffffff, 0xe0000000
1048 static const u32 bonaire_golden_common_registers
[] =
1050 0xc770, 0xffffffff, 0x00000800,
1051 0xc774, 0xffffffff, 0x00000800,
1052 0xc798, 0xffffffff, 0x00007fbf,
1053 0xc79c, 0xffffffff, 0x00007faf
1056 static const u32 bonaire_golden_registers
[] =
1058 0x3354, 0x00000333, 0x00000333,
1059 0x3350, 0x000c0fc0, 0x00040200,
1060 0x9a10, 0x00010000, 0x00058208,
1061 0x3c000, 0xffff1fff, 0x00140000,
1062 0x3c200, 0xfdfc0fff, 0x00000100,
1063 0x3c234, 0x40000000, 0x40000200,
1064 0x9830, 0xffffffff, 0x00000000,
1065 0x9834, 0xf00fffff, 0x00000400,
1066 0x9838, 0x0002021c, 0x00020200,
1067 0xc78, 0x00000080, 0x00000000,
1068 0x5bb0, 0x000000f0, 0x00000070,
1069 0x5bc0, 0xf0311fff, 0x80300000,
1070 0x98f8, 0x73773777, 0x12010001,
1071 0x350c, 0x00810000, 0x408af000,
1072 0x7030, 0x31000111, 0x00000011,
1073 0x2f48, 0x73773777, 0x12010001,
1074 0x220c, 0x00007fb6, 0x0021a1b1,
1075 0x2210, 0x00007fb6, 0x002021b1,
1076 0x2180, 0x00007fb6, 0x00002191,
1077 0x2218, 0x00007fb6, 0x002121b1,
1078 0x221c, 0x00007fb6, 0x002021b1,
1079 0x21dc, 0x00007fb6, 0x00002191,
1080 0x21e0, 0x00007fb6, 0x00002191,
1081 0x3628, 0x0000003f, 0x0000000a,
1082 0x362c, 0x0000003f, 0x0000000a,
1083 0x2ae4, 0x00073ffe, 0x000022a2,
1084 0x240c, 0x000007ff, 0x00000000,
1085 0x8a14, 0xf000003f, 0x00000007,
1086 0x8bf0, 0x00002001, 0x00000001,
1087 0x8b24, 0xffffffff, 0x00ffffff,
1088 0x30a04, 0x0000ff0f, 0x00000000,
1089 0x28a4c, 0x07ffffff, 0x06000000,
1090 0x4d8, 0x00000fff, 0x00000100,
1091 0x3e78, 0x00000001, 0x00000002,
1092 0x9100, 0x03000000, 0x0362c688,
1093 0x8c00, 0x000000ff, 0x00000001,
1094 0xe40, 0x00001fff, 0x00001fff,
1095 0x9060, 0x0000007f, 0x00000020,
1096 0x9508, 0x00010000, 0x00010000,
1097 0xac14, 0x000003ff, 0x000000f3,
1098 0xac0c, 0xffffffff, 0x00001032
1101 static const u32 bonaire_mgcg_cgcg_init
[] =
1103 0xc420, 0xffffffff, 0xfffffffc,
1104 0x30800, 0xffffffff, 0xe0000000,
1105 0x3c2a0, 0xffffffff, 0x00000100,
1106 0x3c208, 0xffffffff, 0x00000100,
1107 0x3c2c0, 0xffffffff, 0xc0000100,
1108 0x3c2c8, 0xffffffff, 0xc0000100,
1109 0x3c2c4, 0xffffffff, 0xc0000100,
1110 0x55e4, 0xffffffff, 0x00600100,
1111 0x3c280, 0xffffffff, 0x00000100,
1112 0x3c214, 0xffffffff, 0x06000100,
1113 0x3c220, 0xffffffff, 0x00000100,
1114 0x3c218, 0xffffffff, 0x06000100,
1115 0x3c204, 0xffffffff, 0x00000100,
1116 0x3c2e0, 0xffffffff, 0x00000100,
1117 0x3c224, 0xffffffff, 0x00000100,
1118 0x3c200, 0xffffffff, 0x00000100,
1119 0x3c230, 0xffffffff, 0x00000100,
1120 0x3c234, 0xffffffff, 0x00000100,
1121 0x3c250, 0xffffffff, 0x00000100,
1122 0x3c254, 0xffffffff, 0x00000100,
1123 0x3c258, 0xffffffff, 0x00000100,
1124 0x3c25c, 0xffffffff, 0x00000100,
1125 0x3c260, 0xffffffff, 0x00000100,
1126 0x3c27c, 0xffffffff, 0x00000100,
1127 0x3c278, 0xffffffff, 0x00000100,
1128 0x3c210, 0xffffffff, 0x06000100,
1129 0x3c290, 0xffffffff, 0x00000100,
1130 0x3c274, 0xffffffff, 0x00000100,
1131 0x3c2b4, 0xffffffff, 0x00000100,
1132 0x3c2b0, 0xffffffff, 0x00000100,
1133 0x3c270, 0xffffffff, 0x00000100,
1134 0x30800, 0xffffffff, 0xe0000000,
1135 0x3c020, 0xffffffff, 0x00010000,
1136 0x3c024, 0xffffffff, 0x00030002,
1137 0x3c028, 0xffffffff, 0x00040007,
1138 0x3c02c, 0xffffffff, 0x00060005,
1139 0x3c030, 0xffffffff, 0x00090008,
1140 0x3c034, 0xffffffff, 0x00010000,
1141 0x3c038, 0xffffffff, 0x00030002,
1142 0x3c03c, 0xffffffff, 0x00040007,
1143 0x3c040, 0xffffffff, 0x00060005,
1144 0x3c044, 0xffffffff, 0x00090008,
1145 0x3c048, 0xffffffff, 0x00010000,
1146 0x3c04c, 0xffffffff, 0x00030002,
1147 0x3c050, 0xffffffff, 0x00040007,
1148 0x3c054, 0xffffffff, 0x00060005,
1149 0x3c058, 0xffffffff, 0x00090008,
1150 0x3c05c, 0xffffffff, 0x00010000,
1151 0x3c060, 0xffffffff, 0x00030002,
1152 0x3c064, 0xffffffff, 0x00040007,
1153 0x3c068, 0xffffffff, 0x00060005,
1154 0x3c06c, 0xffffffff, 0x00090008,
1155 0x3c070, 0xffffffff, 0x00010000,
1156 0x3c074, 0xffffffff, 0x00030002,
1157 0x3c078, 0xffffffff, 0x00040007,
1158 0x3c07c, 0xffffffff, 0x00060005,
1159 0x3c080, 0xffffffff, 0x00090008,
1160 0x3c084, 0xffffffff, 0x00010000,
1161 0x3c088, 0xffffffff, 0x00030002,
1162 0x3c08c, 0xffffffff, 0x00040007,
1163 0x3c090, 0xffffffff, 0x00060005,
1164 0x3c094, 0xffffffff, 0x00090008,
1165 0x3c098, 0xffffffff, 0x00010000,
1166 0x3c09c, 0xffffffff, 0x00030002,
1167 0x3c0a0, 0xffffffff, 0x00040007,
1168 0x3c0a4, 0xffffffff, 0x00060005,
1169 0x3c0a8, 0xffffffff, 0x00090008,
1170 0x3c000, 0xffffffff, 0x96e00200,
1171 0x8708, 0xffffffff, 0x00900100,
1172 0xc424, 0xffffffff, 0x0020003f,
1173 0x38, 0xffffffff, 0x0140001c,
1174 0x3c, 0x000f0000, 0x000f0000,
1175 0x220, 0xffffffff, 0xC060000C,
1176 0x224, 0xc0000fff, 0x00000100,
1177 0xf90, 0xffffffff, 0x00000100,
1178 0xf98, 0x00000101, 0x00000000,
1179 0x20a8, 0xffffffff, 0x00000104,
1180 0x55e4, 0xff000fff, 0x00000100,
1181 0x30cc, 0xc0000fff, 0x00000104,
1182 0xc1e4, 0x00000001, 0x00000001,
1183 0xd00c, 0xff000ff0, 0x00000100,
1184 0xd80c, 0xff000ff0, 0x00000100
1187 static const u32 spectre_golden_spm_registers
[] =
1189 0x30800, 0xe0ffffff, 0xe0000000
1192 static const u32 spectre_golden_common_registers
[] =
1194 0xc770, 0xffffffff, 0x00000800,
1195 0xc774, 0xffffffff, 0x00000800,
1196 0xc798, 0xffffffff, 0x00007fbf,
1197 0xc79c, 0xffffffff, 0x00007faf
1200 static const u32 spectre_golden_registers
[] =
1202 0x3c000, 0xffff1fff, 0x96940200,
1203 0x3c00c, 0xffff0001, 0xff000000,
1204 0x3c200, 0xfffc0fff, 0x00000100,
1205 0x6ed8, 0x00010101, 0x00010000,
1206 0x9834, 0xf00fffff, 0x00000400,
1207 0x9838, 0xfffffffc, 0x00020200,
1208 0x5bb0, 0x000000f0, 0x00000070,
1209 0x5bc0, 0xf0311fff, 0x80300000,
1210 0x98f8, 0x73773777, 0x12010001,
1211 0x9b7c, 0x00ff0000, 0x00fc0000,
1212 0x2f48, 0x73773777, 0x12010001,
1213 0x8a14, 0xf000003f, 0x00000007,
1214 0x8b24, 0xffffffff, 0x00ffffff,
1215 0x28350, 0x3f3f3fff, 0x00000082,
1216 0x28354, 0x0000003f, 0x00000000,
1217 0x3e78, 0x00000001, 0x00000002,
1218 0x913c, 0xffff03df, 0x00000004,
1219 0xc768, 0x00000008, 0x00000008,
1220 0x8c00, 0x000008ff, 0x00000800,
1221 0x9508, 0x00010000, 0x00010000,
1222 0xac0c, 0xffffffff, 0x54763210,
1223 0x214f8, 0x01ff01ff, 0x00000002,
1224 0x21498, 0x007ff800, 0x00200000,
1225 0x2015c, 0xffffffff, 0x00000f40,
1226 0x30934, 0xffffffff, 0x00000001
1229 static const u32 spectre_mgcg_cgcg_init
[] =
1231 0xc420, 0xffffffff, 0xfffffffc,
1232 0x30800, 0xffffffff, 0xe0000000,
1233 0x3c2a0, 0xffffffff, 0x00000100,
1234 0x3c208, 0xffffffff, 0x00000100,
1235 0x3c2c0, 0xffffffff, 0x00000100,
1236 0x3c2c8, 0xffffffff, 0x00000100,
1237 0x3c2c4, 0xffffffff, 0x00000100,
1238 0x55e4, 0xffffffff, 0x00600100,
1239 0x3c280, 0xffffffff, 0x00000100,
1240 0x3c214, 0xffffffff, 0x06000100,
1241 0x3c220, 0xffffffff, 0x00000100,
1242 0x3c218, 0xffffffff, 0x06000100,
1243 0x3c204, 0xffffffff, 0x00000100,
1244 0x3c2e0, 0xffffffff, 0x00000100,
1245 0x3c224, 0xffffffff, 0x00000100,
1246 0x3c200, 0xffffffff, 0x00000100,
1247 0x3c230, 0xffffffff, 0x00000100,
1248 0x3c234, 0xffffffff, 0x00000100,
1249 0x3c250, 0xffffffff, 0x00000100,
1250 0x3c254, 0xffffffff, 0x00000100,
1251 0x3c258, 0xffffffff, 0x00000100,
1252 0x3c25c, 0xffffffff, 0x00000100,
1253 0x3c260, 0xffffffff, 0x00000100,
1254 0x3c27c, 0xffffffff, 0x00000100,
1255 0x3c278, 0xffffffff, 0x00000100,
1256 0x3c210, 0xffffffff, 0x06000100,
1257 0x3c290, 0xffffffff, 0x00000100,
1258 0x3c274, 0xffffffff, 0x00000100,
1259 0x3c2b4, 0xffffffff, 0x00000100,
1260 0x3c2b0, 0xffffffff, 0x00000100,
1261 0x3c270, 0xffffffff, 0x00000100,
1262 0x30800, 0xffffffff, 0xe0000000,
1263 0x3c020, 0xffffffff, 0x00010000,
1264 0x3c024, 0xffffffff, 0x00030002,
1265 0x3c028, 0xffffffff, 0x00040007,
1266 0x3c02c, 0xffffffff, 0x00060005,
1267 0x3c030, 0xffffffff, 0x00090008,
1268 0x3c034, 0xffffffff, 0x00010000,
1269 0x3c038, 0xffffffff, 0x00030002,
1270 0x3c03c, 0xffffffff, 0x00040007,
1271 0x3c040, 0xffffffff, 0x00060005,
1272 0x3c044, 0xffffffff, 0x00090008,
1273 0x3c048, 0xffffffff, 0x00010000,
1274 0x3c04c, 0xffffffff, 0x00030002,
1275 0x3c050, 0xffffffff, 0x00040007,
1276 0x3c054, 0xffffffff, 0x00060005,
1277 0x3c058, 0xffffffff, 0x00090008,
1278 0x3c05c, 0xffffffff, 0x00010000,
1279 0x3c060, 0xffffffff, 0x00030002,
1280 0x3c064, 0xffffffff, 0x00040007,
1281 0x3c068, 0xffffffff, 0x00060005,
1282 0x3c06c, 0xffffffff, 0x00090008,
1283 0x3c070, 0xffffffff, 0x00010000,
1284 0x3c074, 0xffffffff, 0x00030002,
1285 0x3c078, 0xffffffff, 0x00040007,
1286 0x3c07c, 0xffffffff, 0x00060005,
1287 0x3c080, 0xffffffff, 0x00090008,
1288 0x3c084, 0xffffffff, 0x00010000,
1289 0x3c088, 0xffffffff, 0x00030002,
1290 0x3c08c, 0xffffffff, 0x00040007,
1291 0x3c090, 0xffffffff, 0x00060005,
1292 0x3c094, 0xffffffff, 0x00090008,
1293 0x3c098, 0xffffffff, 0x00010000,
1294 0x3c09c, 0xffffffff, 0x00030002,
1295 0x3c0a0, 0xffffffff, 0x00040007,
1296 0x3c0a4, 0xffffffff, 0x00060005,
1297 0x3c0a8, 0xffffffff, 0x00090008,
1298 0x3c0ac, 0xffffffff, 0x00010000,
1299 0x3c0b0, 0xffffffff, 0x00030002,
1300 0x3c0b4, 0xffffffff, 0x00040007,
1301 0x3c0b8, 0xffffffff, 0x00060005,
1302 0x3c0bc, 0xffffffff, 0x00090008,
1303 0x3c000, 0xffffffff, 0x96e00200,
1304 0x8708, 0xffffffff, 0x00900100,
1305 0xc424, 0xffffffff, 0x0020003f,
1306 0x38, 0xffffffff, 0x0140001c,
1307 0x3c, 0x000f0000, 0x000f0000,
1308 0x220, 0xffffffff, 0xC060000C,
1309 0x224, 0xc0000fff, 0x00000100,
1310 0xf90, 0xffffffff, 0x00000100,
1311 0xf98, 0x00000101, 0x00000000,
1312 0x20a8, 0xffffffff, 0x00000104,
1313 0x55e4, 0xff000fff, 0x00000100,
1314 0x30cc, 0xc0000fff, 0x00000104,
1315 0xc1e4, 0x00000001, 0x00000001,
1316 0xd00c, 0xff000ff0, 0x00000100,
1317 0xd80c, 0xff000ff0, 0x00000100
1320 static const u32 kalindi_golden_spm_registers
[] =
1322 0x30800, 0xe0ffffff, 0xe0000000
1325 static const u32 kalindi_golden_common_registers
[] =
1327 0xc770, 0xffffffff, 0x00000800,
1328 0xc774, 0xffffffff, 0x00000800,
1329 0xc798, 0xffffffff, 0x00007fbf,
1330 0xc79c, 0xffffffff, 0x00007faf
1333 static const u32 kalindi_golden_registers
[] =
1335 0x3c000, 0xffffdfff, 0x6e944040,
1336 0x55e4, 0xff607fff, 0xfc000100,
1337 0x3c220, 0xff000fff, 0x00000100,
1338 0x3c224, 0xff000fff, 0x00000100,
1339 0x3c200, 0xfffc0fff, 0x00000100,
1340 0x6ed8, 0x00010101, 0x00010000,
1341 0x9830, 0xffffffff, 0x00000000,
1342 0x9834, 0xf00fffff, 0x00000400,
1343 0x5bb0, 0x000000f0, 0x00000070,
1344 0x5bc0, 0xf0311fff, 0x80300000,
1345 0x98f8, 0x73773777, 0x12010001,
1346 0x98fc, 0xffffffff, 0x00000010,
1347 0x9b7c, 0x00ff0000, 0x00fc0000,
1348 0x8030, 0x00001f0f, 0x0000100a,
1349 0x2f48, 0x73773777, 0x12010001,
1350 0x2408, 0x000fffff, 0x000c007f,
1351 0x8a14, 0xf000003f, 0x00000007,
1352 0x8b24, 0x3fff3fff, 0x00ffcfff,
1353 0x30a04, 0x0000ff0f, 0x00000000,
1354 0x28a4c, 0x07ffffff, 0x06000000,
1355 0x4d8, 0x00000fff, 0x00000100,
1356 0x3e78, 0x00000001, 0x00000002,
1357 0xc768, 0x00000008, 0x00000008,
1358 0x8c00, 0x000000ff, 0x00000003,
1359 0x214f8, 0x01ff01ff, 0x00000002,
1360 0x21498, 0x007ff800, 0x00200000,
1361 0x2015c, 0xffffffff, 0x00000f40,
1362 0x88c4, 0x001f3ae3, 0x00000082,
1363 0x88d4, 0x0000001f, 0x00000010,
1364 0x30934, 0xffffffff, 0x00000000
1367 static const u32 kalindi_mgcg_cgcg_init
[] =
1369 0xc420, 0xffffffff, 0xfffffffc,
1370 0x30800, 0xffffffff, 0xe0000000,
1371 0x3c2a0, 0xffffffff, 0x00000100,
1372 0x3c208, 0xffffffff, 0x00000100,
1373 0x3c2c0, 0xffffffff, 0x00000100,
1374 0x3c2c8, 0xffffffff, 0x00000100,
1375 0x3c2c4, 0xffffffff, 0x00000100,
1376 0x55e4, 0xffffffff, 0x00600100,
1377 0x3c280, 0xffffffff, 0x00000100,
1378 0x3c214, 0xffffffff, 0x06000100,
1379 0x3c220, 0xffffffff, 0x00000100,
1380 0x3c218, 0xffffffff, 0x06000100,
1381 0x3c204, 0xffffffff, 0x00000100,
1382 0x3c2e0, 0xffffffff, 0x00000100,
1383 0x3c224, 0xffffffff, 0x00000100,
1384 0x3c200, 0xffffffff, 0x00000100,
1385 0x3c230, 0xffffffff, 0x00000100,
1386 0x3c234, 0xffffffff, 0x00000100,
1387 0x3c250, 0xffffffff, 0x00000100,
1388 0x3c254, 0xffffffff, 0x00000100,
1389 0x3c258, 0xffffffff, 0x00000100,
1390 0x3c25c, 0xffffffff, 0x00000100,
1391 0x3c260, 0xffffffff, 0x00000100,
1392 0x3c27c, 0xffffffff, 0x00000100,
1393 0x3c278, 0xffffffff, 0x00000100,
1394 0x3c210, 0xffffffff, 0x06000100,
1395 0x3c290, 0xffffffff, 0x00000100,
1396 0x3c274, 0xffffffff, 0x00000100,
1397 0x3c2b4, 0xffffffff, 0x00000100,
1398 0x3c2b0, 0xffffffff, 0x00000100,
1399 0x3c270, 0xffffffff, 0x00000100,
1400 0x30800, 0xffffffff, 0xe0000000,
1401 0x3c020, 0xffffffff, 0x00010000,
1402 0x3c024, 0xffffffff, 0x00030002,
1403 0x3c028, 0xffffffff, 0x00040007,
1404 0x3c02c, 0xffffffff, 0x00060005,
1405 0x3c030, 0xffffffff, 0x00090008,
1406 0x3c034, 0xffffffff, 0x00010000,
1407 0x3c038, 0xffffffff, 0x00030002,
1408 0x3c03c, 0xffffffff, 0x00040007,
1409 0x3c040, 0xffffffff, 0x00060005,
1410 0x3c044, 0xffffffff, 0x00090008,
1411 0x3c000, 0xffffffff, 0x96e00200,
1412 0x8708, 0xffffffff, 0x00900100,
1413 0xc424, 0xffffffff, 0x0020003f,
1414 0x38, 0xffffffff, 0x0140001c,
1415 0x3c, 0x000f0000, 0x000f0000,
1416 0x220, 0xffffffff, 0xC060000C,
1417 0x224, 0xc0000fff, 0x00000100,
1418 0x20a8, 0xffffffff, 0x00000104,
1419 0x55e4, 0xff000fff, 0x00000100,
1420 0x30cc, 0xc0000fff, 0x00000104,
1421 0xc1e4, 0x00000001, 0x00000001,
1422 0xd00c, 0xff000ff0, 0x00000100,
1423 0xd80c, 0xff000ff0, 0x00000100
1426 static const u32 hawaii_golden_spm_registers
[] =
1428 0x30800, 0xe0ffffff, 0xe0000000
1431 static const u32 hawaii_golden_common_registers
[] =
1433 0x30800, 0xffffffff, 0xe0000000,
1434 0x28350, 0xffffffff, 0x3a00161a,
1435 0x28354, 0xffffffff, 0x0000002e,
1436 0x9a10, 0xffffffff, 0x00018208,
1437 0x98f8, 0xffffffff, 0x12011003
1440 static const u32 hawaii_golden_registers
[] =
1442 0x3354, 0x00000333, 0x00000333,
1443 0x9a10, 0x00010000, 0x00058208,
1444 0x9830, 0xffffffff, 0x00000000,
1445 0x9834, 0xf00fffff, 0x00000400,
1446 0x9838, 0x0002021c, 0x00020200,
1447 0xc78, 0x00000080, 0x00000000,
1448 0x5bb0, 0x000000f0, 0x00000070,
1449 0x5bc0, 0xf0311fff, 0x80300000,
1450 0x350c, 0x00810000, 0x408af000,
1451 0x7030, 0x31000111, 0x00000011,
1452 0x2f48, 0x73773777, 0x12010001,
1453 0x2120, 0x0000007f, 0x0000001b,
1454 0x21dc, 0x00007fb6, 0x00002191,
1455 0x3628, 0x0000003f, 0x0000000a,
1456 0x362c, 0x0000003f, 0x0000000a,
1457 0x2ae4, 0x00073ffe, 0x000022a2,
1458 0x240c, 0x000007ff, 0x00000000,
1459 0x8bf0, 0x00002001, 0x00000001,
1460 0x8b24, 0xffffffff, 0x00ffffff,
1461 0x30a04, 0x0000ff0f, 0x00000000,
1462 0x28a4c, 0x07ffffff, 0x06000000,
1463 0x3e78, 0x00000001, 0x00000002,
1464 0xc768, 0x00000008, 0x00000008,
1465 0xc770, 0x00000f00, 0x00000800,
1466 0xc774, 0x00000f00, 0x00000800,
1467 0xc798, 0x00ffffff, 0x00ff7fbf,
1468 0xc79c, 0x00ffffff, 0x00ff7faf,
1469 0x8c00, 0x000000ff, 0x00000800,
1470 0xe40, 0x00001fff, 0x00001fff,
1471 0x9060, 0x0000007f, 0x00000020,
1472 0x9508, 0x00010000, 0x00010000,
1473 0xae00, 0x00100000, 0x000ff07c,
1474 0xac14, 0x000003ff, 0x0000000f,
1475 0xac10, 0xffffffff, 0x7564fdec,
1476 0xac0c, 0xffffffff, 0x3120b9a8,
1477 0xac08, 0x20000000, 0x0f9c0000
1480 static const u32 hawaii_mgcg_cgcg_init
[] =
1482 0xc420, 0xffffffff, 0xfffffffd,
1483 0x30800, 0xffffffff, 0xe0000000,
1484 0x3c2a0, 0xffffffff, 0x00000100,
1485 0x3c208, 0xffffffff, 0x00000100,
1486 0x3c2c0, 0xffffffff, 0x00000100,
1487 0x3c2c8, 0xffffffff, 0x00000100,
1488 0x3c2c4, 0xffffffff, 0x00000100,
1489 0x55e4, 0xffffffff, 0x00200100,
1490 0x3c280, 0xffffffff, 0x00000100,
1491 0x3c214, 0xffffffff, 0x06000100,
1492 0x3c220, 0xffffffff, 0x00000100,
1493 0x3c218, 0xffffffff, 0x06000100,
1494 0x3c204, 0xffffffff, 0x00000100,
1495 0x3c2e0, 0xffffffff, 0x00000100,
1496 0x3c224, 0xffffffff, 0x00000100,
1497 0x3c200, 0xffffffff, 0x00000100,
1498 0x3c230, 0xffffffff, 0x00000100,
1499 0x3c234, 0xffffffff, 0x00000100,
1500 0x3c250, 0xffffffff, 0x00000100,
1501 0x3c254, 0xffffffff, 0x00000100,
1502 0x3c258, 0xffffffff, 0x00000100,
1503 0x3c25c, 0xffffffff, 0x00000100,
1504 0x3c260, 0xffffffff, 0x00000100,
1505 0x3c27c, 0xffffffff, 0x00000100,
1506 0x3c278, 0xffffffff, 0x00000100,
1507 0x3c210, 0xffffffff, 0x06000100,
1508 0x3c290, 0xffffffff, 0x00000100,
1509 0x3c274, 0xffffffff, 0x00000100,
1510 0x3c2b4, 0xffffffff, 0x00000100,
1511 0x3c2b0, 0xffffffff, 0x00000100,
1512 0x3c270, 0xffffffff, 0x00000100,
1513 0x30800, 0xffffffff, 0xe0000000,
1514 0x3c020, 0xffffffff, 0x00010000,
1515 0x3c024, 0xffffffff, 0x00030002,
1516 0x3c028, 0xffffffff, 0x00040007,
1517 0x3c02c, 0xffffffff, 0x00060005,
1518 0x3c030, 0xffffffff, 0x00090008,
1519 0x3c034, 0xffffffff, 0x00010000,
1520 0x3c038, 0xffffffff, 0x00030002,
1521 0x3c03c, 0xffffffff, 0x00040007,
1522 0x3c040, 0xffffffff, 0x00060005,
1523 0x3c044, 0xffffffff, 0x00090008,
1524 0x3c048, 0xffffffff, 0x00010000,
1525 0x3c04c, 0xffffffff, 0x00030002,
1526 0x3c050, 0xffffffff, 0x00040007,
1527 0x3c054, 0xffffffff, 0x00060005,
1528 0x3c058, 0xffffffff, 0x00090008,
1529 0x3c05c, 0xffffffff, 0x00010000,
1530 0x3c060, 0xffffffff, 0x00030002,
1531 0x3c064, 0xffffffff, 0x00040007,
1532 0x3c068, 0xffffffff, 0x00060005,
1533 0x3c06c, 0xffffffff, 0x00090008,
1534 0x3c070, 0xffffffff, 0x00010000,
1535 0x3c074, 0xffffffff, 0x00030002,
1536 0x3c078, 0xffffffff, 0x00040007,
1537 0x3c07c, 0xffffffff, 0x00060005,
1538 0x3c080, 0xffffffff, 0x00090008,
1539 0x3c084, 0xffffffff, 0x00010000,
1540 0x3c088, 0xffffffff, 0x00030002,
1541 0x3c08c, 0xffffffff, 0x00040007,
1542 0x3c090, 0xffffffff, 0x00060005,
1543 0x3c094, 0xffffffff, 0x00090008,
1544 0x3c098, 0xffffffff, 0x00010000,
1545 0x3c09c, 0xffffffff, 0x00030002,
1546 0x3c0a0, 0xffffffff, 0x00040007,
1547 0x3c0a4, 0xffffffff, 0x00060005,
1548 0x3c0a8, 0xffffffff, 0x00090008,
1549 0x3c0ac, 0xffffffff, 0x00010000,
1550 0x3c0b0, 0xffffffff, 0x00030002,
1551 0x3c0b4, 0xffffffff, 0x00040007,
1552 0x3c0b8, 0xffffffff, 0x00060005,
1553 0x3c0bc, 0xffffffff, 0x00090008,
1554 0x3c0c0, 0xffffffff, 0x00010000,
1555 0x3c0c4, 0xffffffff, 0x00030002,
1556 0x3c0c8, 0xffffffff, 0x00040007,
1557 0x3c0cc, 0xffffffff, 0x00060005,
1558 0x3c0d0, 0xffffffff, 0x00090008,
1559 0x3c0d4, 0xffffffff, 0x00010000,
1560 0x3c0d8, 0xffffffff, 0x00030002,
1561 0x3c0dc, 0xffffffff, 0x00040007,
1562 0x3c0e0, 0xffffffff, 0x00060005,
1563 0x3c0e4, 0xffffffff, 0x00090008,
1564 0x3c0e8, 0xffffffff, 0x00010000,
1565 0x3c0ec, 0xffffffff, 0x00030002,
1566 0x3c0f0, 0xffffffff, 0x00040007,
1567 0x3c0f4, 0xffffffff, 0x00060005,
1568 0x3c0f8, 0xffffffff, 0x00090008,
1569 0xc318, 0xffffffff, 0x00020200,
1570 0x3350, 0xffffffff, 0x00000200,
1571 0x15c0, 0xffffffff, 0x00000400,
1572 0x55e8, 0xffffffff, 0x00000000,
1573 0x2f50, 0xffffffff, 0x00000902,
1574 0x3c000, 0xffffffff, 0x96940200,
1575 0x8708, 0xffffffff, 0x00900100,
1576 0xc424, 0xffffffff, 0x0020003f,
1577 0x38, 0xffffffff, 0x0140001c,
1578 0x3c, 0x000f0000, 0x000f0000,
1579 0x220, 0xffffffff, 0xc060000c,
1580 0x224, 0xc0000fff, 0x00000100,
1581 0xf90, 0xffffffff, 0x00000100,
1582 0xf98, 0x00000101, 0x00000000,
1583 0x20a8, 0xffffffff, 0x00000104,
1584 0x55e4, 0xff000fff, 0x00000100,
1585 0x30cc, 0xc0000fff, 0x00000104,
1586 0xc1e4, 0x00000001, 0x00000001,
1587 0xd00c, 0xff000ff0, 0x00000100,
1588 0xd80c, 0xff000ff0, 0x00000100
1591 static const u32 godavari_golden_registers
[] =
1593 0x55e4, 0xff607fff, 0xfc000100,
1594 0x6ed8, 0x00010101, 0x00010000,
1595 0x9830, 0xffffffff, 0x00000000,
1596 0x98302, 0xf00fffff, 0x00000400,
1597 0x6130, 0xffffffff, 0x00010000,
1598 0x5bb0, 0x000000f0, 0x00000070,
1599 0x5bc0, 0xf0311fff, 0x80300000,
1600 0x98f8, 0x73773777, 0x12010001,
1601 0x98fc, 0xffffffff, 0x00000010,
1602 0x8030, 0x00001f0f, 0x0000100a,
1603 0x2f48, 0x73773777, 0x12010001,
1604 0x2408, 0x000fffff, 0x000c007f,
1605 0x8a14, 0xf000003f, 0x00000007,
1606 0x8b24, 0xffffffff, 0x00ff0fff,
1607 0x30a04, 0x0000ff0f, 0x00000000,
1608 0x28a4c, 0x07ffffff, 0x06000000,
1609 0x4d8, 0x00000fff, 0x00000100,
1610 0xd014, 0x00010000, 0x00810001,
1611 0xd814, 0x00010000, 0x00810001,
1612 0x3e78, 0x00000001, 0x00000002,
1613 0xc768, 0x00000008, 0x00000008,
1614 0xc770, 0x00000f00, 0x00000800,
1615 0xc774, 0x00000f00, 0x00000800,
1616 0xc798, 0x00ffffff, 0x00ff7fbf,
1617 0xc79c, 0x00ffffff, 0x00ff7faf,
1618 0x8c00, 0x000000ff, 0x00000001,
1619 0x214f8, 0x01ff01ff, 0x00000002,
1620 0x21498, 0x007ff800, 0x00200000,
1621 0x2015c, 0xffffffff, 0x00000f40,
1622 0x88c4, 0x001f3ae3, 0x00000082,
1623 0x88d4, 0x0000001f, 0x00000010,
1624 0x30934, 0xffffffff, 0x00000000
1628 static void cik_init_golden_registers(struct radeon_device
*rdev
)
1630 switch (rdev
->family
) {
1632 radeon_program_register_sequence(rdev
,
1633 bonaire_mgcg_cgcg_init
,
1634 (const u32
)ARRAY_SIZE(bonaire_mgcg_cgcg_init
));
1635 radeon_program_register_sequence(rdev
,
1636 bonaire_golden_registers
,
1637 (const u32
)ARRAY_SIZE(bonaire_golden_registers
));
1638 radeon_program_register_sequence(rdev
,
1639 bonaire_golden_common_registers
,
1640 (const u32
)ARRAY_SIZE(bonaire_golden_common_registers
));
1641 radeon_program_register_sequence(rdev
,
1642 bonaire_golden_spm_registers
,
1643 (const u32
)ARRAY_SIZE(bonaire_golden_spm_registers
));
1646 radeon_program_register_sequence(rdev
,
1647 kalindi_mgcg_cgcg_init
,
1648 (const u32
)ARRAY_SIZE(kalindi_mgcg_cgcg_init
));
1649 radeon_program_register_sequence(rdev
,
1650 kalindi_golden_registers
,
1651 (const u32
)ARRAY_SIZE(kalindi_golden_registers
));
1652 radeon_program_register_sequence(rdev
,
1653 kalindi_golden_common_registers
,
1654 (const u32
)ARRAY_SIZE(kalindi_golden_common_registers
));
1655 radeon_program_register_sequence(rdev
,
1656 kalindi_golden_spm_registers
,
1657 (const u32
)ARRAY_SIZE(kalindi_golden_spm_registers
));
1660 radeon_program_register_sequence(rdev
,
1661 kalindi_mgcg_cgcg_init
,
1662 (const u32
)ARRAY_SIZE(kalindi_mgcg_cgcg_init
));
1663 radeon_program_register_sequence(rdev
,
1664 godavari_golden_registers
,
1665 (const u32
)ARRAY_SIZE(godavari_golden_registers
));
1666 radeon_program_register_sequence(rdev
,
1667 kalindi_golden_common_registers
,
1668 (const u32
)ARRAY_SIZE(kalindi_golden_common_registers
));
1669 radeon_program_register_sequence(rdev
,
1670 kalindi_golden_spm_registers
,
1671 (const u32
)ARRAY_SIZE(kalindi_golden_spm_registers
));
1674 radeon_program_register_sequence(rdev
,
1675 spectre_mgcg_cgcg_init
,
1676 (const u32
)ARRAY_SIZE(spectre_mgcg_cgcg_init
));
1677 radeon_program_register_sequence(rdev
,
1678 spectre_golden_registers
,
1679 (const u32
)ARRAY_SIZE(spectre_golden_registers
));
1680 radeon_program_register_sequence(rdev
,
1681 spectre_golden_common_registers
,
1682 (const u32
)ARRAY_SIZE(spectre_golden_common_registers
));
1683 radeon_program_register_sequence(rdev
,
1684 spectre_golden_spm_registers
,
1685 (const u32
)ARRAY_SIZE(spectre_golden_spm_registers
));
1688 radeon_program_register_sequence(rdev
,
1689 hawaii_mgcg_cgcg_init
,
1690 (const u32
)ARRAY_SIZE(hawaii_mgcg_cgcg_init
));
1691 radeon_program_register_sequence(rdev
,
1692 hawaii_golden_registers
,
1693 (const u32
)ARRAY_SIZE(hawaii_golden_registers
));
1694 radeon_program_register_sequence(rdev
,
1695 hawaii_golden_common_registers
,
1696 (const u32
)ARRAY_SIZE(hawaii_golden_common_registers
));
1697 radeon_program_register_sequence(rdev
,
1698 hawaii_golden_spm_registers
,
1699 (const u32
)ARRAY_SIZE(hawaii_golden_spm_registers
));
1707 * cik_get_xclk - get the xclk
1709 * @rdev: radeon_device pointer
1711 * Returns the reference clock used by the gfx engine
1714 u32
cik_get_xclk(struct radeon_device
*rdev
)
1716 u32 reference_clock
= rdev
->clock
.spll
.reference_freq
;
1718 if (rdev
->flags
& RADEON_IS_IGP
) {
1719 if (RREG32_SMC(GENERAL_PWRMGT
) & GPU_COUNTER_CLK
)
1720 return reference_clock
/ 2;
1722 if (RREG32_SMC(CG_CLKPIN_CNTL
) & XTALIN_DIVIDE
)
1723 return reference_clock
/ 4;
1725 return reference_clock
;
1729 * cik_mm_rdoorbell - read a doorbell dword
1731 * @rdev: radeon_device pointer
1732 * @index: doorbell index
1734 * Returns the value in the doorbell aperture at the
1735 * requested doorbell index (CIK).
1737 u32
cik_mm_rdoorbell(struct radeon_device
*rdev
, u32 index
)
1739 if (index
< rdev
->doorbell
.num_doorbells
) {
1740 return readl(rdev
->doorbell
.ptr
+ index
);
1742 DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index
);
1748 * cik_mm_wdoorbell - write a doorbell dword
1750 * @rdev: radeon_device pointer
1751 * @index: doorbell index
1752 * @v: value to write
1754 * Writes @v to the doorbell aperture at the
1755 * requested doorbell index (CIK).
1757 void cik_mm_wdoorbell(struct radeon_device
*rdev
, u32 index
, u32 v
)
1759 if (index
< rdev
->doorbell
.num_doorbells
) {
1760 writel(v
, rdev
->doorbell
.ptr
+ index
);
1762 DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index
);
1766 #define BONAIRE_IO_MC_REGS_SIZE 36
1768 static const u32 bonaire_io_mc_regs
[BONAIRE_IO_MC_REGS_SIZE
][2] =
1770 {0x00000070, 0x04400000},
1771 {0x00000071, 0x80c01803},
1772 {0x00000072, 0x00004004},
1773 {0x00000073, 0x00000100},
1774 {0x00000074, 0x00ff0000},
1775 {0x00000075, 0x34000000},
1776 {0x00000076, 0x08000014},
1777 {0x00000077, 0x00cc08ec},
1778 {0x00000078, 0x00000400},
1779 {0x00000079, 0x00000000},
1780 {0x0000007a, 0x04090000},
1781 {0x0000007c, 0x00000000},
1782 {0x0000007e, 0x4408a8e8},
1783 {0x0000007f, 0x00000304},
1784 {0x00000080, 0x00000000},
1785 {0x00000082, 0x00000001},
1786 {0x00000083, 0x00000002},
1787 {0x00000084, 0xf3e4f400},
1788 {0x00000085, 0x052024e3},
1789 {0x00000087, 0x00000000},
1790 {0x00000088, 0x01000000},
1791 {0x0000008a, 0x1c0a0000},
1792 {0x0000008b, 0xff010000},
1793 {0x0000008d, 0xffffefff},
1794 {0x0000008e, 0xfff3efff},
1795 {0x0000008f, 0xfff3efbf},
1796 {0x00000092, 0xf7ffffff},
1797 {0x00000093, 0xffffff7f},
1798 {0x00000095, 0x00101101},
1799 {0x00000096, 0x00000fff},
1800 {0x00000097, 0x00116fff},
1801 {0x00000098, 0x60010000},
1802 {0x00000099, 0x10010000},
1803 {0x0000009a, 0x00006000},
1804 {0x0000009b, 0x00001000},
1805 {0x0000009f, 0x00b48000}
1808 #define HAWAII_IO_MC_REGS_SIZE 22
1810 static const u32 hawaii_io_mc_regs
[HAWAII_IO_MC_REGS_SIZE
][2] =
1812 {0x0000007d, 0x40000000},
1813 {0x0000007e, 0x40180304},
1814 {0x0000007f, 0x0000ff00},
1815 {0x00000081, 0x00000000},
1816 {0x00000083, 0x00000800},
1817 {0x00000086, 0x00000000},
1818 {0x00000087, 0x00000100},
1819 {0x00000088, 0x00020100},
1820 {0x00000089, 0x00000000},
1821 {0x0000008b, 0x00040000},
1822 {0x0000008c, 0x00000100},
1823 {0x0000008e, 0xff010000},
1824 {0x00000090, 0xffffefff},
1825 {0x00000091, 0xfff3efff},
1826 {0x00000092, 0xfff3efbf},
1827 {0x00000093, 0xf7ffffff},
1828 {0x00000094, 0xffffff7f},
1829 {0x00000095, 0x00000fff},
1830 {0x00000096, 0x00116fff},
1831 {0x00000097, 0x60010000},
1832 {0x00000098, 0x10010000},
1833 {0x0000009f, 0x00c79000}
1838 * cik_srbm_select - select specific register instances
1840 * @rdev: radeon_device pointer
1841 * @me: selected ME (micro engine)
1846 * Switches the currently active registers instances. Some
1847 * registers are instanced per VMID, others are instanced per
1848 * me/pipe/queue combination.
1850 static void cik_srbm_select(struct radeon_device
*rdev
,
1851 u32 me
, u32 pipe
, u32 queue
, u32 vmid
)
1853 u32 srbm_gfx_cntl
= (PIPEID(pipe
& 0x3) |
1856 QUEUEID(queue
& 0x7));
1857 WREG32(SRBM_GFX_CNTL
, srbm_gfx_cntl
);
1862 * ci_mc_load_microcode - load MC ucode into the hw
1864 * @rdev: radeon_device pointer
1866 * Load the GDDR MC ucode into the hw (CIK).
1867 * Returns 0 on success, error on failure.
1869 int ci_mc_load_microcode(struct radeon_device
*rdev
)
1871 const __be32
*fw_data
= NULL
;
1872 const __le32
*new_fw_data
= NULL
;
1874 u32
*io_mc_regs
= NULL
;
1875 const __le32
*new_io_mc_regs
= NULL
;
1876 int i
, regs_size
, ucode_size
;
1882 const struct mc_firmware_header_v1_0
*hdr
=
1883 (const struct mc_firmware_header_v1_0
*)rdev
->mc_fw
->data
;
1885 radeon_ucode_print_mc_hdr(&hdr
->header
);
1887 regs_size
= le32_to_cpu(hdr
->io_debug_size_bytes
) / (4 * 2);
1888 new_io_mc_regs
= (const __le32
*)
1889 (rdev
->mc_fw
->data
+ le32_to_cpu(hdr
->io_debug_array_offset_bytes
));
1890 ucode_size
= le32_to_cpu(hdr
->header
.ucode_size_bytes
) / 4;
1891 new_fw_data
= (const __le32
*)
1892 (rdev
->mc_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
1894 ucode_size
= rdev
->mc_fw
->size
/ 4;
1896 switch (rdev
->family
) {
1898 io_mc_regs
= (u32
*)&bonaire_io_mc_regs
;
1899 regs_size
= BONAIRE_IO_MC_REGS_SIZE
;
1902 io_mc_regs
= (u32
*)&hawaii_io_mc_regs
;
1903 regs_size
= HAWAII_IO_MC_REGS_SIZE
;
1908 fw_data
= (const __be32
*)rdev
->mc_fw
->data
;
1911 running
= RREG32(MC_SEQ_SUP_CNTL
) & RUN_MASK
;
1914 /* reset the engine and set to writable */
1915 WREG32(MC_SEQ_SUP_CNTL
, 0x00000008);
1916 WREG32(MC_SEQ_SUP_CNTL
, 0x00000010);
1918 /* load mc io regs */
1919 for (i
= 0; i
< regs_size
; i
++) {
1921 WREG32(MC_SEQ_IO_DEBUG_INDEX
, le32_to_cpup(new_io_mc_regs
++));
1922 WREG32(MC_SEQ_IO_DEBUG_DATA
, le32_to_cpup(new_io_mc_regs
++));
1924 WREG32(MC_SEQ_IO_DEBUG_INDEX
, io_mc_regs
[(i
<< 1)]);
1925 WREG32(MC_SEQ_IO_DEBUG_DATA
, io_mc_regs
[(i
<< 1) + 1]);
1929 tmp
= RREG32(MC_SEQ_MISC0
);
1930 if ((rdev
->pdev
->device
== 0x6649) && ((tmp
& 0xff00) == 0x5600)) {
1931 WREG32(MC_SEQ_IO_DEBUG_INDEX
, 5);
1932 WREG32(MC_SEQ_IO_DEBUG_DATA
, 0x00000023);
1933 WREG32(MC_SEQ_IO_DEBUG_INDEX
, 9);
1934 WREG32(MC_SEQ_IO_DEBUG_DATA
, 0x000001f0);
1937 /* load the MC ucode */
1938 for (i
= 0; i
< ucode_size
; i
++) {
1940 WREG32(MC_SEQ_SUP_PGM
, le32_to_cpup(new_fw_data
++));
1942 WREG32(MC_SEQ_SUP_PGM
, be32_to_cpup(fw_data
++));
1945 /* put the engine back into the active state */
1946 WREG32(MC_SEQ_SUP_CNTL
, 0x00000008);
1947 WREG32(MC_SEQ_SUP_CNTL
, 0x00000004);
1948 WREG32(MC_SEQ_SUP_CNTL
, 0x00000001);
1950 /* wait for training to complete */
1951 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1952 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL
) & TRAIN_DONE_D0
)
1956 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1957 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL
) & TRAIN_DONE_D1
)
1967 * cik_init_microcode - load ucode images from disk
1969 * @rdev: radeon_device pointer
1971 * Use the firmware interface to load the ucode images into
1972 * the driver (not loaded into hw).
1973 * Returns 0 on success, error on failure.
1975 static int cik_init_microcode(struct radeon_device
*rdev
)
1977 const char *chip_name
;
1978 const char *new_chip_name
;
1979 size_t pfp_req_size
, me_req_size
, ce_req_size
,
1980 mec_req_size
, rlc_req_size
, mc_req_size
= 0,
1981 sdma_req_size
, smc_req_size
= 0, mc2_req_size
= 0;
1986 bool new_smc
= false;
1990 switch (rdev
->family
) {
1992 chip_name
= "BONAIRE";
1993 if ((rdev
->pdev
->revision
== 0x80) ||
1994 (rdev
->pdev
->revision
== 0x81) ||
1995 (rdev
->pdev
->device
== 0x665f))
1997 new_chip_name
= "bonaire";
1998 pfp_req_size
= CIK_PFP_UCODE_SIZE
* 4;
1999 me_req_size
= CIK_ME_UCODE_SIZE
* 4;
2000 ce_req_size
= CIK_CE_UCODE_SIZE
* 4;
2001 mec_req_size
= CIK_MEC_UCODE_SIZE
* 4;
2002 rlc_req_size
= BONAIRE_RLC_UCODE_SIZE
* 4;
2003 mc_req_size
= BONAIRE_MC_UCODE_SIZE
* 4;
2004 mc2_req_size
= BONAIRE_MC2_UCODE_SIZE
* 4;
2005 sdma_req_size
= CIK_SDMA_UCODE_SIZE
* 4;
2006 smc_req_size
= ALIGN(BONAIRE_SMC_UCODE_SIZE
, 4);
2010 chip_name
= "HAWAII";
2011 if (rdev
->pdev
->revision
== 0x80)
2013 new_chip_name
= "hawaii";
2014 pfp_req_size
= CIK_PFP_UCODE_SIZE
* 4;
2015 me_req_size
= CIK_ME_UCODE_SIZE
* 4;
2016 ce_req_size
= CIK_CE_UCODE_SIZE
* 4;
2017 mec_req_size
= CIK_MEC_UCODE_SIZE
* 4;
2018 rlc_req_size
= BONAIRE_RLC_UCODE_SIZE
* 4;
2019 mc_req_size
= HAWAII_MC_UCODE_SIZE
* 4;
2020 mc2_req_size
= HAWAII_MC2_UCODE_SIZE
* 4;
2021 sdma_req_size
= CIK_SDMA_UCODE_SIZE
* 4;
2022 smc_req_size
= ALIGN(HAWAII_SMC_UCODE_SIZE
, 4);
2026 chip_name
= "KAVERI";
2027 new_chip_name
= "kaveri";
2028 pfp_req_size
= CIK_PFP_UCODE_SIZE
* 4;
2029 me_req_size
= CIK_ME_UCODE_SIZE
* 4;
2030 ce_req_size
= CIK_CE_UCODE_SIZE
* 4;
2031 mec_req_size
= CIK_MEC_UCODE_SIZE
* 4;
2032 rlc_req_size
= KV_RLC_UCODE_SIZE
* 4;
2033 sdma_req_size
= CIK_SDMA_UCODE_SIZE
* 4;
2037 chip_name
= "KABINI";
2038 new_chip_name
= "kabini";
2039 pfp_req_size
= CIK_PFP_UCODE_SIZE
* 4;
2040 me_req_size
= CIK_ME_UCODE_SIZE
* 4;
2041 ce_req_size
= CIK_CE_UCODE_SIZE
* 4;
2042 mec_req_size
= CIK_MEC_UCODE_SIZE
* 4;
2043 rlc_req_size
= KB_RLC_UCODE_SIZE
* 4;
2044 sdma_req_size
= CIK_SDMA_UCODE_SIZE
* 4;
2048 chip_name
= "MULLINS";
2049 new_chip_name
= "mullins";
2050 pfp_req_size
= CIK_PFP_UCODE_SIZE
* 4;
2051 me_req_size
= CIK_ME_UCODE_SIZE
* 4;
2052 ce_req_size
= CIK_CE_UCODE_SIZE
* 4;
2053 mec_req_size
= CIK_MEC_UCODE_SIZE
* 4;
2054 rlc_req_size
= ML_RLC_UCODE_SIZE
* 4;
2055 sdma_req_size
= CIK_SDMA_UCODE_SIZE
* 4;
2061 DRM_INFO("Loading %s Microcode\n", new_chip_name
);
2063 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_pfp.bin", new_chip_name
);
2064 err
= request_firmware(&rdev
->pfp_fw
, fw_name
, rdev
->dev
);
2066 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_pfp.bin", chip_name
);
2067 err
= request_firmware(&rdev
->pfp_fw
, fw_name
, rdev
->dev
);
2070 if (rdev
->pfp_fw
->size
!= pfp_req_size
) {
2071 pr_err("cik_cp: Bogus length %zu in firmware \"%s\"\n",
2072 rdev
->pfp_fw
->size
, fw_name
);
2077 err
= radeon_ucode_validate(rdev
->pfp_fw
);
2079 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2087 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_me.bin", new_chip_name
);
2088 err
= request_firmware(&rdev
->me_fw
, fw_name
, rdev
->dev
);
2090 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_me.bin", chip_name
);
2091 err
= request_firmware(&rdev
->me_fw
, fw_name
, rdev
->dev
);
2094 if (rdev
->me_fw
->size
!= me_req_size
) {
2095 pr_err("cik_cp: Bogus length %zu in firmware \"%s\"\n",
2096 rdev
->me_fw
->size
, fw_name
);
2100 err
= radeon_ucode_validate(rdev
->me_fw
);
2102 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2110 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_ce.bin", new_chip_name
);
2111 err
= request_firmware(&rdev
->ce_fw
, fw_name
, rdev
->dev
);
2113 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_ce.bin", chip_name
);
2114 err
= request_firmware(&rdev
->ce_fw
, fw_name
, rdev
->dev
);
2117 if (rdev
->ce_fw
->size
!= ce_req_size
) {
2118 pr_err("cik_cp: Bogus length %zu in firmware \"%s\"\n",
2119 rdev
->ce_fw
->size
, fw_name
);
2123 err
= radeon_ucode_validate(rdev
->ce_fw
);
2125 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2133 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mec.bin", new_chip_name
);
2134 err
= request_firmware(&rdev
->mec_fw
, fw_name
, rdev
->dev
);
2136 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mec.bin", chip_name
);
2137 err
= request_firmware(&rdev
->mec_fw
, fw_name
, rdev
->dev
);
2140 if (rdev
->mec_fw
->size
!= mec_req_size
) {
2141 pr_err("cik_cp: Bogus length %zu in firmware \"%s\"\n",
2142 rdev
->mec_fw
->size
, fw_name
);
2146 err
= radeon_ucode_validate(rdev
->mec_fw
);
2148 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2156 if (rdev
->family
== CHIP_KAVERI
) {
2157 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mec2.bin", new_chip_name
);
2158 err
= request_firmware(&rdev
->mec2_fw
, fw_name
, rdev
->dev
);
2162 err
= radeon_ucode_validate(rdev
->mec2_fw
);
2171 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_rlc.bin", new_chip_name
);
2172 err
= request_firmware(&rdev
->rlc_fw
, fw_name
, rdev
->dev
);
2174 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_rlc.bin", chip_name
);
2175 err
= request_firmware(&rdev
->rlc_fw
, fw_name
, rdev
->dev
);
2178 if (rdev
->rlc_fw
->size
!= rlc_req_size
) {
2179 pr_err("cik_rlc: Bogus length %zu in firmware \"%s\"\n",
2180 rdev
->rlc_fw
->size
, fw_name
);
2184 err
= radeon_ucode_validate(rdev
->rlc_fw
);
2186 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2194 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_sdma.bin", new_chip_name
);
2195 err
= request_firmware(&rdev
->sdma_fw
, fw_name
, rdev
->dev
);
2197 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_sdma.bin", chip_name
);
2198 err
= request_firmware(&rdev
->sdma_fw
, fw_name
, rdev
->dev
);
2201 if (rdev
->sdma_fw
->size
!= sdma_req_size
) {
2202 pr_err("cik_sdma: Bogus length %zu in firmware \"%s\"\n",
2203 rdev
->sdma_fw
->size
, fw_name
);
2207 err
= radeon_ucode_validate(rdev
->sdma_fw
);
2209 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2217 /* No SMC, MC ucode on APUs */
2218 if (!(rdev
->flags
& RADEON_IS_IGP
)) {
2219 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mc.bin", new_chip_name
);
2220 err
= request_firmware(&rdev
->mc_fw
, fw_name
, rdev
->dev
);
2222 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mc2.bin", chip_name
);
2223 err
= request_firmware(&rdev
->mc_fw
, fw_name
, rdev
->dev
);
2225 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_mc.bin", chip_name
);
2226 err
= request_firmware(&rdev
->mc_fw
, fw_name
, rdev
->dev
);
2230 if ((rdev
->mc_fw
->size
!= mc_req_size
) &&
2231 (rdev
->mc_fw
->size
!= mc2_req_size
)){
2232 pr_err("cik_mc: Bogus length %zu in firmware \"%s\"\n",
2233 rdev
->mc_fw
->size
, fw_name
);
2236 DRM_INFO("%s: %zu bytes\n", fw_name
, rdev
->mc_fw
->size
);
2238 err
= radeon_ucode_validate(rdev
->mc_fw
);
2240 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2249 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_k_smc.bin", new_chip_name
);
2251 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_smc.bin", new_chip_name
);
2252 err
= request_firmware(&rdev
->smc_fw
, fw_name
, rdev
->dev
);
2254 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_smc.bin", chip_name
);
2255 err
= request_firmware(&rdev
->smc_fw
, fw_name
, rdev
->dev
);
2257 pr_err("smc: error loading firmware \"%s\"\n",
2259 release_firmware(rdev
->smc_fw
);
2260 rdev
->smc_fw
= NULL
;
2262 } else if (rdev
->smc_fw
->size
!= smc_req_size
) {
2263 pr_err("cik_smc: Bogus length %zu in firmware \"%s\"\n",
2264 rdev
->smc_fw
->size
, fw_name
);
2268 err
= radeon_ucode_validate(rdev
->smc_fw
);
2270 pr_err("cik_fw: validation failed for firmware \"%s\"\n",
2280 rdev
->new_fw
= false;
2281 } else if (new_fw
< num_fw
) {
2282 pr_err("ci_fw: mixing new and old firmware!\n");
2285 rdev
->new_fw
= true;
2291 pr_err("cik_cp: Failed to load firmware \"%s\"\n",
2293 release_firmware(rdev
->pfp_fw
);
2294 rdev
->pfp_fw
= NULL
;
2295 release_firmware(rdev
->me_fw
);
2297 release_firmware(rdev
->ce_fw
);
2299 release_firmware(rdev
->mec_fw
);
2300 rdev
->mec_fw
= NULL
;
2301 release_firmware(rdev
->mec2_fw
);
2302 rdev
->mec2_fw
= NULL
;
2303 release_firmware(rdev
->rlc_fw
);
2304 rdev
->rlc_fw
= NULL
;
2305 release_firmware(rdev
->sdma_fw
);
2306 rdev
->sdma_fw
= NULL
;
2307 release_firmware(rdev
->mc_fw
);
2309 release_firmware(rdev
->smc_fw
);
2310 rdev
->smc_fw
= NULL
;
2319 * cik_tiling_mode_table_init - init the hw tiling table
2321 * @rdev: radeon_device pointer
2323 * Starting with SI, the tiling setup is done globally in a
2324 * set of 32 tiling modes. Rather than selecting each set of
2325 * parameters per surface as on older asics, we just select
2326 * which index in the tiling table we want to use, and the
2327 * surface uses those parameters (CIK).
2329 static void cik_tiling_mode_table_init(struct radeon_device
*rdev
)
2331 u32
*tile
= rdev
->config
.cik
.tile_mode_array
;
2332 u32
*macrotile
= rdev
->config
.cik
.macrotile_mode_array
;
2333 const u32 num_tile_mode_states
=
2334 ARRAY_SIZE(rdev
->config
.cik
.tile_mode_array
);
2335 const u32 num_secondary_tile_mode_states
=
2336 ARRAY_SIZE(rdev
->config
.cik
.macrotile_mode_array
);
2337 u32 reg_offset
, split_equal_to_row_size
;
2338 u32 num_pipe_configs
;
2339 u32 num_rbs
= rdev
->config
.cik
.max_backends_per_se
*
2340 rdev
->config
.cik
.max_shader_engines
;
2342 switch (rdev
->config
.cik
.mem_row_size_in_kb
) {
2344 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_1KB
;
2348 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_2KB
;
2351 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_4KB
;
2355 num_pipe_configs
= rdev
->config
.cik
.max_tile_pipes
;
2356 if (num_pipe_configs
> 8)
2357 num_pipe_configs
= 16;
2359 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++)
2360 tile
[reg_offset
] = 0;
2361 for (reg_offset
= 0; reg_offset
< num_secondary_tile_mode_states
; reg_offset
++)
2362 macrotile
[reg_offset
] = 0;
2364 switch(num_pipe_configs
) {
2366 tile
[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2367 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2368 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2369 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
));
2370 tile
[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2371 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2372 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2373 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
));
2374 tile
[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2375 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2376 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2377 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2378 tile
[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2379 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2380 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2381 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
));
2382 tile
[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2383 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2384 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2385 TILE_SPLIT(split_equal_to_row_size
));
2386 tile
[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2387 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2388 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
));
2389 tile
[6] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2390 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2391 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2392 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2393 tile
[7] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2394 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2395 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2396 TILE_SPLIT(split_equal_to_row_size
));
2397 tile
[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
) |
2398 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
));
2399 tile
[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2400 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2401 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
));
2402 tile
[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2403 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2404 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2405 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2406 tile
[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2407 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2408 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16
) |
2409 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2410 tile
[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2411 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2412 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2413 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2414 tile
[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2415 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2416 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
));
2417 tile
[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2418 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2419 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2420 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2421 tile
[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2422 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2423 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16
) |
2424 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2425 tile
[17] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2426 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2427 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2428 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2429 tile
[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2430 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2431 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
));
2432 tile
[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2433 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2434 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2435 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2436 tile
[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2437 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2438 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16
) |
2439 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2440 tile
[30] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2441 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2442 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16
) |
2443 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2445 macrotile
[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2446 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2447 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2448 NUM_BANKS(ADDR_SURF_16_BANK
));
2449 macrotile
[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2450 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2451 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2452 NUM_BANKS(ADDR_SURF_16_BANK
));
2453 macrotile
[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2454 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2455 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2456 NUM_BANKS(ADDR_SURF_16_BANK
));
2457 macrotile
[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2458 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2459 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2460 NUM_BANKS(ADDR_SURF_16_BANK
));
2461 macrotile
[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2462 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2463 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2464 NUM_BANKS(ADDR_SURF_8_BANK
));
2465 macrotile
[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2466 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2467 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2468 NUM_BANKS(ADDR_SURF_4_BANK
));
2469 macrotile
[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2470 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2471 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2472 NUM_BANKS(ADDR_SURF_2_BANK
));
2473 macrotile
[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2474 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2475 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2476 NUM_BANKS(ADDR_SURF_16_BANK
));
2477 macrotile
[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2478 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2479 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2480 NUM_BANKS(ADDR_SURF_16_BANK
));
2481 macrotile
[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2482 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2483 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2484 NUM_BANKS(ADDR_SURF_16_BANK
));
2485 macrotile
[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2486 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2487 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2488 NUM_BANKS(ADDR_SURF_8_BANK
));
2489 macrotile
[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2490 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2491 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2492 NUM_BANKS(ADDR_SURF_4_BANK
));
2493 macrotile
[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2494 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2495 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2496 NUM_BANKS(ADDR_SURF_2_BANK
));
2497 macrotile
[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2498 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2499 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2500 NUM_BANKS(ADDR_SURF_2_BANK
));
2502 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++)
2503 WREG32(GB_TILE_MODE0
+ (reg_offset
* 4), tile
[reg_offset
]);
2504 for (reg_offset
= 0; reg_offset
< num_secondary_tile_mode_states
; reg_offset
++)
2505 WREG32(GB_MACROTILE_MODE0
+ (reg_offset
* 4), macrotile
[reg_offset
]);
2509 tile
[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2510 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2511 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2512 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
));
2513 tile
[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2514 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2515 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2516 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
));
2517 tile
[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2518 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2519 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2520 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2521 tile
[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2522 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2523 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2524 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
));
2525 tile
[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2526 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2527 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2528 TILE_SPLIT(split_equal_to_row_size
));
2529 tile
[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2530 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2531 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
));
2532 tile
[6] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2533 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2534 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2535 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2536 tile
[7] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2537 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2538 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2539 TILE_SPLIT(split_equal_to_row_size
));
2540 tile
[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
) |
2541 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
));
2542 tile
[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2543 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2544 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
));
2545 tile
[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2546 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2547 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2548 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2549 tile
[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2550 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2551 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
2552 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2553 tile
[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2554 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2555 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2556 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2557 tile
[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2558 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2559 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
));
2560 tile
[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2561 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2562 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2563 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2564 tile
[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2565 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2566 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
2567 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2568 tile
[17] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2569 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2570 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2571 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2572 tile
[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2573 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2574 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
));
2575 tile
[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2576 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2577 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2578 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2579 tile
[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2580 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2581 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
2582 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2583 tile
[30] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2584 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2585 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16
) |
2586 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2588 macrotile
[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2589 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2590 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2591 NUM_BANKS(ADDR_SURF_16_BANK
));
2592 macrotile
[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2593 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2594 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2595 NUM_BANKS(ADDR_SURF_16_BANK
));
2596 macrotile
[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2597 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2598 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2599 NUM_BANKS(ADDR_SURF_16_BANK
));
2600 macrotile
[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2601 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2602 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2603 NUM_BANKS(ADDR_SURF_16_BANK
));
2604 macrotile
[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2605 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2606 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2607 NUM_BANKS(ADDR_SURF_8_BANK
));
2608 macrotile
[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2609 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2610 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2611 NUM_BANKS(ADDR_SURF_4_BANK
));
2612 macrotile
[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2613 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2614 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2615 NUM_BANKS(ADDR_SURF_2_BANK
));
2616 macrotile
[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2617 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
2618 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2619 NUM_BANKS(ADDR_SURF_16_BANK
));
2620 macrotile
[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2621 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2622 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2623 NUM_BANKS(ADDR_SURF_16_BANK
));
2624 macrotile
[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2625 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2626 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2627 NUM_BANKS(ADDR_SURF_16_BANK
));
2628 macrotile
[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2629 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2630 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2631 NUM_BANKS(ADDR_SURF_16_BANK
));
2632 macrotile
[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2633 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2634 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2635 NUM_BANKS(ADDR_SURF_8_BANK
));
2636 macrotile
[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2637 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2638 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2639 NUM_BANKS(ADDR_SURF_4_BANK
));
2640 macrotile
[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2641 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2642 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2643 NUM_BANKS(ADDR_SURF_2_BANK
));
2645 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++)
2646 WREG32(GB_TILE_MODE0
+ (reg_offset
* 4), tile
[reg_offset
]);
2647 for (reg_offset
= 0; reg_offset
< num_secondary_tile_mode_states
; reg_offset
++)
2648 WREG32(GB_MACROTILE_MODE0
+ (reg_offset
* 4), macrotile
[reg_offset
]);
2653 tile
[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2654 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2655 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2656 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
));
2657 tile
[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2658 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2659 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2660 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
));
2661 tile
[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2662 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2663 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2664 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2665 tile
[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2666 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2667 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2668 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
));
2669 tile
[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2670 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2671 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2672 TILE_SPLIT(split_equal_to_row_size
));
2673 tile
[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2674 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2675 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
));
2676 tile
[6] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2677 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2678 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2679 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2680 tile
[7] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2681 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2682 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2683 TILE_SPLIT(split_equal_to_row_size
));
2684 tile
[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
) |
2685 PIPE_CONFIG(ADDR_SURF_P4_16x16
));
2686 tile
[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2687 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2688 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
));
2689 tile
[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2690 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2691 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2692 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2693 tile
[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2694 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2695 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2696 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2697 tile
[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2698 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2699 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2700 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2701 tile
[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2702 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2703 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
));
2704 tile
[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2705 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2706 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2707 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2708 tile
[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2709 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2710 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2711 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2712 tile
[17] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2713 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2714 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2715 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2716 tile
[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2717 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2718 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
));
2719 tile
[28] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2720 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2721 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2722 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2723 tile
[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2724 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2725 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2726 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2727 tile
[30] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2728 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2729 PIPE_CONFIG(ADDR_SURF_P4_16x16
) |
2730 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2732 } else if (num_rbs
< 4) {
2733 tile
[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2734 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2735 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2736 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
));
2737 tile
[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2738 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2739 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2740 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
));
2741 tile
[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2742 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2743 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2744 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2745 tile
[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2746 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2747 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2748 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
));
2749 tile
[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2750 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2751 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2752 TILE_SPLIT(split_equal_to_row_size
));
2753 tile
[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2754 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2755 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
));
2756 tile
[6] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2757 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2758 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2759 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2760 tile
[7] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2761 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2762 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2763 TILE_SPLIT(split_equal_to_row_size
));
2764 tile
[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
) |
2765 PIPE_CONFIG(ADDR_SURF_P4_8x16
));
2766 tile
[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2767 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2768 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
));
2769 tile
[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2770 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2771 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2772 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2773 tile
[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2774 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2775 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2776 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2777 tile
[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2778 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2779 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2780 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2781 tile
[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2782 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2783 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
));
2784 tile
[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2785 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2786 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2787 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2788 tile
[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2789 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2790 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2791 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2792 tile
[17] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2793 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2794 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2795 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2796 tile
[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2797 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2798 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
));
2799 tile
[28] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2800 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2801 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2802 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2803 tile
[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2804 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2805 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2806 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2807 tile
[30] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2808 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2809 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
2810 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2813 macrotile
[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2814 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2815 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2816 NUM_BANKS(ADDR_SURF_16_BANK
));
2817 macrotile
[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2818 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2819 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2820 NUM_BANKS(ADDR_SURF_16_BANK
));
2821 macrotile
[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2822 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2823 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2824 NUM_BANKS(ADDR_SURF_16_BANK
));
2825 macrotile
[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2826 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2827 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2828 NUM_BANKS(ADDR_SURF_16_BANK
));
2829 macrotile
[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2830 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2831 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2832 NUM_BANKS(ADDR_SURF_16_BANK
));
2833 macrotile
[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2834 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2835 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2836 NUM_BANKS(ADDR_SURF_8_BANK
));
2837 macrotile
[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2838 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2839 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2840 NUM_BANKS(ADDR_SURF_4_BANK
));
2841 macrotile
[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2842 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
2843 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2844 NUM_BANKS(ADDR_SURF_16_BANK
));
2845 macrotile
[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2846 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2847 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2848 NUM_BANKS(ADDR_SURF_16_BANK
));
2849 macrotile
[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2850 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2851 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2852 NUM_BANKS(ADDR_SURF_16_BANK
));
2853 macrotile
[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2854 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2855 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2856 NUM_BANKS(ADDR_SURF_16_BANK
));
2857 macrotile
[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2858 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2859 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2860 NUM_BANKS(ADDR_SURF_16_BANK
));
2861 macrotile
[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2862 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2863 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2864 NUM_BANKS(ADDR_SURF_8_BANK
));
2865 macrotile
[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2866 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2867 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
2868 NUM_BANKS(ADDR_SURF_4_BANK
));
2870 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++)
2871 WREG32(GB_TILE_MODE0
+ (reg_offset
* 4), tile
[reg_offset
]);
2872 for (reg_offset
= 0; reg_offset
< num_secondary_tile_mode_states
; reg_offset
++)
2873 WREG32(GB_MACROTILE_MODE0
+ (reg_offset
* 4), macrotile
[reg_offset
]);
2877 tile
[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2878 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2879 PIPE_CONFIG(ADDR_SURF_P2
) |
2880 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
));
2881 tile
[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2882 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2883 PIPE_CONFIG(ADDR_SURF_P2
) |
2884 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
));
2885 tile
[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2886 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2887 PIPE_CONFIG(ADDR_SURF_P2
) |
2888 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2889 tile
[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2890 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2891 PIPE_CONFIG(ADDR_SURF_P2
) |
2892 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
));
2893 tile
[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2894 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2895 PIPE_CONFIG(ADDR_SURF_P2
) |
2896 TILE_SPLIT(split_equal_to_row_size
));
2897 tile
[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2898 PIPE_CONFIG(ADDR_SURF_P2
) |
2899 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
));
2900 tile
[6] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2901 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2902 PIPE_CONFIG(ADDR_SURF_P2
) |
2903 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
));
2904 tile
[7] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2905 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING
) |
2906 PIPE_CONFIG(ADDR_SURF_P2
) |
2907 TILE_SPLIT(split_equal_to_row_size
));
2908 tile
[8] = ARRAY_MODE(ARRAY_LINEAR_ALIGNED
) |
2909 PIPE_CONFIG(ADDR_SURF_P2
);
2910 tile
[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2911 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2912 PIPE_CONFIG(ADDR_SURF_P2
));
2913 tile
[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2914 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2915 PIPE_CONFIG(ADDR_SURF_P2
) |
2916 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2917 tile
[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2918 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2919 PIPE_CONFIG(ADDR_SURF_P2
) |
2920 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2921 tile
[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2922 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING
) |
2923 PIPE_CONFIG(ADDR_SURF_P2
) |
2924 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2925 tile
[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2926 PIPE_CONFIG(ADDR_SURF_P2
) |
2927 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
));
2928 tile
[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
2929 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2930 PIPE_CONFIG(ADDR_SURF_P2
) |
2931 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2932 tile
[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2933 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2934 PIPE_CONFIG(ADDR_SURF_P2
) |
2935 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2936 tile
[17] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2937 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING
) |
2938 PIPE_CONFIG(ADDR_SURF_P2
) |
2939 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2940 tile
[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
2941 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2942 PIPE_CONFIG(ADDR_SURF_P2
));
2943 tile
[28] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2944 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2945 PIPE_CONFIG(ADDR_SURF_P2
) |
2946 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2947 tile
[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1
) |
2948 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2949 PIPE_CONFIG(ADDR_SURF_P2
) |
2950 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2951 tile
[30] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1
) |
2952 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING
) |
2953 PIPE_CONFIG(ADDR_SURF_P2
) |
2954 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2
));
2956 macrotile
[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2957 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2958 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2959 NUM_BANKS(ADDR_SURF_16_BANK
));
2960 macrotile
[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2961 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2962 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2963 NUM_BANKS(ADDR_SURF_16_BANK
));
2964 macrotile
[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2965 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2966 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2967 NUM_BANKS(ADDR_SURF_16_BANK
));
2968 macrotile
[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2969 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2970 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2971 NUM_BANKS(ADDR_SURF_16_BANK
));
2972 macrotile
[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2973 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2974 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2975 NUM_BANKS(ADDR_SURF_16_BANK
));
2976 macrotile
[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2977 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2978 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2979 NUM_BANKS(ADDR_SURF_16_BANK
));
2980 macrotile
[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
2981 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
2982 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
2983 NUM_BANKS(ADDR_SURF_8_BANK
));
2984 macrotile
[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4
) |
2985 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
2986 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2987 NUM_BANKS(ADDR_SURF_16_BANK
));
2988 macrotile
[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4
) |
2989 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2990 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2991 NUM_BANKS(ADDR_SURF_16_BANK
));
2992 macrotile
[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2993 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
2994 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2995 NUM_BANKS(ADDR_SURF_16_BANK
));
2996 macrotile
[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
2997 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
2998 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
2999 NUM_BANKS(ADDR_SURF_16_BANK
));
3000 macrotile
[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
3001 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
3002 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
3003 NUM_BANKS(ADDR_SURF_16_BANK
));
3004 macrotile
[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
3005 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
3006 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
3007 NUM_BANKS(ADDR_SURF_16_BANK
));
3008 macrotile
[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
3009 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
3010 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
3011 NUM_BANKS(ADDR_SURF_8_BANK
));
3013 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++)
3014 WREG32(GB_TILE_MODE0
+ (reg_offset
* 4), tile
[reg_offset
]);
3015 for (reg_offset
= 0; reg_offset
< num_secondary_tile_mode_states
; reg_offset
++)
3016 WREG32(GB_MACROTILE_MODE0
+ (reg_offset
* 4), macrotile
[reg_offset
]);
3020 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs
);
3025 * cik_select_se_sh - select which SE, SH to address
3027 * @rdev: radeon_device pointer
3028 * @se_num: shader engine to address
3029 * @sh_num: sh block to address
3031 * Select which SE, SH combinations to address. Certain
3032 * registers are instanced per SE or SH. 0xffffffff means
3033 * broadcast to all SEs or SHs (CIK).
3035 static void cik_select_se_sh(struct radeon_device
*rdev
,
3036 u32 se_num
, u32 sh_num
)
3038 u32 data
= INSTANCE_BROADCAST_WRITES
;
3040 if ((se_num
== 0xffffffff) && (sh_num
== 0xffffffff))
3041 data
|= SH_BROADCAST_WRITES
| SE_BROADCAST_WRITES
;
3042 else if (se_num
== 0xffffffff)
3043 data
|= SE_BROADCAST_WRITES
| SH_INDEX(sh_num
);
3044 else if (sh_num
== 0xffffffff)
3045 data
|= SH_BROADCAST_WRITES
| SE_INDEX(se_num
);
3047 data
|= SH_INDEX(sh_num
) | SE_INDEX(se_num
);
3048 WREG32(GRBM_GFX_INDEX
, data
);
3052 * cik_create_bitmask - create a bitmask
3054 * @bit_width: length of the mask
3056 * create a variable length bit mask (CIK).
3057 * Returns the bitmask.
3059 static u32
cik_create_bitmask(u32 bit_width
)
3063 for (i
= 0; i
< bit_width
; i
++) {
3071 * cik_get_rb_disabled - computes the mask of disabled RBs
3073 * @rdev: radeon_device pointer
3074 * @max_rb_num: max RBs (render backends) for the asic
3075 * @se_num: number of SEs (shader engines) for the asic
3076 * @sh_per_se: number of SH blocks per SE for the asic
3078 * Calculates the bitmask of disabled RBs (CIK).
3079 * Returns the disabled RB bitmask.
3081 static u32
cik_get_rb_disabled(struct radeon_device
*rdev
,
3082 u32 max_rb_num_per_se
,
3087 data
= RREG32(CC_RB_BACKEND_DISABLE
);
3089 data
&= BACKEND_DISABLE_MASK
;
3092 data
|= RREG32(GC_USER_RB_BACKEND_DISABLE
);
3094 data
>>= BACKEND_DISABLE_SHIFT
;
3096 mask
= cik_create_bitmask(max_rb_num_per_se
/ sh_per_se
);
3102 * cik_setup_rb - setup the RBs on the asic
3104 * @rdev: radeon_device pointer
3105 * @se_num: number of SEs (shader engines) for the asic
3106 * @sh_per_se: number of SH blocks per SE for the asic
3107 * @max_rb_num: max RBs (render backends) for the asic
3109 * Configures per-SE/SH RB registers (CIK).
3111 static void cik_setup_rb(struct radeon_device
*rdev
,
3112 u32 se_num
, u32 sh_per_se
,
3113 u32 max_rb_num_per_se
)
3117 u32 disabled_rbs
= 0;
3118 u32 enabled_rbs
= 0;
3120 for (i
= 0; i
< se_num
; i
++) {
3121 for (j
= 0; j
< sh_per_se
; j
++) {
3122 cik_select_se_sh(rdev
, i
, j
);
3123 data
= cik_get_rb_disabled(rdev
, max_rb_num_per_se
, sh_per_se
);
3124 if (rdev
->family
== CHIP_HAWAII
)
3125 disabled_rbs
|= data
<< ((i
* sh_per_se
+ j
) * HAWAII_RB_BITMAP_WIDTH_PER_SH
);
3127 disabled_rbs
|= data
<< ((i
* sh_per_se
+ j
) * CIK_RB_BITMAP_WIDTH_PER_SH
);
3130 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
3133 for (i
= 0; i
< max_rb_num_per_se
* se_num
; i
++) {
3134 if (!(disabled_rbs
& mask
))
3135 enabled_rbs
|= mask
;
3139 rdev
->config
.cik
.backend_enable_mask
= enabled_rbs
;
3141 for (i
= 0; i
< se_num
; i
++) {
3142 cik_select_se_sh(rdev
, i
, 0xffffffff);
3144 for (j
= 0; j
< sh_per_se
; j
++) {
3145 switch (enabled_rbs
& 3) {
3148 data
|= PKR_MAP(RASTER_CONFIG_RB_MAP_3
);
3150 data
|= PKR_MAP(RASTER_CONFIG_RB_MAP_0
);
3153 data
|= (RASTER_CONFIG_RB_MAP_0
<< (i
* sh_per_se
+ j
) * 2);
3156 data
|= (RASTER_CONFIG_RB_MAP_3
<< (i
* sh_per_se
+ j
) * 2);
3160 data
|= (RASTER_CONFIG_RB_MAP_2
<< (i
* sh_per_se
+ j
) * 2);
3165 WREG32(PA_SC_RASTER_CONFIG
, data
);
3167 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
3171 * cik_gpu_init - setup the 3D engine
3173 * @rdev: radeon_device pointer
3175 * Configures the 3D engine and tiling configuration
3176 * registers so that the 3D engine is usable.
3178 static void cik_gpu_init(struct radeon_device
*rdev
)
3180 u32 gb_addr_config
= RREG32(GB_ADDR_CONFIG
);
3181 u32 mc_shared_chmap
, mc_arb_ramcfg
;
3182 u32 hdp_host_path_cntl
;
3186 switch (rdev
->family
) {
3188 rdev
->config
.cik
.max_shader_engines
= 2;
3189 rdev
->config
.cik
.max_tile_pipes
= 4;
3190 rdev
->config
.cik
.max_cu_per_sh
= 7;
3191 rdev
->config
.cik
.max_sh_per_se
= 1;
3192 rdev
->config
.cik
.max_backends_per_se
= 2;
3193 rdev
->config
.cik
.max_texture_channel_caches
= 4;
3194 rdev
->config
.cik
.max_gprs
= 256;
3195 rdev
->config
.cik
.max_gs_threads
= 32;
3196 rdev
->config
.cik
.max_hw_contexts
= 8;
3198 rdev
->config
.cik
.sc_prim_fifo_size_frontend
= 0x20;
3199 rdev
->config
.cik
.sc_prim_fifo_size_backend
= 0x100;
3200 rdev
->config
.cik
.sc_hiz_tile_fifo_size
= 0x30;
3201 rdev
->config
.cik
.sc_earlyz_tile_fifo_size
= 0x130;
3202 gb_addr_config
= BONAIRE_GB_ADDR_CONFIG_GOLDEN
;
3205 rdev
->config
.cik
.max_shader_engines
= 4;
3206 rdev
->config
.cik
.max_tile_pipes
= 16;
3207 rdev
->config
.cik
.max_cu_per_sh
= 11;
3208 rdev
->config
.cik
.max_sh_per_se
= 1;
3209 rdev
->config
.cik
.max_backends_per_se
= 4;
3210 rdev
->config
.cik
.max_texture_channel_caches
= 16;
3211 rdev
->config
.cik
.max_gprs
= 256;
3212 rdev
->config
.cik
.max_gs_threads
= 32;
3213 rdev
->config
.cik
.max_hw_contexts
= 8;
3215 rdev
->config
.cik
.sc_prim_fifo_size_frontend
= 0x20;
3216 rdev
->config
.cik
.sc_prim_fifo_size_backend
= 0x100;
3217 rdev
->config
.cik
.sc_hiz_tile_fifo_size
= 0x30;
3218 rdev
->config
.cik
.sc_earlyz_tile_fifo_size
= 0x130;
3219 gb_addr_config
= HAWAII_GB_ADDR_CONFIG_GOLDEN
;
3222 rdev
->config
.cik
.max_shader_engines
= 1;
3223 rdev
->config
.cik
.max_tile_pipes
= 4;
3224 if ((rdev
->pdev
->device
== 0x1304) ||
3225 (rdev
->pdev
->device
== 0x1305) ||
3226 (rdev
->pdev
->device
== 0x130C) ||
3227 (rdev
->pdev
->device
== 0x130F) ||
3228 (rdev
->pdev
->device
== 0x1310) ||
3229 (rdev
->pdev
->device
== 0x1311) ||
3230 (rdev
->pdev
->device
== 0x131C)) {
3231 rdev
->config
.cik
.max_cu_per_sh
= 8;
3232 rdev
->config
.cik
.max_backends_per_se
= 2;
3233 } else if ((rdev
->pdev
->device
== 0x1309) ||
3234 (rdev
->pdev
->device
== 0x130A) ||
3235 (rdev
->pdev
->device
== 0x130D) ||
3236 (rdev
->pdev
->device
== 0x1313) ||
3237 (rdev
->pdev
->device
== 0x131D)) {
3238 rdev
->config
.cik
.max_cu_per_sh
= 6;
3239 rdev
->config
.cik
.max_backends_per_se
= 2;
3240 } else if ((rdev
->pdev
->device
== 0x1306) ||
3241 (rdev
->pdev
->device
== 0x1307) ||
3242 (rdev
->pdev
->device
== 0x130B) ||
3243 (rdev
->pdev
->device
== 0x130E) ||
3244 (rdev
->pdev
->device
== 0x1315) ||
3245 (rdev
->pdev
->device
== 0x1318) ||
3246 (rdev
->pdev
->device
== 0x131B)) {
3247 rdev
->config
.cik
.max_cu_per_sh
= 4;
3248 rdev
->config
.cik
.max_backends_per_se
= 1;
3250 rdev
->config
.cik
.max_cu_per_sh
= 3;
3251 rdev
->config
.cik
.max_backends_per_se
= 1;
3253 rdev
->config
.cik
.max_sh_per_se
= 1;
3254 rdev
->config
.cik
.max_texture_channel_caches
= 4;
3255 rdev
->config
.cik
.max_gprs
= 256;
3256 rdev
->config
.cik
.max_gs_threads
= 16;
3257 rdev
->config
.cik
.max_hw_contexts
= 8;
3259 rdev
->config
.cik
.sc_prim_fifo_size_frontend
= 0x20;
3260 rdev
->config
.cik
.sc_prim_fifo_size_backend
= 0x100;
3261 rdev
->config
.cik
.sc_hiz_tile_fifo_size
= 0x30;
3262 rdev
->config
.cik
.sc_earlyz_tile_fifo_size
= 0x130;
3263 gb_addr_config
= BONAIRE_GB_ADDR_CONFIG_GOLDEN
;
3268 rdev
->config
.cik
.max_shader_engines
= 1;
3269 rdev
->config
.cik
.max_tile_pipes
= 2;
3270 rdev
->config
.cik
.max_cu_per_sh
= 2;
3271 rdev
->config
.cik
.max_sh_per_se
= 1;
3272 rdev
->config
.cik
.max_backends_per_se
= 1;
3273 rdev
->config
.cik
.max_texture_channel_caches
= 2;
3274 rdev
->config
.cik
.max_gprs
= 256;
3275 rdev
->config
.cik
.max_gs_threads
= 16;
3276 rdev
->config
.cik
.max_hw_contexts
= 8;
3278 rdev
->config
.cik
.sc_prim_fifo_size_frontend
= 0x20;
3279 rdev
->config
.cik
.sc_prim_fifo_size_backend
= 0x100;
3280 rdev
->config
.cik
.sc_hiz_tile_fifo_size
= 0x30;
3281 rdev
->config
.cik
.sc_earlyz_tile_fifo_size
= 0x130;
3282 gb_addr_config
= BONAIRE_GB_ADDR_CONFIG_GOLDEN
;
3286 /* Initialize HDP */
3287 for (i
= 0, j
= 0; i
< 32; i
++, j
+= 0x18) {
3288 WREG32((0x2c14 + j
), 0x00000000);
3289 WREG32((0x2c18 + j
), 0x00000000);
3290 WREG32((0x2c1c + j
), 0x00000000);
3291 WREG32((0x2c20 + j
), 0x00000000);
3292 WREG32((0x2c24 + j
), 0x00000000);
3295 WREG32(GRBM_CNTL
, GRBM_READ_TIMEOUT(0xff));
3296 WREG32(SRBM_INT_CNTL
, 0x1);
3297 WREG32(SRBM_INT_ACK
, 0x1);
3299 WREG32(BIF_FB_EN
, FB_READ_EN
| FB_WRITE_EN
);
3301 mc_shared_chmap
= RREG32(MC_SHARED_CHMAP
);
3302 mc_arb_ramcfg
= RREG32(MC_ARB_RAMCFG
);
3304 rdev
->config
.cik
.num_tile_pipes
= rdev
->config
.cik
.max_tile_pipes
;
3305 rdev
->config
.cik
.mem_max_burst_length_bytes
= 256;
3306 tmp
= (mc_arb_ramcfg
& NOOFCOLS_MASK
) >> NOOFCOLS_SHIFT
;
3307 rdev
->config
.cik
.mem_row_size_in_kb
= (4 * (1 << (8 + tmp
))) / 1024;
3308 if (rdev
->config
.cik
.mem_row_size_in_kb
> 4)
3309 rdev
->config
.cik
.mem_row_size_in_kb
= 4;
3310 /* XXX use MC settings? */
3311 rdev
->config
.cik
.shader_engine_tile_size
= 32;
3312 rdev
->config
.cik
.num_gpus
= 1;
3313 rdev
->config
.cik
.multi_gpu_tile_size
= 64;
3315 /* fix up row size */
3316 gb_addr_config
&= ~ROW_SIZE_MASK
;
3317 switch (rdev
->config
.cik
.mem_row_size_in_kb
) {
3320 gb_addr_config
|= ROW_SIZE(0);
3323 gb_addr_config
|= ROW_SIZE(1);
3326 gb_addr_config
|= ROW_SIZE(2);
3330 /* setup tiling info dword. gb_addr_config is not adequate since it does
3331 * not have bank info, so create a custom tiling dword.
3332 * bits 3:0 num_pipes
3333 * bits 7:4 num_banks
3334 * bits 11:8 group_size
3335 * bits 15:12 row_size
3337 rdev
->config
.cik
.tile_config
= 0;
3338 switch (rdev
->config
.cik
.num_tile_pipes
) {
3340 rdev
->config
.cik
.tile_config
|= (0 << 0);
3343 rdev
->config
.cik
.tile_config
|= (1 << 0);
3346 rdev
->config
.cik
.tile_config
|= (2 << 0);
3350 /* XXX what about 12? */
3351 rdev
->config
.cik
.tile_config
|= (3 << 0);
3354 rdev
->config
.cik
.tile_config
|=
3355 ((mc_arb_ramcfg
& NOOFBANK_MASK
) >> NOOFBANK_SHIFT
) << 4;
3356 rdev
->config
.cik
.tile_config
|=
3357 ((gb_addr_config
& PIPE_INTERLEAVE_SIZE_MASK
) >> PIPE_INTERLEAVE_SIZE_SHIFT
) << 8;
3358 rdev
->config
.cik
.tile_config
|=
3359 ((gb_addr_config
& ROW_SIZE_MASK
) >> ROW_SIZE_SHIFT
) << 12;
3361 WREG32(GB_ADDR_CONFIG
, gb_addr_config
);
3362 WREG32(HDP_ADDR_CONFIG
, gb_addr_config
);
3363 WREG32(DMIF_ADDR_CALC
, gb_addr_config
);
3364 WREG32(SDMA0_TILING_CONFIG
+ SDMA0_REGISTER_OFFSET
, gb_addr_config
& 0x70);
3365 WREG32(SDMA0_TILING_CONFIG
+ SDMA1_REGISTER_OFFSET
, gb_addr_config
& 0x70);
3366 WREG32(UVD_UDEC_ADDR_CONFIG
, gb_addr_config
);
3367 WREG32(UVD_UDEC_DB_ADDR_CONFIG
, gb_addr_config
);
3368 WREG32(UVD_UDEC_DBW_ADDR_CONFIG
, gb_addr_config
);
3370 cik_tiling_mode_table_init(rdev
);
3372 cik_setup_rb(rdev
, rdev
->config
.cik
.max_shader_engines
,
3373 rdev
->config
.cik
.max_sh_per_se
,
3374 rdev
->config
.cik
.max_backends_per_se
);
3376 rdev
->config
.cik
.active_cus
= 0;
3377 for (i
= 0; i
< rdev
->config
.cik
.max_shader_engines
; i
++) {
3378 for (j
= 0; j
< rdev
->config
.cik
.max_sh_per_se
; j
++) {
3379 rdev
->config
.cik
.active_cus
+=
3380 hweight32(cik_get_cu_active_bitmap(rdev
, i
, j
));
3384 /* set HW defaults for 3D engine */
3385 WREG32(CP_MEQ_THRESHOLDS
, MEQ1_START(0x30) | MEQ2_START(0x60));
3387 WREG32(SX_DEBUG_1
, 0x20);
3389 WREG32(TA_CNTL_AUX
, 0x00010000);
3391 tmp
= RREG32(SPI_CONFIG_CNTL
);
3393 WREG32(SPI_CONFIG_CNTL
, tmp
);
3395 WREG32(SQ_CONFIG
, 1);
3397 WREG32(DB_DEBUG
, 0);
3399 tmp
= RREG32(DB_DEBUG2
) & ~0xf00fffff;
3401 WREG32(DB_DEBUG2
, tmp
);
3403 tmp
= RREG32(DB_DEBUG3
) & ~0x0002021c;
3405 WREG32(DB_DEBUG3
, tmp
);
3407 tmp
= RREG32(CB_HW_CONTROL
) & ~0x00010000;
3409 WREG32(CB_HW_CONTROL
, tmp
);
3411 WREG32(SPI_CONFIG_CNTL_1
, VTX_DONE_DELAY(4));
3413 WREG32(PA_SC_FIFO_SIZE
, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev
->config
.cik
.sc_prim_fifo_size_frontend
) |
3414 SC_BACKEND_PRIM_FIFO_SIZE(rdev
->config
.cik
.sc_prim_fifo_size_backend
) |
3415 SC_HIZ_TILE_FIFO_SIZE(rdev
->config
.cik
.sc_hiz_tile_fifo_size
) |
3416 SC_EARLYZ_TILE_FIFO_SIZE(rdev
->config
.cik
.sc_earlyz_tile_fifo_size
)));
3418 WREG32(VGT_NUM_INSTANCES
, 1);
3420 WREG32(CP_PERFMON_CNTL
, 0);
3422 WREG32(SQ_CONFIG
, 0);
3424 WREG32(PA_SC_FORCE_EOV_MAX_CNTS
, (FORCE_EOV_MAX_CLK_CNT(4095) |
3425 FORCE_EOV_MAX_REZ_CNT(255)));
3427 WREG32(VGT_CACHE_INVALIDATION
, CACHE_INVALIDATION(VC_AND_TC
) |
3428 AUTO_INVLD_EN(ES_AND_GS_AUTO
));
3430 WREG32(VGT_GS_VERTEX_REUSE
, 16);
3431 WREG32(PA_SC_LINE_STIPPLE_STATE
, 0);
3433 tmp
= RREG32(HDP_MISC_CNTL
);
3434 tmp
|= HDP_FLUSH_INVALIDATE_CACHE
;
3435 WREG32(HDP_MISC_CNTL
, tmp
);
3437 hdp_host_path_cntl
= RREG32(HDP_HOST_PATH_CNTL
);
3438 WREG32(HDP_HOST_PATH_CNTL
, hdp_host_path_cntl
);
3440 WREG32(PA_CL_ENHANCE
, CLIP_VTX_REORDER_ENA
| NUM_CLIP_SEQ(3));
3441 WREG32(PA_SC_ENHANCE
, ENABLE_PA_SC_OUT_OF_ORDER
);
3447 * GPU scratch registers helpers function.
3450 * cik_scratch_init - setup driver info for CP scratch regs
3452 * @rdev: radeon_device pointer
3454 * Set up the number and offset of the CP scratch registers.
3455 * NOTE: use of CP scratch registers is a legacy inferface and
3456 * is not used by default on newer asics (r6xx+). On newer asics,
3457 * memory buffers are used for fences rather than scratch regs.
3459 static void cik_scratch_init(struct radeon_device
*rdev
)
3463 rdev
->scratch
.num_reg
= 7;
3464 rdev
->scratch
.reg_base
= SCRATCH_REG0
;
3465 for (i
= 0; i
< rdev
->scratch
.num_reg
; i
++) {
3466 rdev
->scratch
.free
[i
] = true;
3467 rdev
->scratch
.reg
[i
] = rdev
->scratch
.reg_base
+ (i
* 4);
3472 * cik_ring_test - basic gfx ring test
3474 * @rdev: radeon_device pointer
3475 * @ring: radeon_ring structure holding ring information
3477 * Allocate a scratch register and write to it using the gfx ring (CIK).
3478 * Provides a basic gfx ring test to verify that the ring is working.
3479 * Used by cik_cp_gfx_resume();
3480 * Returns 0 on success, error on failure.
3482 int cik_ring_test(struct radeon_device
*rdev
, struct radeon_ring
*ring
)
3489 r
= radeon_scratch_get(rdev
, &scratch
);
3491 DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r
);
3494 WREG32(scratch
, 0xCAFEDEAD);
3495 r
= radeon_ring_lock(rdev
, ring
, 3);
3497 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring
->idx
, r
);
3498 radeon_scratch_free(rdev
, scratch
);
3501 radeon_ring_write(ring
, PACKET3(PACKET3_SET_UCONFIG_REG
, 1));
3502 radeon_ring_write(ring
, ((scratch
- PACKET3_SET_UCONFIG_REG_START
) >> 2));
3503 radeon_ring_write(ring
, 0xDEADBEEF);
3504 radeon_ring_unlock_commit(rdev
, ring
, false);
3506 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
3507 tmp
= RREG32(scratch
);
3508 if (tmp
== 0xDEADBEEF)
3512 if (i
< rdev
->usec_timeout
) {
3513 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring
->idx
, i
);
3515 DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
3516 ring
->idx
, scratch
, tmp
);
3519 radeon_scratch_free(rdev
, scratch
);
3524 * cik_hdp_flush_cp_ring_emit - emit an hdp flush on the cp
3526 * @rdev: radeon_device pointer
3527 * @ridx: radeon ring index
3529 * Emits an hdp flush on the cp.
3531 static void cik_hdp_flush_cp_ring_emit(struct radeon_device
*rdev
,
3534 struct radeon_ring
*ring
= &rdev
->ring
[ridx
];
3537 switch (ring
->idx
) {
3538 case CAYMAN_RING_TYPE_CP1_INDEX
:
3539 case CAYMAN_RING_TYPE_CP2_INDEX
:
3543 ref_and_mask
= CP2
<< ring
->pipe
;
3546 ref_and_mask
= CP6
<< ring
->pipe
;
3552 case RADEON_RING_TYPE_GFX_INDEX
:
3557 radeon_ring_write(ring
, PACKET3(PACKET3_WAIT_REG_MEM
, 5));
3558 radeon_ring_write(ring
, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
3559 WAIT_REG_MEM_FUNCTION(3) | /* == */
3560 WAIT_REG_MEM_ENGINE(1))); /* pfp */
3561 radeon_ring_write(ring
, GPU_HDP_FLUSH_REQ
>> 2);
3562 radeon_ring_write(ring
, GPU_HDP_FLUSH_DONE
>> 2);
3563 radeon_ring_write(ring
, ref_and_mask
);
3564 radeon_ring_write(ring
, ref_and_mask
);
3565 radeon_ring_write(ring
, 0x20); /* poll interval */
3569 * cik_fence_gfx_ring_emit - emit a fence on the gfx ring
3571 * @rdev: radeon_device pointer
3572 * @fence: radeon fence object
3574 * Emits a fence sequnce number on the gfx ring and flushes
3577 void cik_fence_gfx_ring_emit(struct radeon_device
*rdev
,
3578 struct radeon_fence
*fence
)
3580 struct radeon_ring
*ring
= &rdev
->ring
[fence
->ring
];
3581 u64 addr
= rdev
->fence_drv
[fence
->ring
].gpu_addr
;
3583 /* Workaround for cache flush problems. First send a dummy EOP
3584 * event down the pipe with seq one below.
3586 radeon_ring_write(ring
, PACKET3(PACKET3_EVENT_WRITE_EOP
, 4));
3587 radeon_ring_write(ring
, (EOP_TCL1_ACTION_EN
|
3589 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT
) |
3591 radeon_ring_write(ring
, addr
& 0xfffffffc);
3592 radeon_ring_write(ring
, (upper_32_bits(addr
) & 0xffff) |
3593 DATA_SEL(1) | INT_SEL(0));
3594 radeon_ring_write(ring
, fence
->seq
- 1);
3595 radeon_ring_write(ring
, 0);
3597 /* Then send the real EOP event down the pipe. */
3598 radeon_ring_write(ring
, PACKET3(PACKET3_EVENT_WRITE_EOP
, 4));
3599 radeon_ring_write(ring
, (EOP_TCL1_ACTION_EN
|
3601 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT
) |
3603 radeon_ring_write(ring
, addr
& 0xfffffffc);
3604 radeon_ring_write(ring
, (upper_32_bits(addr
) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
3605 radeon_ring_write(ring
, fence
->seq
);
3606 radeon_ring_write(ring
, 0);
3610 * cik_fence_compute_ring_emit - emit a fence on the compute ring
3612 * @rdev: radeon_device pointer
3613 * @fence: radeon fence object
3615 * Emits a fence sequnce number on the compute ring and flushes
3618 void cik_fence_compute_ring_emit(struct radeon_device
*rdev
,
3619 struct radeon_fence
*fence
)
3621 struct radeon_ring
*ring
= &rdev
->ring
[fence
->ring
];
3622 u64 addr
= rdev
->fence_drv
[fence
->ring
].gpu_addr
;
3624 /* RELEASE_MEM - flush caches, send int */
3625 radeon_ring_write(ring
, PACKET3(PACKET3_RELEASE_MEM
, 5));
3626 radeon_ring_write(ring
, (EOP_TCL1_ACTION_EN
|
3628 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT
) |
3630 radeon_ring_write(ring
, DATA_SEL(1) | INT_SEL(2));
3631 radeon_ring_write(ring
, addr
& 0xfffffffc);
3632 radeon_ring_write(ring
, upper_32_bits(addr
));
3633 radeon_ring_write(ring
, fence
->seq
);
3634 radeon_ring_write(ring
, 0);
3638 * cik_semaphore_ring_emit - emit a semaphore on the CP ring
3640 * @rdev: radeon_device pointer
3641 * @ring: radeon ring buffer object
3642 * @semaphore: radeon semaphore object
3643 * @emit_wait: Is this a sempahore wait?
3645 * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
3646 * from running ahead of semaphore waits.
3648 bool cik_semaphore_ring_emit(struct radeon_device
*rdev
,
3649 struct radeon_ring
*ring
,
3650 struct radeon_semaphore
*semaphore
,
3653 uint64_t addr
= semaphore
->gpu_addr
;
3654 unsigned sel
= emit_wait
? PACKET3_SEM_SEL_WAIT
: PACKET3_SEM_SEL_SIGNAL
;
3656 radeon_ring_write(ring
, PACKET3(PACKET3_MEM_SEMAPHORE
, 1));
3657 radeon_ring_write(ring
, lower_32_bits(addr
));
3658 radeon_ring_write(ring
, (upper_32_bits(addr
) & 0xffff) | sel
);
3660 if (emit_wait
&& ring
->idx
== RADEON_RING_TYPE_GFX_INDEX
) {
3661 /* Prevent the PFP from running ahead of the semaphore wait */
3662 radeon_ring_write(ring
, PACKET3(PACKET3_PFP_SYNC_ME
, 0));
3663 radeon_ring_write(ring
, 0x0);
3670 * cik_copy_cpdma - copy pages using the CP DMA engine
3672 * @rdev: radeon_device pointer
3673 * @src_offset: src GPU address
3674 * @dst_offset: dst GPU address
3675 * @num_gpu_pages: number of GPU pages to xfer
3676 * @resv: reservation object to sync to
3678 * Copy GPU paging using the CP DMA engine (CIK+).
3679 * Used by the radeon ttm implementation to move pages if
3680 * registered as the asic copy callback.
3682 struct radeon_fence
*cik_copy_cpdma(struct radeon_device
*rdev
,
3683 uint64_t src_offset
, uint64_t dst_offset
,
3684 unsigned num_gpu_pages
,
3685 struct reservation_object
*resv
)
3687 struct radeon_fence
*fence
;
3688 struct radeon_sync sync
;
3689 int ring_index
= rdev
->asic
->copy
.blit_ring_index
;
3690 struct radeon_ring
*ring
= &rdev
->ring
[ring_index
];
3691 u32 size_in_bytes
, cur_size_in_bytes
, control
;
3695 radeon_sync_create(&sync
);
3697 size_in_bytes
= (num_gpu_pages
<< RADEON_GPU_PAGE_SHIFT
);
3698 num_loops
= DIV_ROUND_UP(size_in_bytes
, 0x1fffff);
3699 r
= radeon_ring_lock(rdev
, ring
, num_loops
* 7 + 18);
3701 DRM_ERROR("radeon: moving bo (%d).\n", r
);
3702 radeon_sync_free(rdev
, &sync
, NULL
);
3706 radeon_sync_resv(rdev
, &sync
, resv
, false);
3707 radeon_sync_rings(rdev
, &sync
, ring
->idx
);
3709 for (i
= 0; i
< num_loops
; i
++) {
3710 cur_size_in_bytes
= size_in_bytes
;
3711 if (cur_size_in_bytes
> 0x1fffff)
3712 cur_size_in_bytes
= 0x1fffff;
3713 size_in_bytes
-= cur_size_in_bytes
;
3715 if (size_in_bytes
== 0)
3716 control
|= PACKET3_DMA_DATA_CP_SYNC
;
3717 radeon_ring_write(ring
, PACKET3(PACKET3_DMA_DATA
, 5));
3718 radeon_ring_write(ring
, control
);
3719 radeon_ring_write(ring
, lower_32_bits(src_offset
));
3720 radeon_ring_write(ring
, upper_32_bits(src_offset
));
3721 radeon_ring_write(ring
, lower_32_bits(dst_offset
));
3722 radeon_ring_write(ring
, upper_32_bits(dst_offset
));
3723 radeon_ring_write(ring
, cur_size_in_bytes
);
3724 src_offset
+= cur_size_in_bytes
;
3725 dst_offset
+= cur_size_in_bytes
;
3728 r
= radeon_fence_emit(rdev
, &fence
, ring
->idx
);
3730 radeon_ring_unlock_undo(rdev
, ring
);
3731 radeon_sync_free(rdev
, &sync
, NULL
);
3735 radeon_ring_unlock_commit(rdev
, ring
, false);
3736 radeon_sync_free(rdev
, &sync
, fence
);
3745 * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
3747 * @rdev: radeon_device pointer
3748 * @ib: radeon indirect buffer object
3750 * Emits a DE (drawing engine) or CE (constant engine) IB
3751 * on the gfx ring. IBs are usually generated by userspace
3752 * acceleration drivers and submitted to the kernel for
3753 * scheduling on the ring. This function schedules the IB
3754 * on the gfx ring for execution by the GPU.
3756 void cik_ring_ib_execute(struct radeon_device
*rdev
, struct radeon_ib
*ib
)
3758 struct radeon_ring
*ring
= &rdev
->ring
[ib
->ring
];
3759 unsigned vm_id
= ib
->vm
? ib
->vm
->ids
[ib
->ring
].id
: 0;
3760 u32 header
, control
= INDIRECT_BUFFER_VALID
;
3762 if (ib
->is_const_ib
) {
3763 /* set switch buffer packet before const IB */
3764 radeon_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
3765 radeon_ring_write(ring
, 0);
3767 header
= PACKET3(PACKET3_INDIRECT_BUFFER_CONST
, 2);
3770 if (ring
->rptr_save_reg
) {
3771 next_rptr
= ring
->wptr
+ 3 + 4;
3772 radeon_ring_write(ring
, PACKET3(PACKET3_SET_UCONFIG_REG
, 1));
3773 radeon_ring_write(ring
, ((ring
->rptr_save_reg
-
3774 PACKET3_SET_UCONFIG_REG_START
) >> 2));
3775 radeon_ring_write(ring
, next_rptr
);
3776 } else if (rdev
->wb
.enabled
) {
3777 next_rptr
= ring
->wptr
+ 5 + 4;
3778 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
3779 radeon_ring_write(ring
, WRITE_DATA_DST_SEL(1));
3780 radeon_ring_write(ring
, ring
->next_rptr_gpu_addr
& 0xfffffffc);
3781 radeon_ring_write(ring
, upper_32_bits(ring
->next_rptr_gpu_addr
));
3782 radeon_ring_write(ring
, next_rptr
);
3785 header
= PACKET3(PACKET3_INDIRECT_BUFFER
, 2);
3788 control
|= ib
->length_dw
| (vm_id
<< 24);
3790 radeon_ring_write(ring
, header
);
3791 radeon_ring_write(ring
, (ib
->gpu_addr
& 0xFFFFFFFC));
3792 radeon_ring_write(ring
, upper_32_bits(ib
->gpu_addr
) & 0xFFFF);
3793 radeon_ring_write(ring
, control
);
3797 * cik_ib_test - basic gfx ring IB test
3799 * @rdev: radeon_device pointer
3800 * @ring: radeon_ring structure holding ring information
3802 * Allocate an IB and execute it on the gfx ring (CIK).
3803 * Provides a basic gfx ring test to verify that IBs are working.
3804 * Returns 0 on success, error on failure.
3806 int cik_ib_test(struct radeon_device
*rdev
, struct radeon_ring
*ring
)
3808 struct radeon_ib ib
;
3814 r
= radeon_scratch_get(rdev
, &scratch
);
3816 DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r
);
3819 WREG32(scratch
, 0xCAFEDEAD);
3820 r
= radeon_ib_get(rdev
, ring
->idx
, &ib
, NULL
, 256);
3822 DRM_ERROR("radeon: failed to get ib (%d).\n", r
);
3823 radeon_scratch_free(rdev
, scratch
);
3826 ib
.ptr
[0] = PACKET3(PACKET3_SET_UCONFIG_REG
, 1);
3827 ib
.ptr
[1] = ((scratch
- PACKET3_SET_UCONFIG_REG_START
) >> 2);
3828 ib
.ptr
[2] = 0xDEADBEEF;
3830 r
= radeon_ib_schedule(rdev
, &ib
, NULL
, false);
3832 radeon_scratch_free(rdev
, scratch
);
3833 radeon_ib_free(rdev
, &ib
);
3834 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r
);
3837 r
= radeon_fence_wait_timeout(ib
.fence
, false, usecs_to_jiffies(
3838 RADEON_USEC_IB_TEST_TIMEOUT
));
3840 DRM_ERROR("radeon: fence wait failed (%d).\n", r
);
3841 radeon_scratch_free(rdev
, scratch
);
3842 radeon_ib_free(rdev
, &ib
);
3844 } else if (r
== 0) {
3845 DRM_ERROR("radeon: fence wait timed out.\n");
3846 radeon_scratch_free(rdev
, scratch
);
3847 radeon_ib_free(rdev
, &ib
);
3851 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
3852 tmp
= RREG32(scratch
);
3853 if (tmp
== 0xDEADBEEF)
3857 if (i
< rdev
->usec_timeout
) {
3858 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib
.fence
->ring
, i
);
3860 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
3864 radeon_scratch_free(rdev
, scratch
);
3865 radeon_ib_free(rdev
, &ib
);
3871 * On CIK, gfx and compute now have independant command processors.
3874 * Gfx consists of a single ring and can process both gfx jobs and
3875 * compute jobs. The gfx CP consists of three microengines (ME):
3876 * PFP - Pre-Fetch Parser
3878 * CE - Constant Engine
3879 * The PFP and ME make up what is considered the Drawing Engine (DE).
3880 * The CE is an asynchronous engine used for updating buffer desciptors
3881 * used by the DE so that they can be loaded into cache in parallel
3882 * while the DE is processing state update packets.
3885 * The compute CP consists of two microengines (ME):
3886 * MEC1 - Compute MicroEngine 1
3887 * MEC2 - Compute MicroEngine 2
3888 * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
3889 * The queues are exposed to userspace and are programmed directly
3890 * by the compute runtime.
3893 * cik_cp_gfx_enable - enable/disable the gfx CP MEs
3895 * @rdev: radeon_device pointer
3896 * @enable: enable or disable the MEs
3898 * Halts or unhalts the gfx MEs.
3900 static void cik_cp_gfx_enable(struct radeon_device
*rdev
, bool enable
)
3903 WREG32(CP_ME_CNTL
, 0);
3905 if (rdev
->asic
->copy
.copy_ring_index
== RADEON_RING_TYPE_GFX_INDEX
)
3906 radeon_ttm_set_active_vram_size(rdev
, rdev
->mc
.visible_vram_size
);
3907 WREG32(CP_ME_CNTL
, (CP_ME_HALT
| CP_PFP_HALT
| CP_CE_HALT
));
3908 rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
].ready
= false;
3914 * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
3916 * @rdev: radeon_device pointer
3918 * Loads the gfx PFP, ME, and CE ucode.
3919 * Returns 0 for success, -EINVAL if the ucode is not available.
3921 static int cik_cp_gfx_load_microcode(struct radeon_device
*rdev
)
3925 if (!rdev
->me_fw
|| !rdev
->pfp_fw
|| !rdev
->ce_fw
)
3928 cik_cp_gfx_enable(rdev
, false);
3931 const struct gfx_firmware_header_v1_0
*pfp_hdr
=
3932 (const struct gfx_firmware_header_v1_0
*)rdev
->pfp_fw
->data
;
3933 const struct gfx_firmware_header_v1_0
*ce_hdr
=
3934 (const struct gfx_firmware_header_v1_0
*)rdev
->ce_fw
->data
;
3935 const struct gfx_firmware_header_v1_0
*me_hdr
=
3936 (const struct gfx_firmware_header_v1_0
*)rdev
->me_fw
->data
;
3937 const __le32
*fw_data
;
3940 radeon_ucode_print_gfx_hdr(&pfp_hdr
->header
);
3941 radeon_ucode_print_gfx_hdr(&ce_hdr
->header
);
3942 radeon_ucode_print_gfx_hdr(&me_hdr
->header
);
3945 fw_data
= (const __le32
*)
3946 (rdev
->pfp_fw
->data
+ le32_to_cpu(pfp_hdr
->header
.ucode_array_offset_bytes
));
3947 fw_size
= le32_to_cpu(pfp_hdr
->header
.ucode_size_bytes
) / 4;
3948 WREG32(CP_PFP_UCODE_ADDR
, 0);
3949 for (i
= 0; i
< fw_size
; i
++)
3950 WREG32(CP_PFP_UCODE_DATA
, le32_to_cpup(fw_data
++));
3951 WREG32(CP_PFP_UCODE_ADDR
, le32_to_cpu(pfp_hdr
->header
.ucode_version
));
3954 fw_data
= (const __le32
*)
3955 (rdev
->ce_fw
->data
+ le32_to_cpu(ce_hdr
->header
.ucode_array_offset_bytes
));
3956 fw_size
= le32_to_cpu(ce_hdr
->header
.ucode_size_bytes
) / 4;
3957 WREG32(CP_CE_UCODE_ADDR
, 0);
3958 for (i
= 0; i
< fw_size
; i
++)
3959 WREG32(CP_CE_UCODE_DATA
, le32_to_cpup(fw_data
++));
3960 WREG32(CP_CE_UCODE_ADDR
, le32_to_cpu(ce_hdr
->header
.ucode_version
));
3963 fw_data
= (const __be32
*)
3964 (rdev
->me_fw
->data
+ le32_to_cpu(me_hdr
->header
.ucode_array_offset_bytes
));
3965 fw_size
= le32_to_cpu(me_hdr
->header
.ucode_size_bytes
) / 4;
3966 WREG32(CP_ME_RAM_WADDR
, 0);
3967 for (i
= 0; i
< fw_size
; i
++)
3968 WREG32(CP_ME_RAM_DATA
, le32_to_cpup(fw_data
++));
3969 WREG32(CP_ME_RAM_WADDR
, le32_to_cpu(me_hdr
->header
.ucode_version
));
3970 WREG32(CP_ME_RAM_RADDR
, le32_to_cpu(me_hdr
->header
.ucode_version
));
3972 const __be32
*fw_data
;
3975 fw_data
= (const __be32
*)rdev
->pfp_fw
->data
;
3976 WREG32(CP_PFP_UCODE_ADDR
, 0);
3977 for (i
= 0; i
< CIK_PFP_UCODE_SIZE
; i
++)
3978 WREG32(CP_PFP_UCODE_DATA
, be32_to_cpup(fw_data
++));
3979 WREG32(CP_PFP_UCODE_ADDR
, 0);
3982 fw_data
= (const __be32
*)rdev
->ce_fw
->data
;
3983 WREG32(CP_CE_UCODE_ADDR
, 0);
3984 for (i
= 0; i
< CIK_CE_UCODE_SIZE
; i
++)
3985 WREG32(CP_CE_UCODE_DATA
, be32_to_cpup(fw_data
++));
3986 WREG32(CP_CE_UCODE_ADDR
, 0);
3989 fw_data
= (const __be32
*)rdev
->me_fw
->data
;
3990 WREG32(CP_ME_RAM_WADDR
, 0);
3991 for (i
= 0; i
< CIK_ME_UCODE_SIZE
; i
++)
3992 WREG32(CP_ME_RAM_DATA
, be32_to_cpup(fw_data
++));
3993 WREG32(CP_ME_RAM_WADDR
, 0);
4000 * cik_cp_gfx_start - start the gfx ring
4002 * @rdev: radeon_device pointer
4004 * Enables the ring and loads the clear state context and other
4005 * packets required to init the ring.
4006 * Returns 0 for success, error for failure.
4008 static int cik_cp_gfx_start(struct radeon_device
*rdev
)
4010 struct radeon_ring
*ring
= &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
];
4014 WREG32(CP_MAX_CONTEXT
, rdev
->config
.cik
.max_hw_contexts
- 1);
4015 WREG32(CP_ENDIAN_SWAP
, 0);
4016 WREG32(CP_DEVICE_ID
, 1);
4018 cik_cp_gfx_enable(rdev
, true);
4020 r
= radeon_ring_lock(rdev
, ring
, cik_default_size
+ 17);
4022 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r
);
4026 /* init the CE partitions. CE only used for gfx on CIK */
4027 radeon_ring_write(ring
, PACKET3(PACKET3_SET_BASE
, 2));
4028 radeon_ring_write(ring
, PACKET3_BASE_INDEX(CE_PARTITION_BASE
));
4029 radeon_ring_write(ring
, 0x8000);
4030 radeon_ring_write(ring
, 0x8000);
4032 /* setup clear context state */
4033 radeon_ring_write(ring
, PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
4034 radeon_ring_write(ring
, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE
);
4036 radeon_ring_write(ring
, PACKET3(PACKET3_CONTEXT_CONTROL
, 1));
4037 radeon_ring_write(ring
, 0x80000000);
4038 radeon_ring_write(ring
, 0x80000000);
4040 for (i
= 0; i
< cik_default_size
; i
++)
4041 radeon_ring_write(ring
, cik_default_state
[i
]);
4043 radeon_ring_write(ring
, PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
4044 radeon_ring_write(ring
, PACKET3_PREAMBLE_END_CLEAR_STATE
);
4046 /* set clear context state */
4047 radeon_ring_write(ring
, PACKET3(PACKET3_CLEAR_STATE
, 0));
4048 radeon_ring_write(ring
, 0);
4050 radeon_ring_write(ring
, PACKET3(PACKET3_SET_CONTEXT_REG
, 2));
4051 radeon_ring_write(ring
, 0x00000316);
4052 radeon_ring_write(ring
, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
4053 radeon_ring_write(ring
, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
4055 radeon_ring_unlock_commit(rdev
, ring
, false);
4061 * cik_cp_gfx_fini - stop the gfx ring
4063 * @rdev: radeon_device pointer
4065 * Stop the gfx ring and tear down the driver ring
4068 static void cik_cp_gfx_fini(struct radeon_device
*rdev
)
4070 cik_cp_gfx_enable(rdev
, false);
4071 radeon_ring_fini(rdev
, &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
]);
4075 * cik_cp_gfx_resume - setup the gfx ring buffer registers
4077 * @rdev: radeon_device pointer
4079 * Program the location and size of the gfx ring buffer
4080 * and test it to make sure it's working.
4081 * Returns 0 for success, error for failure.
4083 static int cik_cp_gfx_resume(struct radeon_device
*rdev
)
4085 struct radeon_ring
*ring
;
4091 WREG32(CP_SEM_WAIT_TIMER
, 0x0);
4092 if (rdev
->family
!= CHIP_HAWAII
)
4093 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL
, 0x0);
4095 /* Set the write pointer delay */
4096 WREG32(CP_RB_WPTR_DELAY
, 0);
4098 /* set the RB to use vmid 0 */
4099 WREG32(CP_RB_VMID
, 0);
4101 WREG32(SCRATCH_ADDR
, ((rdev
->wb
.gpu_addr
+ RADEON_WB_SCRATCH_OFFSET
) >> 8) & 0xFFFFFFFF);
4103 /* ring 0 - compute and gfx */
4104 /* Set ring buffer size */
4105 ring
= &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
];
4106 rb_bufsz
= order_base_2(ring
->ring_size
/ 8);
4107 tmp
= (order_base_2(RADEON_GPU_PAGE_SIZE
/8) << 8) | rb_bufsz
;
4109 tmp
|= BUF_SWAP_32BIT
;
4111 WREG32(CP_RB0_CNTL
, tmp
);
4113 /* Initialize the ring buffer's read and write pointers */
4114 WREG32(CP_RB0_CNTL
, tmp
| RB_RPTR_WR_ENA
);
4116 WREG32(CP_RB0_WPTR
, ring
->wptr
);
4118 /* set the wb address wether it's enabled or not */
4119 WREG32(CP_RB0_RPTR_ADDR
, (rdev
->wb
.gpu_addr
+ RADEON_WB_CP_RPTR_OFFSET
) & 0xFFFFFFFC);
4120 WREG32(CP_RB0_RPTR_ADDR_HI
, upper_32_bits(rdev
->wb
.gpu_addr
+ RADEON_WB_CP_RPTR_OFFSET
) & 0xFF);
4122 /* scratch register shadowing is no longer supported */
4123 WREG32(SCRATCH_UMSK
, 0);
4125 if (!rdev
->wb
.enabled
)
4126 tmp
|= RB_NO_UPDATE
;
4129 WREG32(CP_RB0_CNTL
, tmp
);
4131 rb_addr
= ring
->gpu_addr
>> 8;
4132 WREG32(CP_RB0_BASE
, rb_addr
);
4133 WREG32(CP_RB0_BASE_HI
, upper_32_bits(rb_addr
));
4135 /* start the ring */
4136 cik_cp_gfx_start(rdev
);
4137 rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
].ready
= true;
4138 r
= radeon_ring_test(rdev
, RADEON_RING_TYPE_GFX_INDEX
, &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
]);
4140 rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
].ready
= false;
4144 if (rdev
->asic
->copy
.copy_ring_index
== RADEON_RING_TYPE_GFX_INDEX
)
4145 radeon_ttm_set_active_vram_size(rdev
, rdev
->mc
.real_vram_size
);
4150 u32
cik_gfx_get_rptr(struct radeon_device
*rdev
,
4151 struct radeon_ring
*ring
)
4155 if (rdev
->wb
.enabled
)
4156 rptr
= rdev
->wb
.wb
[ring
->rptr_offs
/4];
4158 rptr
= RREG32(CP_RB0_RPTR
);
4163 u32
cik_gfx_get_wptr(struct radeon_device
*rdev
,
4164 struct radeon_ring
*ring
)
4166 return RREG32(CP_RB0_WPTR
);
4169 void cik_gfx_set_wptr(struct radeon_device
*rdev
,
4170 struct radeon_ring
*ring
)
4172 WREG32(CP_RB0_WPTR
, ring
->wptr
);
4173 (void)RREG32(CP_RB0_WPTR
);
4176 u32
cik_compute_get_rptr(struct radeon_device
*rdev
,
4177 struct radeon_ring
*ring
)
4181 if (rdev
->wb
.enabled
) {
4182 rptr
= rdev
->wb
.wb
[ring
->rptr_offs
/4];
4184 mutex_lock(&rdev
->srbm_mutex
);
4185 cik_srbm_select(rdev
, ring
->me
, ring
->pipe
, ring
->queue
, 0);
4186 rptr
= RREG32(CP_HQD_PQ_RPTR
);
4187 cik_srbm_select(rdev
, 0, 0, 0, 0);
4188 mutex_unlock(&rdev
->srbm_mutex
);
4194 u32
cik_compute_get_wptr(struct radeon_device
*rdev
,
4195 struct radeon_ring
*ring
)
4199 if (rdev
->wb
.enabled
) {
4200 /* XXX check if swapping is necessary on BE */
4201 wptr
= rdev
->wb
.wb
[ring
->wptr_offs
/4];
4203 mutex_lock(&rdev
->srbm_mutex
);
4204 cik_srbm_select(rdev
, ring
->me
, ring
->pipe
, ring
->queue
, 0);
4205 wptr
= RREG32(CP_HQD_PQ_WPTR
);
4206 cik_srbm_select(rdev
, 0, 0, 0, 0);
4207 mutex_unlock(&rdev
->srbm_mutex
);
4213 void cik_compute_set_wptr(struct radeon_device
*rdev
,
4214 struct radeon_ring
*ring
)
4216 /* XXX check if swapping is necessary on BE */
4217 rdev
->wb
.wb
[ring
->wptr_offs
/4] = ring
->wptr
;
4218 WDOORBELL32(ring
->doorbell_index
, ring
->wptr
);
4221 static void cik_compute_stop(struct radeon_device
*rdev
,
4222 struct radeon_ring
*ring
)
4226 cik_srbm_select(rdev
, ring
->me
, ring
->pipe
, ring
->queue
, 0);
4227 /* Disable wptr polling. */
4228 tmp
= RREG32(CP_PQ_WPTR_POLL_CNTL
);
4229 tmp
&= ~WPTR_POLL_EN
;
4230 WREG32(CP_PQ_WPTR_POLL_CNTL
, tmp
);
4232 if (RREG32(CP_HQD_ACTIVE
) & 1) {
4233 WREG32(CP_HQD_DEQUEUE_REQUEST
, 1);
4234 for (j
= 0; j
< rdev
->usec_timeout
; j
++) {
4235 if (!(RREG32(CP_HQD_ACTIVE
) & 1))
4239 WREG32(CP_HQD_DEQUEUE_REQUEST
, 0);
4240 WREG32(CP_HQD_PQ_RPTR
, 0);
4241 WREG32(CP_HQD_PQ_WPTR
, 0);
4243 cik_srbm_select(rdev
, 0, 0, 0, 0);
4247 * cik_cp_compute_enable - enable/disable the compute CP MEs
4249 * @rdev: radeon_device pointer
4250 * @enable: enable or disable the MEs
4252 * Halts or unhalts the compute MEs.
4254 static void cik_cp_compute_enable(struct radeon_device
*rdev
, bool enable
)
4257 WREG32(CP_MEC_CNTL
, 0);
4260 * To make hibernation reliable we need to clear compute ring
4261 * configuration before halting the compute ring.
4263 mutex_lock(&rdev
->srbm_mutex
);
4264 cik_compute_stop(rdev
,&rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
]);
4265 cik_compute_stop(rdev
,&rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
]);
4266 mutex_unlock(&rdev
->srbm_mutex
);
4268 WREG32(CP_MEC_CNTL
, (MEC_ME1_HALT
| MEC_ME2_HALT
));
4269 rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
].ready
= false;
4270 rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
].ready
= false;
4276 * cik_cp_compute_load_microcode - load the compute CP ME ucode
4278 * @rdev: radeon_device pointer
4280 * Loads the compute MEC1&2 ucode.
4281 * Returns 0 for success, -EINVAL if the ucode is not available.
4283 static int cik_cp_compute_load_microcode(struct radeon_device
*rdev
)
4290 cik_cp_compute_enable(rdev
, false);
4293 const struct gfx_firmware_header_v1_0
*mec_hdr
=
4294 (const struct gfx_firmware_header_v1_0
*)rdev
->mec_fw
->data
;
4295 const __le32
*fw_data
;
4298 radeon_ucode_print_gfx_hdr(&mec_hdr
->header
);
4301 fw_data
= (const __le32
*)
4302 (rdev
->mec_fw
->data
+ le32_to_cpu(mec_hdr
->header
.ucode_array_offset_bytes
));
4303 fw_size
= le32_to_cpu(mec_hdr
->header
.ucode_size_bytes
) / 4;
4304 WREG32(CP_MEC_ME1_UCODE_ADDR
, 0);
4305 for (i
= 0; i
< fw_size
; i
++)
4306 WREG32(CP_MEC_ME1_UCODE_DATA
, le32_to_cpup(fw_data
++));
4307 WREG32(CP_MEC_ME1_UCODE_ADDR
, le32_to_cpu(mec_hdr
->header
.ucode_version
));
4310 if (rdev
->family
== CHIP_KAVERI
) {
4311 const struct gfx_firmware_header_v1_0
*mec2_hdr
=
4312 (const struct gfx_firmware_header_v1_0
*)rdev
->mec2_fw
->data
;
4314 fw_data
= (const __le32
*)
4315 (rdev
->mec2_fw
->data
+
4316 le32_to_cpu(mec2_hdr
->header
.ucode_array_offset_bytes
));
4317 fw_size
= le32_to_cpu(mec2_hdr
->header
.ucode_size_bytes
) / 4;
4318 WREG32(CP_MEC_ME2_UCODE_ADDR
, 0);
4319 for (i
= 0; i
< fw_size
; i
++)
4320 WREG32(CP_MEC_ME2_UCODE_DATA
, le32_to_cpup(fw_data
++));
4321 WREG32(CP_MEC_ME2_UCODE_ADDR
, le32_to_cpu(mec2_hdr
->header
.ucode_version
));
4324 const __be32
*fw_data
;
4327 fw_data
= (const __be32
*)rdev
->mec_fw
->data
;
4328 WREG32(CP_MEC_ME1_UCODE_ADDR
, 0);
4329 for (i
= 0; i
< CIK_MEC_UCODE_SIZE
; i
++)
4330 WREG32(CP_MEC_ME1_UCODE_DATA
, be32_to_cpup(fw_data
++));
4331 WREG32(CP_MEC_ME1_UCODE_ADDR
, 0);
4333 if (rdev
->family
== CHIP_KAVERI
) {
4335 fw_data
= (const __be32
*)rdev
->mec_fw
->data
;
4336 WREG32(CP_MEC_ME2_UCODE_ADDR
, 0);
4337 for (i
= 0; i
< CIK_MEC_UCODE_SIZE
; i
++)
4338 WREG32(CP_MEC_ME2_UCODE_DATA
, be32_to_cpup(fw_data
++));
4339 WREG32(CP_MEC_ME2_UCODE_ADDR
, 0);
4347 * cik_cp_compute_start - start the compute queues
4349 * @rdev: radeon_device pointer
4351 * Enable the compute queues.
4352 * Returns 0 for success, error for failure.
4354 static int cik_cp_compute_start(struct radeon_device
*rdev
)
4356 cik_cp_compute_enable(rdev
, true);
4362 * cik_cp_compute_fini - stop the compute queues
4364 * @rdev: radeon_device pointer
4366 * Stop the compute queues and tear down the driver queue
4369 static void cik_cp_compute_fini(struct radeon_device
*rdev
)
4373 cik_cp_compute_enable(rdev
, false);
4375 for (i
= 0; i
< 2; i
++) {
4377 idx
= CAYMAN_RING_TYPE_CP1_INDEX
;
4379 idx
= CAYMAN_RING_TYPE_CP2_INDEX
;
4381 if (rdev
->ring
[idx
].mqd_obj
) {
4382 r
= radeon_bo_reserve(rdev
->ring
[idx
].mqd_obj
, false);
4383 if (unlikely(r
!= 0))
4384 dev_warn(rdev
->dev
, "(%d) reserve MQD bo failed\n", r
);
4386 radeon_bo_unpin(rdev
->ring
[idx
].mqd_obj
);
4387 radeon_bo_unreserve(rdev
->ring
[idx
].mqd_obj
);
4389 radeon_bo_unref(&rdev
->ring
[idx
].mqd_obj
);
4390 rdev
->ring
[idx
].mqd_obj
= NULL
;
4395 static void cik_mec_fini(struct radeon_device
*rdev
)
4399 if (rdev
->mec
.hpd_eop_obj
) {
4400 r
= radeon_bo_reserve(rdev
->mec
.hpd_eop_obj
, false);
4401 if (unlikely(r
!= 0))
4402 dev_warn(rdev
->dev
, "(%d) reserve HPD EOP bo failed\n", r
);
4403 radeon_bo_unpin(rdev
->mec
.hpd_eop_obj
);
4404 radeon_bo_unreserve(rdev
->mec
.hpd_eop_obj
);
4406 radeon_bo_unref(&rdev
->mec
.hpd_eop_obj
);
4407 rdev
->mec
.hpd_eop_obj
= NULL
;
4411 #define MEC_HPD_SIZE 2048
4413 static int cik_mec_init(struct radeon_device
*rdev
)
4419 * KV: 2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
4420 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
4422 if (rdev
->family
== CHIP_KAVERI
)
4423 rdev
->mec
.num_mec
= 2;
4425 rdev
->mec
.num_mec
= 1;
4426 rdev
->mec
.num_pipe
= 4;
4427 rdev
->mec
.num_queue
= rdev
->mec
.num_mec
* rdev
->mec
.num_pipe
* 8;
4429 if (rdev
->mec
.hpd_eop_obj
== NULL
) {
4430 r
= radeon_bo_create(rdev
,
4431 rdev
->mec
.num_mec
*rdev
->mec
.num_pipe
* MEC_HPD_SIZE
* 2,
4433 RADEON_GEM_DOMAIN_GTT
, 0, NULL
, NULL
,
4434 &rdev
->mec
.hpd_eop_obj
);
4436 dev_warn(rdev
->dev
, "(%d) create HDP EOP bo failed\n", r
);
4441 r
= radeon_bo_reserve(rdev
->mec
.hpd_eop_obj
, false);
4442 if (unlikely(r
!= 0)) {
4446 r
= radeon_bo_pin(rdev
->mec
.hpd_eop_obj
, RADEON_GEM_DOMAIN_GTT
,
4447 &rdev
->mec
.hpd_eop_gpu_addr
);
4449 dev_warn(rdev
->dev
, "(%d) pin HDP EOP bo failed\n", r
);
4453 r
= radeon_bo_kmap(rdev
->mec
.hpd_eop_obj
, (void **)&hpd
);
4455 dev_warn(rdev
->dev
, "(%d) map HDP EOP bo failed\n", r
);
4460 /* clear memory. Not sure if this is required or not */
4461 memset(hpd
, 0, rdev
->mec
.num_mec
*rdev
->mec
.num_pipe
* MEC_HPD_SIZE
* 2);
4463 radeon_bo_kunmap(rdev
->mec
.hpd_eop_obj
);
4464 radeon_bo_unreserve(rdev
->mec
.hpd_eop_obj
);
4469 struct hqd_registers
4471 u32 cp_mqd_base_addr
;
4472 u32 cp_mqd_base_addr_hi
;
4475 u32 cp_hqd_persistent_state
;
4476 u32 cp_hqd_pipe_priority
;
4477 u32 cp_hqd_queue_priority
;
4480 u32 cp_hqd_pq_base_hi
;
4482 u32 cp_hqd_pq_rptr_report_addr
;
4483 u32 cp_hqd_pq_rptr_report_addr_hi
;
4484 u32 cp_hqd_pq_wptr_poll_addr
;
4485 u32 cp_hqd_pq_wptr_poll_addr_hi
;
4486 u32 cp_hqd_pq_doorbell_control
;
4488 u32 cp_hqd_pq_control
;
4489 u32 cp_hqd_ib_base_addr
;
4490 u32 cp_hqd_ib_base_addr_hi
;
4492 u32 cp_hqd_ib_control
;
4493 u32 cp_hqd_iq_timer
;
4495 u32 cp_hqd_dequeue_request
;
4496 u32 cp_hqd_dma_offload
;
4497 u32 cp_hqd_sema_cmd
;
4498 u32 cp_hqd_msg_type
;
4499 u32 cp_hqd_atomic0_preop_lo
;
4500 u32 cp_hqd_atomic0_preop_hi
;
4501 u32 cp_hqd_atomic1_preop_lo
;
4502 u32 cp_hqd_atomic1_preop_hi
;
4503 u32 cp_hqd_hq_scheduler0
;
4504 u32 cp_hqd_hq_scheduler1
;
4511 u32 dispatch_initiator
;
4515 u32 pipeline_stat_enable
;
4516 u32 perf_counter_enable
;
4522 u32 resource_limits
;
4523 u32 static_thread_mgmt01
[2];
4525 u32 static_thread_mgmt23
[2];
4527 u32 thread_trace_enable
;
4530 u32 vgtcs_invoke_count
[2];
4531 struct hqd_registers queue_state
;
4533 u32 interrupt_queue
[64];
4537 * cik_cp_compute_resume - setup the compute queue registers
4539 * @rdev: radeon_device pointer
4541 * Program the compute queues and test them to make sure they
4543 * Returns 0 for success, error for failure.
4545 static int cik_cp_compute_resume(struct radeon_device
*rdev
)
4549 bool use_doorbell
= true;
4555 struct bonaire_mqd
*mqd
;
4557 r
= cik_cp_compute_start(rdev
);
4561 /* fix up chicken bits */
4562 tmp
= RREG32(CP_CPF_DEBUG
);
4564 WREG32(CP_CPF_DEBUG
, tmp
);
4566 /* init the pipes */
4567 mutex_lock(&rdev
->srbm_mutex
);
4569 for (i
= 0; i
< (rdev
->mec
.num_pipe
* rdev
->mec
.num_mec
); ++i
) {
4570 int me
= (i
< 4) ? 1 : 2;
4571 int pipe
= (i
< 4) ? i
: (i
- 4);
4573 cik_srbm_select(rdev
, me
, pipe
, 0, 0);
4575 eop_gpu_addr
= rdev
->mec
.hpd_eop_gpu_addr
+ (i
* MEC_HPD_SIZE
* 2) ;
4576 /* write the EOP addr */
4577 WREG32(CP_HPD_EOP_BASE_ADDR
, eop_gpu_addr
>> 8);
4578 WREG32(CP_HPD_EOP_BASE_ADDR_HI
, upper_32_bits(eop_gpu_addr
) >> 8);
4580 /* set the VMID assigned */
4581 WREG32(CP_HPD_EOP_VMID
, 0);
4583 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4584 tmp
= RREG32(CP_HPD_EOP_CONTROL
);
4585 tmp
&= ~EOP_SIZE_MASK
;
4586 tmp
|= order_base_2(MEC_HPD_SIZE
/ 8);
4587 WREG32(CP_HPD_EOP_CONTROL
, tmp
);
4590 cik_srbm_select(rdev
, 0, 0, 0, 0);
4591 mutex_unlock(&rdev
->srbm_mutex
);
4593 /* init the queues. Just two for now. */
4594 for (i
= 0; i
< 2; i
++) {
4596 idx
= CAYMAN_RING_TYPE_CP1_INDEX
;
4598 idx
= CAYMAN_RING_TYPE_CP2_INDEX
;
4600 if (rdev
->ring
[idx
].mqd_obj
== NULL
) {
4601 r
= radeon_bo_create(rdev
,
4602 sizeof(struct bonaire_mqd
),
4604 RADEON_GEM_DOMAIN_GTT
, 0, NULL
,
4605 NULL
, &rdev
->ring
[idx
].mqd_obj
);
4607 dev_warn(rdev
->dev
, "(%d) create MQD bo failed\n", r
);
4612 r
= radeon_bo_reserve(rdev
->ring
[idx
].mqd_obj
, false);
4613 if (unlikely(r
!= 0)) {
4614 cik_cp_compute_fini(rdev
);
4617 r
= radeon_bo_pin(rdev
->ring
[idx
].mqd_obj
, RADEON_GEM_DOMAIN_GTT
,
4620 dev_warn(rdev
->dev
, "(%d) pin MQD bo failed\n", r
);
4621 cik_cp_compute_fini(rdev
);
4624 r
= radeon_bo_kmap(rdev
->ring
[idx
].mqd_obj
, (void **)&buf
);
4626 dev_warn(rdev
->dev
, "(%d) map MQD bo failed\n", r
);
4627 cik_cp_compute_fini(rdev
);
4631 /* init the mqd struct */
4632 memset(buf
, 0, sizeof(struct bonaire_mqd
));
4634 mqd
= (struct bonaire_mqd
*)buf
;
4635 mqd
->header
= 0xC0310800;
4636 mqd
->static_thread_mgmt01
[0] = 0xffffffff;
4637 mqd
->static_thread_mgmt01
[1] = 0xffffffff;
4638 mqd
->static_thread_mgmt23
[0] = 0xffffffff;
4639 mqd
->static_thread_mgmt23
[1] = 0xffffffff;
4641 mutex_lock(&rdev
->srbm_mutex
);
4642 cik_srbm_select(rdev
, rdev
->ring
[idx
].me
,
4643 rdev
->ring
[idx
].pipe
,
4644 rdev
->ring
[idx
].queue
, 0);
4646 /* disable wptr polling */
4647 tmp
= RREG32(CP_PQ_WPTR_POLL_CNTL
);
4648 tmp
&= ~WPTR_POLL_EN
;
4649 WREG32(CP_PQ_WPTR_POLL_CNTL
, tmp
);
4651 /* enable doorbell? */
4652 mqd
->queue_state
.cp_hqd_pq_doorbell_control
=
4653 RREG32(CP_HQD_PQ_DOORBELL_CONTROL
);
4655 mqd
->queue_state
.cp_hqd_pq_doorbell_control
|= DOORBELL_EN
;
4657 mqd
->queue_state
.cp_hqd_pq_doorbell_control
&= ~DOORBELL_EN
;
4658 WREG32(CP_HQD_PQ_DOORBELL_CONTROL
,
4659 mqd
->queue_state
.cp_hqd_pq_doorbell_control
);
4661 /* disable the queue if it's active */
4662 mqd
->queue_state
.cp_hqd_dequeue_request
= 0;
4663 mqd
->queue_state
.cp_hqd_pq_rptr
= 0;
4664 mqd
->queue_state
.cp_hqd_pq_wptr
= 0;
4665 if (RREG32(CP_HQD_ACTIVE
) & 1) {
4666 WREG32(CP_HQD_DEQUEUE_REQUEST
, 1);
4667 for (j
= 0; j
< rdev
->usec_timeout
; j
++) {
4668 if (!(RREG32(CP_HQD_ACTIVE
) & 1))
4672 WREG32(CP_HQD_DEQUEUE_REQUEST
, mqd
->queue_state
.cp_hqd_dequeue_request
);
4673 WREG32(CP_HQD_PQ_RPTR
, mqd
->queue_state
.cp_hqd_pq_rptr
);
4674 WREG32(CP_HQD_PQ_WPTR
, mqd
->queue_state
.cp_hqd_pq_wptr
);
4677 /* set the pointer to the MQD */
4678 mqd
->queue_state
.cp_mqd_base_addr
= mqd_gpu_addr
& 0xfffffffc;
4679 mqd
->queue_state
.cp_mqd_base_addr_hi
= upper_32_bits(mqd_gpu_addr
);
4680 WREG32(CP_MQD_BASE_ADDR
, mqd
->queue_state
.cp_mqd_base_addr
);
4681 WREG32(CP_MQD_BASE_ADDR_HI
, mqd
->queue_state
.cp_mqd_base_addr_hi
);
4682 /* set MQD vmid to 0 */
4683 mqd
->queue_state
.cp_mqd_control
= RREG32(CP_MQD_CONTROL
);
4684 mqd
->queue_state
.cp_mqd_control
&= ~MQD_VMID_MASK
;
4685 WREG32(CP_MQD_CONTROL
, mqd
->queue_state
.cp_mqd_control
);
4687 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4688 hqd_gpu_addr
= rdev
->ring
[idx
].gpu_addr
>> 8;
4689 mqd
->queue_state
.cp_hqd_pq_base
= hqd_gpu_addr
;
4690 mqd
->queue_state
.cp_hqd_pq_base_hi
= upper_32_bits(hqd_gpu_addr
);
4691 WREG32(CP_HQD_PQ_BASE
, mqd
->queue_state
.cp_hqd_pq_base
);
4692 WREG32(CP_HQD_PQ_BASE_HI
, mqd
->queue_state
.cp_hqd_pq_base_hi
);
4694 /* set up the HQD, this is similar to CP_RB0_CNTL */
4695 mqd
->queue_state
.cp_hqd_pq_control
= RREG32(CP_HQD_PQ_CONTROL
);
4696 mqd
->queue_state
.cp_hqd_pq_control
&=
4697 ~(QUEUE_SIZE_MASK
| RPTR_BLOCK_SIZE_MASK
);
4699 mqd
->queue_state
.cp_hqd_pq_control
|=
4700 order_base_2(rdev
->ring
[idx
].ring_size
/ 8);
4701 mqd
->queue_state
.cp_hqd_pq_control
|=
4702 (order_base_2(RADEON_GPU_PAGE_SIZE
/8) << 8);
4704 mqd
->queue_state
.cp_hqd_pq_control
|= BUF_SWAP_32BIT
;
4706 mqd
->queue_state
.cp_hqd_pq_control
&=
4707 ~(UNORD_DISPATCH
| ROQ_PQ_IB_FLIP
| PQ_VOLATILE
);
4708 mqd
->queue_state
.cp_hqd_pq_control
|=
4709 PRIV_STATE
| KMD_QUEUE
; /* assuming kernel queue control */
4710 WREG32(CP_HQD_PQ_CONTROL
, mqd
->queue_state
.cp_hqd_pq_control
);
4712 /* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4714 wb_gpu_addr
= rdev
->wb
.gpu_addr
+ CIK_WB_CP1_WPTR_OFFSET
;
4716 wb_gpu_addr
= rdev
->wb
.gpu_addr
+ CIK_WB_CP2_WPTR_OFFSET
;
4717 mqd
->queue_state
.cp_hqd_pq_wptr_poll_addr
= wb_gpu_addr
& 0xfffffffc;
4718 mqd
->queue_state
.cp_hqd_pq_wptr_poll_addr_hi
= upper_32_bits(wb_gpu_addr
) & 0xffff;
4719 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR
, mqd
->queue_state
.cp_hqd_pq_wptr_poll_addr
);
4720 WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI
,
4721 mqd
->queue_state
.cp_hqd_pq_wptr_poll_addr_hi
);
4723 /* set the wb address wether it's enabled or not */
4725 wb_gpu_addr
= rdev
->wb
.gpu_addr
+ RADEON_WB_CP1_RPTR_OFFSET
;
4727 wb_gpu_addr
= rdev
->wb
.gpu_addr
+ RADEON_WB_CP2_RPTR_OFFSET
;
4728 mqd
->queue_state
.cp_hqd_pq_rptr_report_addr
= wb_gpu_addr
& 0xfffffffc;
4729 mqd
->queue_state
.cp_hqd_pq_rptr_report_addr_hi
=
4730 upper_32_bits(wb_gpu_addr
) & 0xffff;
4731 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR
,
4732 mqd
->queue_state
.cp_hqd_pq_rptr_report_addr
);
4733 WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI
,
4734 mqd
->queue_state
.cp_hqd_pq_rptr_report_addr_hi
);
4736 /* enable the doorbell if requested */
4738 mqd
->queue_state
.cp_hqd_pq_doorbell_control
=
4739 RREG32(CP_HQD_PQ_DOORBELL_CONTROL
);
4740 mqd
->queue_state
.cp_hqd_pq_doorbell_control
&= ~DOORBELL_OFFSET_MASK
;
4741 mqd
->queue_state
.cp_hqd_pq_doorbell_control
|=
4742 DOORBELL_OFFSET(rdev
->ring
[idx
].doorbell_index
);
4743 mqd
->queue_state
.cp_hqd_pq_doorbell_control
|= DOORBELL_EN
;
4744 mqd
->queue_state
.cp_hqd_pq_doorbell_control
&=
4745 ~(DOORBELL_SOURCE
| DOORBELL_HIT
);
4748 mqd
->queue_state
.cp_hqd_pq_doorbell_control
= 0;
4750 WREG32(CP_HQD_PQ_DOORBELL_CONTROL
,
4751 mqd
->queue_state
.cp_hqd_pq_doorbell_control
);
4753 /* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
4754 rdev
->ring
[idx
].wptr
= 0;
4755 mqd
->queue_state
.cp_hqd_pq_wptr
= rdev
->ring
[idx
].wptr
;
4756 WREG32(CP_HQD_PQ_WPTR
, mqd
->queue_state
.cp_hqd_pq_wptr
);
4757 mqd
->queue_state
.cp_hqd_pq_rptr
= RREG32(CP_HQD_PQ_RPTR
);
4759 /* set the vmid for the queue */
4760 mqd
->queue_state
.cp_hqd_vmid
= 0;
4761 WREG32(CP_HQD_VMID
, mqd
->queue_state
.cp_hqd_vmid
);
4763 /* activate the queue */
4764 mqd
->queue_state
.cp_hqd_active
= 1;
4765 WREG32(CP_HQD_ACTIVE
, mqd
->queue_state
.cp_hqd_active
);
4767 cik_srbm_select(rdev
, 0, 0, 0, 0);
4768 mutex_unlock(&rdev
->srbm_mutex
);
4770 radeon_bo_kunmap(rdev
->ring
[idx
].mqd_obj
);
4771 radeon_bo_unreserve(rdev
->ring
[idx
].mqd_obj
);
4773 rdev
->ring
[idx
].ready
= true;
4774 r
= radeon_ring_test(rdev
, idx
, &rdev
->ring
[idx
]);
4776 rdev
->ring
[idx
].ready
= false;
4782 static void cik_cp_enable(struct radeon_device
*rdev
, bool enable
)
4784 cik_cp_gfx_enable(rdev
, enable
);
4785 cik_cp_compute_enable(rdev
, enable
);
4788 static int cik_cp_load_microcode(struct radeon_device
*rdev
)
4792 r
= cik_cp_gfx_load_microcode(rdev
);
4795 r
= cik_cp_compute_load_microcode(rdev
);
4802 static void cik_cp_fini(struct radeon_device
*rdev
)
4804 cik_cp_gfx_fini(rdev
);
4805 cik_cp_compute_fini(rdev
);
4808 static int cik_cp_resume(struct radeon_device
*rdev
)
4812 cik_enable_gui_idle_interrupt(rdev
, false);
4814 r
= cik_cp_load_microcode(rdev
);
4818 r
= cik_cp_gfx_resume(rdev
);
4821 r
= cik_cp_compute_resume(rdev
);
4825 cik_enable_gui_idle_interrupt(rdev
, true);
4830 static void cik_print_gpu_status_regs(struct radeon_device
*rdev
)
4832 dev_info(rdev
->dev
, " GRBM_STATUS=0x%08X\n",
4833 RREG32(GRBM_STATUS
));
4834 dev_info(rdev
->dev
, " GRBM_STATUS2=0x%08X\n",
4835 RREG32(GRBM_STATUS2
));
4836 dev_info(rdev
->dev
, " GRBM_STATUS_SE0=0x%08X\n",
4837 RREG32(GRBM_STATUS_SE0
));
4838 dev_info(rdev
->dev
, " GRBM_STATUS_SE1=0x%08X\n",
4839 RREG32(GRBM_STATUS_SE1
));
4840 dev_info(rdev
->dev
, " GRBM_STATUS_SE2=0x%08X\n",
4841 RREG32(GRBM_STATUS_SE2
));
4842 dev_info(rdev
->dev
, " GRBM_STATUS_SE3=0x%08X\n",
4843 RREG32(GRBM_STATUS_SE3
));
4844 dev_info(rdev
->dev
, " SRBM_STATUS=0x%08X\n",
4845 RREG32(SRBM_STATUS
));
4846 dev_info(rdev
->dev
, " SRBM_STATUS2=0x%08X\n",
4847 RREG32(SRBM_STATUS2
));
4848 dev_info(rdev
->dev
, " SDMA0_STATUS_REG = 0x%08X\n",
4849 RREG32(SDMA0_STATUS_REG
+ SDMA0_REGISTER_OFFSET
));
4850 dev_info(rdev
->dev
, " SDMA1_STATUS_REG = 0x%08X\n",
4851 RREG32(SDMA0_STATUS_REG
+ SDMA1_REGISTER_OFFSET
));
4852 dev_info(rdev
->dev
, " CP_STAT = 0x%08x\n", RREG32(CP_STAT
));
4853 dev_info(rdev
->dev
, " CP_STALLED_STAT1 = 0x%08x\n",
4854 RREG32(CP_STALLED_STAT1
));
4855 dev_info(rdev
->dev
, " CP_STALLED_STAT2 = 0x%08x\n",
4856 RREG32(CP_STALLED_STAT2
));
4857 dev_info(rdev
->dev
, " CP_STALLED_STAT3 = 0x%08x\n",
4858 RREG32(CP_STALLED_STAT3
));
4859 dev_info(rdev
->dev
, " CP_CPF_BUSY_STAT = 0x%08x\n",
4860 RREG32(CP_CPF_BUSY_STAT
));
4861 dev_info(rdev
->dev
, " CP_CPF_STALLED_STAT1 = 0x%08x\n",
4862 RREG32(CP_CPF_STALLED_STAT1
));
4863 dev_info(rdev
->dev
, " CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS
));
4864 dev_info(rdev
->dev
, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT
));
4865 dev_info(rdev
->dev
, " CP_CPC_STALLED_STAT1 = 0x%08x\n",
4866 RREG32(CP_CPC_STALLED_STAT1
));
4867 dev_info(rdev
->dev
, " CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS
));
4871 * cik_gpu_check_soft_reset - check which blocks are busy
4873 * @rdev: radeon_device pointer
4875 * Check which blocks are busy and return the relevant reset
4876 * mask to be used by cik_gpu_soft_reset().
4877 * Returns a mask of the blocks to be reset.
4879 u32
cik_gpu_check_soft_reset(struct radeon_device
*rdev
)
4885 tmp
= RREG32(GRBM_STATUS
);
4886 if (tmp
& (PA_BUSY
| SC_BUSY
|
4887 BCI_BUSY
| SX_BUSY
|
4888 TA_BUSY
| VGT_BUSY
|
4890 GDS_BUSY
| SPI_BUSY
|
4891 IA_BUSY
| IA_BUSY_NO_DMA
))
4892 reset_mask
|= RADEON_RESET_GFX
;
4894 if (tmp
& (CP_BUSY
| CP_COHERENCY_BUSY
))
4895 reset_mask
|= RADEON_RESET_CP
;
4898 tmp
= RREG32(GRBM_STATUS2
);
4900 reset_mask
|= RADEON_RESET_RLC
;
4902 /* SDMA0_STATUS_REG */
4903 tmp
= RREG32(SDMA0_STATUS_REG
+ SDMA0_REGISTER_OFFSET
);
4904 if (!(tmp
& SDMA_IDLE
))
4905 reset_mask
|= RADEON_RESET_DMA
;
4907 /* SDMA1_STATUS_REG */
4908 tmp
= RREG32(SDMA0_STATUS_REG
+ SDMA1_REGISTER_OFFSET
);
4909 if (!(tmp
& SDMA_IDLE
))
4910 reset_mask
|= RADEON_RESET_DMA1
;
4913 tmp
= RREG32(SRBM_STATUS2
);
4914 if (tmp
& SDMA_BUSY
)
4915 reset_mask
|= RADEON_RESET_DMA
;
4917 if (tmp
& SDMA1_BUSY
)
4918 reset_mask
|= RADEON_RESET_DMA1
;
4921 tmp
= RREG32(SRBM_STATUS
);
4924 reset_mask
|= RADEON_RESET_IH
;
4927 reset_mask
|= RADEON_RESET_SEM
;
4929 if (tmp
& GRBM_RQ_PENDING
)
4930 reset_mask
|= RADEON_RESET_GRBM
;
4933 reset_mask
|= RADEON_RESET_VMC
;
4935 if (tmp
& (MCB_BUSY
| MCB_NON_DISPLAY_BUSY
|
4936 MCC_BUSY
| MCD_BUSY
))
4937 reset_mask
|= RADEON_RESET_MC
;
4939 if (evergreen_is_display_hung(rdev
))
4940 reset_mask
|= RADEON_RESET_DISPLAY
;
4942 /* Skip MC reset as it's mostly likely not hung, just busy */
4943 if (reset_mask
& RADEON_RESET_MC
) {
4944 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask
);
4945 reset_mask
&= ~RADEON_RESET_MC
;
4952 * cik_gpu_soft_reset - soft reset GPU
4954 * @rdev: radeon_device pointer
4955 * @reset_mask: mask of which blocks to reset
4957 * Soft reset the blocks specified in @reset_mask.
4959 static void cik_gpu_soft_reset(struct radeon_device
*rdev
, u32 reset_mask
)
4961 struct evergreen_mc_save save
;
4962 u32 grbm_soft_reset
= 0, srbm_soft_reset
= 0;
4965 if (reset_mask
== 0)
4968 dev_info(rdev
->dev
, "GPU softreset: 0x%08X\n", reset_mask
);
4970 cik_print_gpu_status_regs(rdev
);
4971 dev_info(rdev
->dev
, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
4972 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR
));
4973 dev_info(rdev
->dev
, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4974 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS
));
4983 /* Disable GFX parsing/prefetching */
4984 WREG32(CP_ME_CNTL
, CP_ME_HALT
| CP_PFP_HALT
| CP_CE_HALT
);
4986 /* Disable MEC parsing/prefetching */
4987 WREG32(CP_MEC_CNTL
, MEC_ME1_HALT
| MEC_ME2_HALT
);
4989 if (reset_mask
& RADEON_RESET_DMA
) {
4991 tmp
= RREG32(SDMA0_ME_CNTL
+ SDMA0_REGISTER_OFFSET
);
4993 WREG32(SDMA0_ME_CNTL
+ SDMA0_REGISTER_OFFSET
, tmp
);
4995 if (reset_mask
& RADEON_RESET_DMA1
) {
4997 tmp
= RREG32(SDMA0_ME_CNTL
+ SDMA1_REGISTER_OFFSET
);
4999 WREG32(SDMA0_ME_CNTL
+ SDMA1_REGISTER_OFFSET
, tmp
);
5002 evergreen_mc_stop(rdev
, &save
);
5003 if (evergreen_mc_wait_for_idle(rdev
)) {
5004 dev_warn(rdev
->dev
, "Wait for MC idle timedout !\n");
5007 if (reset_mask
& (RADEON_RESET_GFX
| RADEON_RESET_COMPUTE
| RADEON_RESET_CP
))
5008 grbm_soft_reset
= SOFT_RESET_CP
| SOFT_RESET_GFX
;
5010 if (reset_mask
& RADEON_RESET_CP
) {
5011 grbm_soft_reset
|= SOFT_RESET_CP
;
5013 srbm_soft_reset
|= SOFT_RESET_GRBM
;
5016 if (reset_mask
& RADEON_RESET_DMA
)
5017 srbm_soft_reset
|= SOFT_RESET_SDMA
;
5019 if (reset_mask
& RADEON_RESET_DMA1
)
5020 srbm_soft_reset
|= SOFT_RESET_SDMA1
;
5022 if (reset_mask
& RADEON_RESET_DISPLAY
)
5023 srbm_soft_reset
|= SOFT_RESET_DC
;
5025 if (reset_mask
& RADEON_RESET_RLC
)
5026 grbm_soft_reset
|= SOFT_RESET_RLC
;
5028 if (reset_mask
& RADEON_RESET_SEM
)
5029 srbm_soft_reset
|= SOFT_RESET_SEM
;
5031 if (reset_mask
& RADEON_RESET_IH
)
5032 srbm_soft_reset
|= SOFT_RESET_IH
;
5034 if (reset_mask
& RADEON_RESET_GRBM
)
5035 srbm_soft_reset
|= SOFT_RESET_GRBM
;
5037 if (reset_mask
& RADEON_RESET_VMC
)
5038 srbm_soft_reset
|= SOFT_RESET_VMC
;
5040 if (!(rdev
->flags
& RADEON_IS_IGP
)) {
5041 if (reset_mask
& RADEON_RESET_MC
)
5042 srbm_soft_reset
|= SOFT_RESET_MC
;
5045 if (grbm_soft_reset
) {
5046 tmp
= RREG32(GRBM_SOFT_RESET
);
5047 tmp
|= grbm_soft_reset
;
5048 dev_info(rdev
->dev
, "GRBM_SOFT_RESET=0x%08X\n", tmp
);
5049 WREG32(GRBM_SOFT_RESET
, tmp
);
5050 tmp
= RREG32(GRBM_SOFT_RESET
);
5054 tmp
&= ~grbm_soft_reset
;
5055 WREG32(GRBM_SOFT_RESET
, tmp
);
5056 tmp
= RREG32(GRBM_SOFT_RESET
);
5059 if (srbm_soft_reset
) {
5060 tmp
= RREG32(SRBM_SOFT_RESET
);
5061 tmp
|= srbm_soft_reset
;
5062 dev_info(rdev
->dev
, "SRBM_SOFT_RESET=0x%08X\n", tmp
);
5063 WREG32(SRBM_SOFT_RESET
, tmp
);
5064 tmp
= RREG32(SRBM_SOFT_RESET
);
5068 tmp
&= ~srbm_soft_reset
;
5069 WREG32(SRBM_SOFT_RESET
, tmp
);
5070 tmp
= RREG32(SRBM_SOFT_RESET
);
5073 /* Wait a little for things to settle down */
5076 evergreen_mc_resume(rdev
, &save
);
5079 cik_print_gpu_status_regs(rdev
);
5082 struct kv_reset_save_regs
{
5083 u32 gmcon_reng_execute
;
5088 static void kv_save_regs_for_reset(struct radeon_device
*rdev
,
5089 struct kv_reset_save_regs
*save
)
5091 save
->gmcon_reng_execute
= RREG32(GMCON_RENG_EXECUTE
);
5092 save
->gmcon_misc
= RREG32(GMCON_MISC
);
5093 save
->gmcon_misc3
= RREG32(GMCON_MISC3
);
5095 WREG32(GMCON_RENG_EXECUTE
, save
->gmcon_reng_execute
& ~RENG_EXECUTE_ON_PWR_UP
);
5096 WREG32(GMCON_MISC
, save
->gmcon_misc
& ~(RENG_EXECUTE_ON_REG_UPDATE
|
5097 STCTRL_STUTTER_EN
));
5100 static void kv_restore_regs_for_reset(struct radeon_device
*rdev
,
5101 struct kv_reset_save_regs
*save
)
5105 WREG32(GMCON_PGFSM_WRITE
, 0);
5106 WREG32(GMCON_PGFSM_CONFIG
, 0x200010ff);
5108 for (i
= 0; i
< 5; i
++)
5109 WREG32(GMCON_PGFSM_WRITE
, 0);
5111 WREG32(GMCON_PGFSM_WRITE
, 0);
5112 WREG32(GMCON_PGFSM_CONFIG
, 0x300010ff);
5114 for (i
= 0; i
< 5; i
++)
5115 WREG32(GMCON_PGFSM_WRITE
, 0);
5117 WREG32(GMCON_PGFSM_WRITE
, 0x210000);
5118 WREG32(GMCON_PGFSM_CONFIG
, 0xa00010ff);
5120 for (i
= 0; i
< 5; i
++)
5121 WREG32(GMCON_PGFSM_WRITE
, 0);
5123 WREG32(GMCON_PGFSM_WRITE
, 0x21003);
5124 WREG32(GMCON_PGFSM_CONFIG
, 0xb00010ff);
5126 for (i
= 0; i
< 5; i
++)
5127 WREG32(GMCON_PGFSM_WRITE
, 0);
5129 WREG32(GMCON_PGFSM_WRITE
, 0x2b00);
5130 WREG32(GMCON_PGFSM_CONFIG
, 0xc00010ff);
5132 for (i
= 0; i
< 5; i
++)
5133 WREG32(GMCON_PGFSM_WRITE
, 0);
5135 WREG32(GMCON_PGFSM_WRITE
, 0);
5136 WREG32(GMCON_PGFSM_CONFIG
, 0xd00010ff);
5138 for (i
= 0; i
< 5; i
++)
5139 WREG32(GMCON_PGFSM_WRITE
, 0);
5141 WREG32(GMCON_PGFSM_WRITE
, 0x420000);
5142 WREG32(GMCON_PGFSM_CONFIG
, 0x100010ff);
5144 for (i
= 0; i
< 5; i
++)
5145 WREG32(GMCON_PGFSM_WRITE
, 0);
5147 WREG32(GMCON_PGFSM_WRITE
, 0x120202);
5148 WREG32(GMCON_PGFSM_CONFIG
, 0x500010ff);
5150 for (i
= 0; i
< 5; i
++)
5151 WREG32(GMCON_PGFSM_WRITE
, 0);
5153 WREG32(GMCON_PGFSM_WRITE
, 0x3e3e36);
5154 WREG32(GMCON_PGFSM_CONFIG
, 0x600010ff);
5156 for (i
= 0; i
< 5; i
++)
5157 WREG32(GMCON_PGFSM_WRITE
, 0);
5159 WREG32(GMCON_PGFSM_WRITE
, 0x373f3e);
5160 WREG32(GMCON_PGFSM_CONFIG
, 0x700010ff);
5162 for (i
= 0; i
< 5; i
++)
5163 WREG32(GMCON_PGFSM_WRITE
, 0);
5165 WREG32(GMCON_PGFSM_WRITE
, 0x3e1332);
5166 WREG32(GMCON_PGFSM_CONFIG
, 0xe00010ff);
5168 WREG32(GMCON_MISC3
, save
->gmcon_misc3
);
5169 WREG32(GMCON_MISC
, save
->gmcon_misc
);
5170 WREG32(GMCON_RENG_EXECUTE
, save
->gmcon_reng_execute
);
5173 static void cik_gpu_pci_config_reset(struct radeon_device
*rdev
)
5175 struct evergreen_mc_save save
;
5176 struct kv_reset_save_regs kv_save
= { 0 };
5179 dev_info(rdev
->dev
, "GPU pci config reset\n");
5187 /* Disable GFX parsing/prefetching */
5188 WREG32(CP_ME_CNTL
, CP_ME_HALT
| CP_PFP_HALT
| CP_CE_HALT
);
5190 /* Disable MEC parsing/prefetching */
5191 WREG32(CP_MEC_CNTL
, MEC_ME1_HALT
| MEC_ME2_HALT
);
5194 tmp
= RREG32(SDMA0_ME_CNTL
+ SDMA0_REGISTER_OFFSET
);
5196 WREG32(SDMA0_ME_CNTL
+ SDMA0_REGISTER_OFFSET
, tmp
);
5198 tmp
= RREG32(SDMA0_ME_CNTL
+ SDMA1_REGISTER_OFFSET
);
5200 WREG32(SDMA0_ME_CNTL
+ SDMA1_REGISTER_OFFSET
, tmp
);
5201 /* XXX other engines? */
5203 /* halt the rlc, disable cp internal ints */
5208 /* disable mem access */
5209 evergreen_mc_stop(rdev
, &save
);
5210 if (evergreen_mc_wait_for_idle(rdev
)) {
5211 dev_warn(rdev
->dev
, "Wait for MC idle timed out !\n");
5214 if (rdev
->flags
& RADEON_IS_IGP
)
5215 kv_save_regs_for_reset(rdev
, &kv_save
);
5218 pci_clear_master(rdev
->pdev
);
5220 radeon_pci_config_reset(rdev
);
5224 /* wait for asic to come out of reset */
5225 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
5226 if (RREG32(CONFIG_MEMSIZE
) != 0xffffffff)
5231 /* does asic init need to be run first??? */
5232 if (rdev
->flags
& RADEON_IS_IGP
)
5233 kv_restore_regs_for_reset(rdev
, &kv_save
);
5237 * cik_asic_reset - soft reset GPU
5239 * @rdev: radeon_device pointer
5240 * @hard: force hard reset
5242 * Look up which blocks are hung and attempt
5244 * Returns 0 for success.
5246 int cik_asic_reset(struct radeon_device
*rdev
, bool hard
)
5251 cik_gpu_pci_config_reset(rdev
);
5255 reset_mask
= cik_gpu_check_soft_reset(rdev
);
5258 r600_set_bios_scratch_engine_hung(rdev
, true);
5260 /* try soft reset */
5261 cik_gpu_soft_reset(rdev
, reset_mask
);
5263 reset_mask
= cik_gpu_check_soft_reset(rdev
);
5265 /* try pci config reset */
5266 if (reset_mask
&& radeon_hard_reset
)
5267 cik_gpu_pci_config_reset(rdev
);
5269 reset_mask
= cik_gpu_check_soft_reset(rdev
);
5272 r600_set_bios_scratch_engine_hung(rdev
, false);
5278 * cik_gfx_is_lockup - check if the 3D engine is locked up
5280 * @rdev: radeon_device pointer
5281 * @ring: radeon_ring structure holding ring information
5283 * Check if the 3D engine is locked up (CIK).
5284 * Returns true if the engine is locked, false if not.
5286 bool cik_gfx_is_lockup(struct radeon_device
*rdev
, struct radeon_ring
*ring
)
5288 u32 reset_mask
= cik_gpu_check_soft_reset(rdev
);
5290 if (!(reset_mask
& (RADEON_RESET_GFX
|
5291 RADEON_RESET_COMPUTE
|
5292 RADEON_RESET_CP
))) {
5293 radeon_ring_lockup_update(rdev
, ring
);
5296 return radeon_ring_test_lockup(rdev
, ring
);
5301 * cik_mc_program - program the GPU memory controller
5303 * @rdev: radeon_device pointer
5305 * Set the location of vram, gart, and AGP in the GPU's
5306 * physical address space (CIK).
5308 static void cik_mc_program(struct radeon_device
*rdev
)
5310 struct evergreen_mc_save save
;
5314 /* Initialize HDP */
5315 for (i
= 0, j
= 0; i
< 32; i
++, j
+= 0x18) {
5316 WREG32((0x2c14 + j
), 0x00000000);
5317 WREG32((0x2c18 + j
), 0x00000000);
5318 WREG32((0x2c1c + j
), 0x00000000);
5319 WREG32((0x2c20 + j
), 0x00000000);
5320 WREG32((0x2c24 + j
), 0x00000000);
5322 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL
, 0);
5324 evergreen_mc_stop(rdev
, &save
);
5325 if (radeon_mc_wait_for_idle(rdev
)) {
5326 dev_warn(rdev
->dev
, "Wait for MC idle timedout !\n");
5328 /* Lockout access through VGA aperture*/
5329 WREG32(VGA_HDP_CONTROL
, VGA_MEMORY_DISABLE
);
5330 /* Update configuration */
5331 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR
,
5332 rdev
->mc
.vram_start
>> 12);
5333 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR
,
5334 rdev
->mc
.vram_end
>> 12);
5335 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR
,
5336 rdev
->vram_scratch
.gpu_addr
>> 12);
5337 tmp
= ((rdev
->mc
.vram_end
>> 24) & 0xFFFF) << 16;
5338 tmp
|= ((rdev
->mc
.vram_start
>> 24) & 0xFFFF);
5339 WREG32(MC_VM_FB_LOCATION
, tmp
);
5340 /* XXX double check these! */
5341 WREG32(HDP_NONSURFACE_BASE
, (rdev
->mc
.vram_start
>> 8));
5342 WREG32(HDP_NONSURFACE_INFO
, (2 << 7) | (1 << 30));
5343 WREG32(HDP_NONSURFACE_SIZE
, 0x3FFFFFFF);
5344 WREG32(MC_VM_AGP_BASE
, 0);
5345 WREG32(MC_VM_AGP_TOP
, 0x0FFFFFFF);
5346 WREG32(MC_VM_AGP_BOT
, 0x0FFFFFFF);
5347 if (radeon_mc_wait_for_idle(rdev
)) {
5348 dev_warn(rdev
->dev
, "Wait for MC idle timedout !\n");
5350 evergreen_mc_resume(rdev
, &save
);
5351 /* we need to own VRAM, so turn off the VGA renderer here
5352 * to stop it overwriting our objects */
5353 rv515_vga_render_disable(rdev
);
5357 * cik_mc_init - initialize the memory controller driver params
5359 * @rdev: radeon_device pointer
5361 * Look up the amount of vram, vram width, and decide how to place
5362 * vram and gart within the GPU's physical address space (CIK).
5363 * Returns 0 for success.
5365 static int cik_mc_init(struct radeon_device
*rdev
)
5368 int chansize
, numchan
;
5370 /* Get VRAM informations */
5371 rdev
->mc
.vram_is_ddr
= true;
5372 tmp
= RREG32(MC_ARB_RAMCFG
);
5373 if (tmp
& CHANSIZE_MASK
) {
5378 tmp
= RREG32(MC_SHARED_CHMAP
);
5379 switch ((tmp
& NOOFCHAN_MASK
) >> NOOFCHAN_SHIFT
) {
5409 rdev
->mc
.vram_width
= numchan
* chansize
;
5410 /* Could aper size report 0 ? */
5411 rdev
->mc
.aper_base
= pci_resource_start(rdev
->pdev
, 0);
5412 rdev
->mc
.aper_size
= pci_resource_len(rdev
->pdev
, 0);
5413 /* size in MB on si */
5414 rdev
->mc
.mc_vram_size
= RREG32(CONFIG_MEMSIZE
) * 1024ULL * 1024ULL;
5415 rdev
->mc
.real_vram_size
= RREG32(CONFIG_MEMSIZE
) * 1024ULL * 1024ULL;
5416 rdev
->mc
.visible_vram_size
= rdev
->mc
.aper_size
;
5417 si_vram_gtt_location(rdev
, &rdev
->mc
);
5418 radeon_update_bandwidth_info(rdev
);
5425 * VMID 0 is the physical GPU addresses as used by the kernel.
5426 * VMIDs 1-15 are used for userspace clients and are handled
5427 * by the radeon vm/hsa code.
5430 * cik_pcie_gart_tlb_flush - gart tlb flush callback
5432 * @rdev: radeon_device pointer
5434 * Flush the TLB for the VMID 0 page table (CIK).
5436 void cik_pcie_gart_tlb_flush(struct radeon_device
*rdev
)
5438 /* flush hdp cache */
5439 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL
, 0);
5441 /* bits 0-15 are the VM contexts0-15 */
5442 WREG32(VM_INVALIDATE_REQUEST
, 0x1);
5446 * cik_pcie_gart_enable - gart enable
5448 * @rdev: radeon_device pointer
5450 * This sets up the TLBs, programs the page tables for VMID0,
5451 * sets up the hw for VMIDs 1-15 which are allocated on
5452 * demand, and sets up the global locations for the LDS, GDS,
5453 * and GPUVM for FSA64 clients (CIK).
5454 * Returns 0 for success, errors for failure.
5456 static int cik_pcie_gart_enable(struct radeon_device
*rdev
)
5460 if (rdev
->gart
.robj
== NULL
) {
5461 dev_err(rdev
->dev
, "No VRAM object for PCIE GART.\n");
5464 r
= radeon_gart_table_vram_pin(rdev
);
5467 /* Setup TLB control */
5468 WREG32(MC_VM_MX_L1_TLB_CNTL
,
5471 ENABLE_L1_FRAGMENT_PROCESSING
|
5472 SYSTEM_ACCESS_MODE_NOT_IN_SYS
|
5473 ENABLE_ADVANCED_DRIVER_MODEL
|
5474 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU
);
5475 /* Setup L2 cache */
5476 WREG32(VM_L2_CNTL
, ENABLE_L2_CACHE
|
5477 ENABLE_L2_FRAGMENT_PROCESSING
|
5478 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE
|
5479 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE
|
5480 EFFECTIVE_L2_QUEUE_SIZE(7) |
5481 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5482 WREG32(VM_L2_CNTL2
, INVALIDATE_ALL_L1_TLBS
| INVALIDATE_L2_CACHE
);
5483 WREG32(VM_L2_CNTL3
, L2_CACHE_BIGK_ASSOCIATIVITY
|
5485 L2_CACHE_BIGK_FRAGMENT_SIZE(4));
5486 /* setup context0 */
5487 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR
, rdev
->mc
.gtt_start
>> 12);
5488 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR
, rdev
->mc
.gtt_end
>> 12);
5489 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR
, rdev
->gart
.table_addr
>> 12);
5490 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR
,
5491 (u32
)(rdev
->dummy_page
.addr
>> 12));
5492 WREG32(VM_CONTEXT0_CNTL2
, 0);
5493 WREG32(VM_CONTEXT0_CNTL
, (ENABLE_CONTEXT
| PAGE_TABLE_DEPTH(0) |
5494 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT
));
5500 /* restore context1-15 */
5501 /* set vm size, must be a multiple of 4 */
5502 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR
, 0);
5503 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR
, rdev
->vm_manager
.max_pfn
- 1);
5504 for (i
= 1; i
< 16; i
++) {
5506 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR
+ (i
<< 2),
5507 rdev
->vm_manager
.saved_table_addr
[i
]);
5509 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR
+ ((i
- 8) << 2),
5510 rdev
->vm_manager
.saved_table_addr
[i
]);
5513 /* enable context1-15 */
5514 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR
,
5515 (u32
)(rdev
->dummy_page
.addr
>> 12));
5516 WREG32(VM_CONTEXT1_CNTL2
, 4);
5517 WREG32(VM_CONTEXT1_CNTL
, ENABLE_CONTEXT
| PAGE_TABLE_DEPTH(1) |
5518 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size
- 9) |
5519 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5520 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT
|
5521 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5522 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT
|
5523 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5524 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT
|
5525 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5526 VALID_PROTECTION_FAULT_ENABLE_DEFAULT
|
5527 READ_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5528 READ_PROTECTION_FAULT_ENABLE_DEFAULT
|
5529 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT
|
5530 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT
);
5532 if (rdev
->family
== CHIP_KAVERI
) {
5533 u32 tmp
= RREG32(CHUB_CONTROL
);
5535 WREG32(CHUB_CONTROL
, tmp
);
5538 /* XXX SH_MEM regs */
5539 /* where to put LDS, scratch, GPUVM in FSA64 space */
5540 mutex_lock(&rdev
->srbm_mutex
);
5541 for (i
= 0; i
< 16; i
++) {
5542 cik_srbm_select(rdev
, 0, 0, 0, i
);
5543 /* CP and shaders */
5544 WREG32(SH_MEM_CONFIG
, SH_MEM_CONFIG_GFX_DEFAULT
);
5545 WREG32(SH_MEM_APE1_BASE
, 1);
5546 WREG32(SH_MEM_APE1_LIMIT
, 0);
5547 WREG32(SH_MEM_BASES
, 0);
5549 WREG32(SDMA0_GFX_VIRTUAL_ADDR
+ SDMA0_REGISTER_OFFSET
, 0);
5550 WREG32(SDMA0_GFX_APE1_CNTL
+ SDMA0_REGISTER_OFFSET
, 0);
5551 WREG32(SDMA0_GFX_VIRTUAL_ADDR
+ SDMA1_REGISTER_OFFSET
, 0);
5552 WREG32(SDMA0_GFX_APE1_CNTL
+ SDMA1_REGISTER_OFFSET
, 0);
5553 /* XXX SDMA RLC - todo */
5555 cik_srbm_select(rdev
, 0, 0, 0, 0);
5556 mutex_unlock(&rdev
->srbm_mutex
);
5558 cik_pcie_gart_tlb_flush(rdev
);
5559 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
5560 (unsigned)(rdev
->mc
.gtt_size
>> 20),
5561 (unsigned long long)rdev
->gart
.table_addr
);
5562 rdev
->gart
.ready
= true;
5567 * cik_pcie_gart_disable - gart disable
5569 * @rdev: radeon_device pointer
5571 * This disables all VM page table (CIK).
5573 static void cik_pcie_gart_disable(struct radeon_device
*rdev
)
5577 for (i
= 1; i
< 16; ++i
) {
5580 reg
= VM_CONTEXT0_PAGE_TABLE_BASE_ADDR
+ (i
<< 2);
5582 reg
= VM_CONTEXT8_PAGE_TABLE_BASE_ADDR
+ ((i
- 8) << 2);
5583 rdev
->vm_manager
.saved_table_addr
[i
] = RREG32(reg
);
5586 /* Disable all tables */
5587 WREG32(VM_CONTEXT0_CNTL
, 0);
5588 WREG32(VM_CONTEXT1_CNTL
, 0);
5589 /* Setup TLB control */
5590 WREG32(MC_VM_MX_L1_TLB_CNTL
, SYSTEM_ACCESS_MODE_NOT_IN_SYS
|
5591 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU
);
5592 /* Setup L2 cache */
5594 ENABLE_L2_FRAGMENT_PROCESSING
|
5595 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE
|
5596 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE
|
5597 EFFECTIVE_L2_QUEUE_SIZE(7) |
5598 CONTEXT1_IDENTITY_ACCESS_MODE(1));
5599 WREG32(VM_L2_CNTL2
, 0);
5600 WREG32(VM_L2_CNTL3
, L2_CACHE_BIGK_ASSOCIATIVITY
|
5601 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
5602 radeon_gart_table_vram_unpin(rdev
);
5606 * cik_pcie_gart_fini - vm fini callback
5608 * @rdev: radeon_device pointer
5610 * Tears down the driver GART/VM setup (CIK).
5612 static void cik_pcie_gart_fini(struct radeon_device
*rdev
)
5614 cik_pcie_gart_disable(rdev
);
5615 radeon_gart_table_vram_free(rdev
);
5616 radeon_gart_fini(rdev
);
5621 * cik_ib_parse - vm ib_parse callback
5623 * @rdev: radeon_device pointer
5624 * @ib: indirect buffer pointer
5626 * CIK uses hw IB checking so this is a nop (CIK).
5628 int cik_ib_parse(struct radeon_device
*rdev
, struct radeon_ib
*ib
)
5635 * VMID 0 is the physical GPU addresses as used by the kernel.
5636 * VMIDs 1-15 are used for userspace clients and are handled
5637 * by the radeon vm/hsa code.
5640 * cik_vm_init - cik vm init callback
5642 * @rdev: radeon_device pointer
5644 * Inits cik specific vm parameters (number of VMs, base of vram for
5645 * VMIDs 1-15) (CIK).
5646 * Returns 0 for success.
5648 int cik_vm_init(struct radeon_device
*rdev
)
5652 * VMID 0 is reserved for System
5653 * radeon graphics/compute will use VMIDs 1-15
5655 rdev
->vm_manager
.nvm
= 16;
5656 /* base offset of vram pages */
5657 if (rdev
->flags
& RADEON_IS_IGP
) {
5658 u64 tmp
= RREG32(MC_VM_FB_OFFSET
);
5660 rdev
->vm_manager
.vram_base_offset
= tmp
;
5662 rdev
->vm_manager
.vram_base_offset
= 0;
5668 * cik_vm_fini - cik vm fini callback
5670 * @rdev: radeon_device pointer
5672 * Tear down any asic specific VM setup (CIK).
5674 void cik_vm_fini(struct radeon_device
*rdev
)
5679 * cik_vm_decode_fault - print human readable fault info
5681 * @rdev: radeon_device pointer
5682 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
5683 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
5685 * Print human readable fault information (CIK).
5687 static void cik_vm_decode_fault(struct radeon_device
*rdev
,
5688 u32 status
, u32 addr
, u32 mc_client
)
5691 u32 vmid
= (status
& FAULT_VMID_MASK
) >> FAULT_VMID_SHIFT
;
5692 u32 protections
= (status
& PROTECTIONS_MASK
) >> PROTECTIONS_SHIFT
;
5693 char block
[5] = { mc_client
>> 24, (mc_client
>> 16) & 0xff,
5694 (mc_client
>> 8) & 0xff, mc_client
& 0xff, 0 };
5696 if (rdev
->family
== CHIP_HAWAII
)
5697 mc_id
= (status
& HAWAII_MEMORY_CLIENT_ID_MASK
) >> MEMORY_CLIENT_ID_SHIFT
;
5699 mc_id
= (status
& MEMORY_CLIENT_ID_MASK
) >> MEMORY_CLIENT_ID_SHIFT
;
5701 printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
5702 protections
, vmid
, addr
,
5703 (status
& MEMORY_CLIENT_RW_MASK
) ? "write" : "read",
5704 block
, mc_client
, mc_id
);
5708 * cik_vm_flush - cik vm flush using the CP
5710 * @rdev: radeon_device pointer
5712 * Update the page table base and flush the VM TLB
5713 * using the CP (CIK).
5715 void cik_vm_flush(struct radeon_device
*rdev
, struct radeon_ring
*ring
,
5716 unsigned vm_id
, uint64_t pd_addr
)
5718 int usepfp
= (ring
->idx
== RADEON_RING_TYPE_GFX_INDEX
);
5720 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
5721 radeon_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(usepfp
) |
5722 WRITE_DATA_DST_SEL(0)));
5724 radeon_ring_write(ring
,
5725 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR
+ (vm_id
<< 2)) >> 2);
5727 radeon_ring_write(ring
,
5728 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR
+ ((vm_id
- 8) << 2)) >> 2);
5730 radeon_ring_write(ring
, 0);
5731 radeon_ring_write(ring
, pd_addr
>> 12);
5733 /* update SH_MEM_* regs */
5734 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
5735 radeon_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(usepfp
) |
5736 WRITE_DATA_DST_SEL(0)));
5737 radeon_ring_write(ring
, SRBM_GFX_CNTL
>> 2);
5738 radeon_ring_write(ring
, 0);
5739 radeon_ring_write(ring
, VMID(vm_id
));
5741 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 6));
5742 radeon_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(usepfp
) |
5743 WRITE_DATA_DST_SEL(0)));
5744 radeon_ring_write(ring
, SH_MEM_BASES
>> 2);
5745 radeon_ring_write(ring
, 0);
5747 radeon_ring_write(ring
, 0); /* SH_MEM_BASES */
5748 radeon_ring_write(ring
, SH_MEM_CONFIG_GFX_DEFAULT
); /* SH_MEM_CONFIG */
5749 radeon_ring_write(ring
, 1); /* SH_MEM_APE1_BASE */
5750 radeon_ring_write(ring
, 0); /* SH_MEM_APE1_LIMIT */
5752 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
5753 radeon_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(usepfp
) |
5754 WRITE_DATA_DST_SEL(0)));
5755 radeon_ring_write(ring
, SRBM_GFX_CNTL
>> 2);
5756 radeon_ring_write(ring
, 0);
5757 radeon_ring_write(ring
, VMID(0));
5760 cik_hdp_flush_cp_ring_emit(rdev
, ring
->idx
);
5762 /* bits 0-15 are the VM contexts0-15 */
5763 radeon_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
5764 radeon_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(usepfp
) |
5765 WRITE_DATA_DST_SEL(0)));
5766 radeon_ring_write(ring
, VM_INVALIDATE_REQUEST
>> 2);
5767 radeon_ring_write(ring
, 0);
5768 radeon_ring_write(ring
, 1 << vm_id
);
5770 /* wait for the invalidate to complete */
5771 radeon_ring_write(ring
, PACKET3(PACKET3_WAIT_REG_MEM
, 5));
5772 radeon_ring_write(ring
, (WAIT_REG_MEM_OPERATION(0) | /* wait */
5773 WAIT_REG_MEM_FUNCTION(0) | /* always */
5774 WAIT_REG_MEM_ENGINE(0))); /* me */
5775 radeon_ring_write(ring
, VM_INVALIDATE_REQUEST
>> 2);
5776 radeon_ring_write(ring
, 0);
5777 radeon_ring_write(ring
, 0); /* ref */
5778 radeon_ring_write(ring
, 0); /* mask */
5779 radeon_ring_write(ring
, 0x20); /* poll interval */
5781 /* compute doesn't have PFP */
5783 /* sync PFP to ME, otherwise we might get invalid PFP reads */
5784 radeon_ring_write(ring
, PACKET3(PACKET3_PFP_SYNC_ME
, 0));
5785 radeon_ring_write(ring
, 0x0);
5791 * The RLC is a multi-purpose microengine that handles a
5792 * variety of functions, the most important of which is
5793 * the interrupt controller.
5795 static void cik_enable_gui_idle_interrupt(struct radeon_device
*rdev
,
5798 u32 tmp
= RREG32(CP_INT_CNTL_RING0
);
5801 tmp
|= (CNTX_BUSY_INT_ENABLE
| CNTX_EMPTY_INT_ENABLE
);
5803 tmp
&= ~(CNTX_BUSY_INT_ENABLE
| CNTX_EMPTY_INT_ENABLE
);
5804 WREG32(CP_INT_CNTL_RING0
, tmp
);
5807 static void cik_enable_lbpw(struct radeon_device
*rdev
, bool enable
)
5811 tmp
= RREG32(RLC_LB_CNTL
);
5813 tmp
|= LOAD_BALANCE_ENABLE
;
5815 tmp
&= ~LOAD_BALANCE_ENABLE
;
5816 WREG32(RLC_LB_CNTL
, tmp
);
5819 static void cik_wait_for_rlc_serdes(struct radeon_device
*rdev
)
5824 for (i
= 0; i
< rdev
->config
.cik
.max_shader_engines
; i
++) {
5825 for (j
= 0; j
< rdev
->config
.cik
.max_sh_per_se
; j
++) {
5826 cik_select_se_sh(rdev
, i
, j
);
5827 for (k
= 0; k
< rdev
->usec_timeout
; k
++) {
5828 if (RREG32(RLC_SERDES_CU_MASTER_BUSY
) == 0)
5834 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
5836 mask
= SE_MASTER_BUSY_MASK
| GC_MASTER_BUSY
| TC0_MASTER_BUSY
| TC1_MASTER_BUSY
;
5837 for (k
= 0; k
< rdev
->usec_timeout
; k
++) {
5838 if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY
) & mask
) == 0)
5844 static void cik_update_rlc(struct radeon_device
*rdev
, u32 rlc
)
5848 tmp
= RREG32(RLC_CNTL
);
5850 WREG32(RLC_CNTL
, rlc
);
5853 static u32
cik_halt_rlc(struct radeon_device
*rdev
)
5857 orig
= data
= RREG32(RLC_CNTL
);
5859 if (data
& RLC_ENABLE
) {
5862 data
&= ~RLC_ENABLE
;
5863 WREG32(RLC_CNTL
, data
);
5865 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
5866 if ((RREG32(RLC_GPM_STAT
) & RLC_GPM_BUSY
) == 0)
5871 cik_wait_for_rlc_serdes(rdev
);
5877 void cik_enter_rlc_safe_mode(struct radeon_device
*rdev
)
5881 tmp
= REQ
| MESSAGE(MSG_ENTER_RLC_SAFE_MODE
);
5882 WREG32(RLC_GPR_REG2
, tmp
);
5884 mask
= GFX_POWER_STATUS
| GFX_CLOCK_STATUS
;
5885 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
5886 if ((RREG32(RLC_GPM_STAT
) & mask
) == mask
)
5891 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
5892 if ((RREG32(RLC_GPR_REG2
) & REQ
) == 0)
5898 void cik_exit_rlc_safe_mode(struct radeon_device
*rdev
)
5902 tmp
= REQ
| MESSAGE(MSG_EXIT_RLC_SAFE_MODE
);
5903 WREG32(RLC_GPR_REG2
, tmp
);
5907 * cik_rlc_stop - stop the RLC ME
5909 * @rdev: radeon_device pointer
5911 * Halt the RLC ME (MicroEngine) (CIK).
5913 static void cik_rlc_stop(struct radeon_device
*rdev
)
5915 WREG32(RLC_CNTL
, 0);
5917 cik_enable_gui_idle_interrupt(rdev
, false);
5919 cik_wait_for_rlc_serdes(rdev
);
5923 * cik_rlc_start - start the RLC ME
5925 * @rdev: radeon_device pointer
5927 * Unhalt the RLC ME (MicroEngine) (CIK).
5929 static void cik_rlc_start(struct radeon_device
*rdev
)
5931 WREG32(RLC_CNTL
, RLC_ENABLE
);
5933 cik_enable_gui_idle_interrupt(rdev
, true);
5939 * cik_rlc_resume - setup the RLC hw
5941 * @rdev: radeon_device pointer
5943 * Initialize the RLC registers, load the ucode,
5944 * and start the RLC (CIK).
5945 * Returns 0 for success, -EINVAL if the ucode is not available.
5947 static int cik_rlc_resume(struct radeon_device
*rdev
)
5957 tmp
= RREG32(RLC_CGCG_CGLS_CTRL
) & 0xfffffffc;
5958 WREG32(RLC_CGCG_CGLS_CTRL
, tmp
);
5966 WREG32(RLC_LB_CNTR_INIT
, 0);
5967 WREG32(RLC_LB_CNTR_MAX
, 0x00008000);
5969 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
5970 WREG32(RLC_LB_INIT_CU_MASK
, 0xffffffff);
5971 WREG32(RLC_LB_PARAMS
, 0x00600408);
5972 WREG32(RLC_LB_CNTL
, 0x80000004);
5974 WREG32(RLC_MC_CNTL
, 0);
5975 WREG32(RLC_UCODE_CNTL
, 0);
5978 const struct rlc_firmware_header_v1_0
*hdr
=
5979 (const struct rlc_firmware_header_v1_0
*)rdev
->rlc_fw
->data
;
5980 const __le32
*fw_data
= (const __le32
*)
5981 (rdev
->rlc_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
5983 radeon_ucode_print_rlc_hdr(&hdr
->header
);
5985 size
= le32_to_cpu(hdr
->header
.ucode_size_bytes
) / 4;
5986 WREG32(RLC_GPM_UCODE_ADDR
, 0);
5987 for (i
= 0; i
< size
; i
++)
5988 WREG32(RLC_GPM_UCODE_DATA
, le32_to_cpup(fw_data
++));
5989 WREG32(RLC_GPM_UCODE_ADDR
, le32_to_cpu(hdr
->header
.ucode_version
));
5991 const __be32
*fw_data
;
5993 switch (rdev
->family
) {
5997 size
= BONAIRE_RLC_UCODE_SIZE
;
6000 size
= KV_RLC_UCODE_SIZE
;
6003 size
= KB_RLC_UCODE_SIZE
;
6006 size
= ML_RLC_UCODE_SIZE
;
6010 fw_data
= (const __be32
*)rdev
->rlc_fw
->data
;
6011 WREG32(RLC_GPM_UCODE_ADDR
, 0);
6012 for (i
= 0; i
< size
; i
++)
6013 WREG32(RLC_GPM_UCODE_DATA
, be32_to_cpup(fw_data
++));
6014 WREG32(RLC_GPM_UCODE_ADDR
, 0);
6017 /* XXX - find out what chips support lbpw */
6018 cik_enable_lbpw(rdev
, false);
6020 if (rdev
->family
== CHIP_BONAIRE
)
6021 WREG32(RLC_DRIVER_DMA_STATUS
, 0);
6023 cik_rlc_start(rdev
);
6028 static void cik_enable_cgcg(struct radeon_device
*rdev
, bool enable
)
6030 u32 data
, orig
, tmp
, tmp2
;
6032 orig
= data
= RREG32(RLC_CGCG_CGLS_CTRL
);
6034 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_CGCG
)) {
6035 cik_enable_gui_idle_interrupt(rdev
, true);
6037 tmp
= cik_halt_rlc(rdev
);
6039 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
6040 WREG32(RLC_SERDES_WR_CU_MASTER_MASK
, 0xffffffff);
6041 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK
, 0xffffffff);
6042 tmp2
= BPM_ADDR_MASK
| CGCG_OVERRIDE_0
| CGLS_ENABLE
;
6043 WREG32(RLC_SERDES_WR_CTRL
, tmp2
);
6045 cik_update_rlc(rdev
, tmp
);
6047 data
|= CGCG_EN
| CGLS_EN
;
6049 cik_enable_gui_idle_interrupt(rdev
, false);
6051 RREG32(CB_CGTT_SCLK_CTRL
);
6052 RREG32(CB_CGTT_SCLK_CTRL
);
6053 RREG32(CB_CGTT_SCLK_CTRL
);
6054 RREG32(CB_CGTT_SCLK_CTRL
);
6056 data
&= ~(CGCG_EN
| CGLS_EN
);
6060 WREG32(RLC_CGCG_CGLS_CTRL
, data
);
6064 static void cik_enable_mgcg(struct radeon_device
*rdev
, bool enable
)
6066 u32 data
, orig
, tmp
= 0;
6068 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_MGCG
)) {
6069 if (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_MGLS
) {
6070 if (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_CP_LS
) {
6071 orig
= data
= RREG32(CP_MEM_SLP_CNTL
);
6072 data
|= CP_MEM_LS_EN
;
6074 WREG32(CP_MEM_SLP_CNTL
, data
);
6078 orig
= data
= RREG32(RLC_CGTT_MGCG_OVERRIDE
);
6082 WREG32(RLC_CGTT_MGCG_OVERRIDE
, data
);
6084 tmp
= cik_halt_rlc(rdev
);
6086 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
6087 WREG32(RLC_SERDES_WR_CU_MASTER_MASK
, 0xffffffff);
6088 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK
, 0xffffffff);
6089 data
= BPM_ADDR_MASK
| MGCG_OVERRIDE_0
;
6090 WREG32(RLC_SERDES_WR_CTRL
, data
);
6092 cik_update_rlc(rdev
, tmp
);
6094 if (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_CGTS
) {
6095 orig
= data
= RREG32(CGTS_SM_CTRL_REG
);
6096 data
&= ~SM_MODE_MASK
;
6097 data
|= SM_MODE(0x2);
6098 data
|= SM_MODE_ENABLE
;
6099 data
&= ~CGTS_OVERRIDE
;
6100 if ((rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_MGLS
) &&
6101 (rdev
->cg_flags
& RADEON_CG_SUPPORT_GFX_CGTS_LS
))
6102 data
&= ~CGTS_LS_OVERRIDE
;
6103 data
&= ~ON_MONITOR_ADD_MASK
;
6104 data
|= ON_MONITOR_ADD_EN
;
6105 data
|= ON_MONITOR_ADD(0x96);
6107 WREG32(CGTS_SM_CTRL_REG
, data
);
6110 orig
= data
= RREG32(RLC_CGTT_MGCG_OVERRIDE
);
6113 WREG32(RLC_CGTT_MGCG_OVERRIDE
, data
);
6115 data
= RREG32(RLC_MEM_SLP_CNTL
);
6116 if (data
& RLC_MEM_LS_EN
) {
6117 data
&= ~RLC_MEM_LS_EN
;
6118 WREG32(RLC_MEM_SLP_CNTL
, data
);
6121 data
= RREG32(CP_MEM_SLP_CNTL
);
6122 if (data
& CP_MEM_LS_EN
) {
6123 data
&= ~CP_MEM_LS_EN
;
6124 WREG32(CP_MEM_SLP_CNTL
, data
);
6127 orig
= data
= RREG32(CGTS_SM_CTRL_REG
);
6128 data
|= CGTS_OVERRIDE
| CGTS_LS_OVERRIDE
;
6130 WREG32(CGTS_SM_CTRL_REG
, data
);
6132 tmp
= cik_halt_rlc(rdev
);
6134 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
6135 WREG32(RLC_SERDES_WR_CU_MASTER_MASK
, 0xffffffff);
6136 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK
, 0xffffffff);
6137 data
= BPM_ADDR_MASK
| MGCG_OVERRIDE_1
;
6138 WREG32(RLC_SERDES_WR_CTRL
, data
);
6140 cik_update_rlc(rdev
, tmp
);
6144 static const u32 mc_cg_registers
[] =
6157 static void cik_enable_mc_ls(struct radeon_device
*rdev
,
6163 for (i
= 0; i
< ARRAY_SIZE(mc_cg_registers
); i
++) {
6164 orig
= data
= RREG32(mc_cg_registers
[i
]);
6165 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_MC_LS
))
6166 data
|= MC_LS_ENABLE
;
6168 data
&= ~MC_LS_ENABLE
;
6170 WREG32(mc_cg_registers
[i
], data
);
6174 static void cik_enable_mc_mgcg(struct radeon_device
*rdev
,
6180 for (i
= 0; i
< ARRAY_SIZE(mc_cg_registers
); i
++) {
6181 orig
= data
= RREG32(mc_cg_registers
[i
]);
6182 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_MC_MGCG
))
6183 data
|= MC_CG_ENABLE
;
6185 data
&= ~MC_CG_ENABLE
;
6187 WREG32(mc_cg_registers
[i
], data
);
6191 static void cik_enable_sdma_mgcg(struct radeon_device
*rdev
,
6196 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_SDMA_MGCG
)) {
6197 WREG32(SDMA0_CLK_CTRL
+ SDMA0_REGISTER_OFFSET
, 0x00000100);
6198 WREG32(SDMA0_CLK_CTRL
+ SDMA1_REGISTER_OFFSET
, 0x00000100);
6200 orig
= data
= RREG32(SDMA0_CLK_CTRL
+ SDMA0_REGISTER_OFFSET
);
6203 WREG32(SDMA0_CLK_CTRL
+ SDMA0_REGISTER_OFFSET
, data
);
6205 orig
= data
= RREG32(SDMA0_CLK_CTRL
+ SDMA1_REGISTER_OFFSET
);
6208 WREG32(SDMA0_CLK_CTRL
+ SDMA1_REGISTER_OFFSET
, data
);
6212 static void cik_enable_sdma_mgls(struct radeon_device
*rdev
,
6217 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_SDMA_LS
)) {
6218 orig
= data
= RREG32(SDMA0_POWER_CNTL
+ SDMA0_REGISTER_OFFSET
);
6221 WREG32(SDMA0_POWER_CNTL
+ SDMA0_REGISTER_OFFSET
, data
);
6223 orig
= data
= RREG32(SDMA0_POWER_CNTL
+ SDMA1_REGISTER_OFFSET
);
6226 WREG32(SDMA0_POWER_CNTL
+ SDMA1_REGISTER_OFFSET
, data
);
6228 orig
= data
= RREG32(SDMA0_POWER_CNTL
+ SDMA0_REGISTER_OFFSET
);
6231 WREG32(SDMA0_POWER_CNTL
+ SDMA0_REGISTER_OFFSET
, data
);
6233 orig
= data
= RREG32(SDMA0_POWER_CNTL
+ SDMA1_REGISTER_OFFSET
);
6236 WREG32(SDMA0_POWER_CNTL
+ SDMA1_REGISTER_OFFSET
, data
);
6240 static void cik_enable_uvd_mgcg(struct radeon_device
*rdev
,
6245 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_UVD_MGCG
)) {
6246 data
= RREG32_UVD_CTX(UVD_CGC_MEM_CTRL
);
6248 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL
, data
);
6250 orig
= data
= RREG32(UVD_CGC_CTRL
);
6253 WREG32(UVD_CGC_CTRL
, data
);
6255 data
= RREG32_UVD_CTX(UVD_CGC_MEM_CTRL
);
6257 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL
, data
);
6259 orig
= data
= RREG32(UVD_CGC_CTRL
);
6262 WREG32(UVD_CGC_CTRL
, data
);
6266 static void cik_enable_bif_mgls(struct radeon_device
*rdev
,
6271 orig
= data
= RREG32_PCIE_PORT(PCIE_CNTL2
);
6273 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_BIF_LS
))
6274 data
|= SLV_MEM_LS_EN
| MST_MEM_LS_EN
|
6275 REPLAY_MEM_LS_EN
| SLV_MEM_AGGRESSIVE_LS_EN
;
6277 data
&= ~(SLV_MEM_LS_EN
| MST_MEM_LS_EN
|
6278 REPLAY_MEM_LS_EN
| SLV_MEM_AGGRESSIVE_LS_EN
);
6281 WREG32_PCIE_PORT(PCIE_CNTL2
, data
);
6284 static void cik_enable_hdp_mgcg(struct radeon_device
*rdev
,
6289 orig
= data
= RREG32(HDP_HOST_PATH_CNTL
);
6291 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_HDP_MGCG
))
6292 data
&= ~CLOCK_GATING_DIS
;
6294 data
|= CLOCK_GATING_DIS
;
6297 WREG32(HDP_HOST_PATH_CNTL
, data
);
6300 static void cik_enable_hdp_ls(struct radeon_device
*rdev
,
6305 orig
= data
= RREG32(HDP_MEM_POWER_LS
);
6307 if (enable
&& (rdev
->cg_flags
& RADEON_CG_SUPPORT_HDP_LS
))
6308 data
|= HDP_LS_ENABLE
;
6310 data
&= ~HDP_LS_ENABLE
;
6313 WREG32(HDP_MEM_POWER_LS
, data
);
6316 void cik_update_cg(struct radeon_device
*rdev
,
6317 u32 block
, bool enable
)
6320 if (block
& RADEON_CG_BLOCK_GFX
) {
6321 cik_enable_gui_idle_interrupt(rdev
, false);
6322 /* order matters! */
6324 cik_enable_mgcg(rdev
, true);
6325 cik_enable_cgcg(rdev
, true);
6327 cik_enable_cgcg(rdev
, false);
6328 cik_enable_mgcg(rdev
, false);
6330 cik_enable_gui_idle_interrupt(rdev
, true);
6333 if (block
& RADEON_CG_BLOCK_MC
) {
6334 if (!(rdev
->flags
& RADEON_IS_IGP
)) {
6335 cik_enable_mc_mgcg(rdev
, enable
);
6336 cik_enable_mc_ls(rdev
, enable
);
6340 if (block
& RADEON_CG_BLOCK_SDMA
) {
6341 cik_enable_sdma_mgcg(rdev
, enable
);
6342 cik_enable_sdma_mgls(rdev
, enable
);
6345 if (block
& RADEON_CG_BLOCK_BIF
) {
6346 cik_enable_bif_mgls(rdev
, enable
);
6349 if (block
& RADEON_CG_BLOCK_UVD
) {
6351 cik_enable_uvd_mgcg(rdev
, enable
);
6354 if (block
& RADEON_CG_BLOCK_HDP
) {
6355 cik_enable_hdp_mgcg(rdev
, enable
);
6356 cik_enable_hdp_ls(rdev
, enable
);
6359 if (block
& RADEON_CG_BLOCK_VCE
) {
6360 vce_v2_0_enable_mgcg(rdev
, enable
);
6364 static void cik_init_cg(struct radeon_device
*rdev
)
6367 cik_update_cg(rdev
, RADEON_CG_BLOCK_GFX
, true);
6370 si_init_uvd_internal_cg(rdev
);
6372 cik_update_cg(rdev
, (RADEON_CG_BLOCK_MC
|
6373 RADEON_CG_BLOCK_SDMA
|
6374 RADEON_CG_BLOCK_BIF
|
6375 RADEON_CG_BLOCK_UVD
|
6376 RADEON_CG_BLOCK_HDP
), true);
6379 static void cik_fini_cg(struct radeon_device
*rdev
)
6381 cik_update_cg(rdev
, (RADEON_CG_BLOCK_MC
|
6382 RADEON_CG_BLOCK_SDMA
|
6383 RADEON_CG_BLOCK_BIF
|
6384 RADEON_CG_BLOCK_UVD
|
6385 RADEON_CG_BLOCK_HDP
), false);
6387 cik_update_cg(rdev
, RADEON_CG_BLOCK_GFX
, false);
6390 static void cik_enable_sck_slowdown_on_pu(struct radeon_device
*rdev
,
6395 orig
= data
= RREG32(RLC_PG_CNTL
);
6396 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_RLC_SMU_HS
))
6397 data
|= SMU_CLK_SLOWDOWN_ON_PU_ENABLE
;
6399 data
&= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE
;
6401 WREG32(RLC_PG_CNTL
, data
);
6404 static void cik_enable_sck_slowdown_on_pd(struct radeon_device
*rdev
,
6409 orig
= data
= RREG32(RLC_PG_CNTL
);
6410 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_RLC_SMU_HS
))
6411 data
|= SMU_CLK_SLOWDOWN_ON_PD_ENABLE
;
6413 data
&= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE
;
6415 WREG32(RLC_PG_CNTL
, data
);
6418 static void cik_enable_cp_pg(struct radeon_device
*rdev
, bool enable
)
6422 orig
= data
= RREG32(RLC_PG_CNTL
);
6423 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_CP
))
6424 data
&= ~DISABLE_CP_PG
;
6426 data
|= DISABLE_CP_PG
;
6428 WREG32(RLC_PG_CNTL
, data
);
6431 static void cik_enable_gds_pg(struct radeon_device
*rdev
, bool enable
)
6435 orig
= data
= RREG32(RLC_PG_CNTL
);
6436 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_GDS
))
6437 data
&= ~DISABLE_GDS_PG
;
6439 data
|= DISABLE_GDS_PG
;
6441 WREG32(RLC_PG_CNTL
, data
);
6444 #define CP_ME_TABLE_SIZE 96
6445 #define CP_ME_TABLE_OFFSET 2048
6446 #define CP_MEC_TABLE_OFFSET 4096
6448 void cik_init_cp_pg_table(struct radeon_device
*rdev
)
6450 volatile u32
*dst_ptr
;
6451 int me
, i
, max_me
= 4;
6453 u32 table_offset
, table_size
;
6455 if (rdev
->family
== CHIP_KAVERI
)
6458 if (rdev
->rlc
.cp_table_ptr
== NULL
)
6461 /* write the cp table buffer */
6462 dst_ptr
= rdev
->rlc
.cp_table_ptr
;
6463 for (me
= 0; me
< max_me
; me
++) {
6465 const __le32
*fw_data
;
6466 const struct gfx_firmware_header_v1_0
*hdr
;
6469 hdr
= (const struct gfx_firmware_header_v1_0
*)rdev
->ce_fw
->data
;
6470 fw_data
= (const __le32
*)
6471 (rdev
->ce_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
6472 table_offset
= le32_to_cpu(hdr
->jt_offset
);
6473 table_size
= le32_to_cpu(hdr
->jt_size
);
6474 } else if (me
== 1) {
6475 hdr
= (const struct gfx_firmware_header_v1_0
*)rdev
->pfp_fw
->data
;
6476 fw_data
= (const __le32
*)
6477 (rdev
->pfp_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
6478 table_offset
= le32_to_cpu(hdr
->jt_offset
);
6479 table_size
= le32_to_cpu(hdr
->jt_size
);
6480 } else if (me
== 2) {
6481 hdr
= (const struct gfx_firmware_header_v1_0
*)rdev
->me_fw
->data
;
6482 fw_data
= (const __le32
*)
6483 (rdev
->me_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
6484 table_offset
= le32_to_cpu(hdr
->jt_offset
);
6485 table_size
= le32_to_cpu(hdr
->jt_size
);
6486 } else if (me
== 3) {
6487 hdr
= (const struct gfx_firmware_header_v1_0
*)rdev
->mec_fw
->data
;
6488 fw_data
= (const __le32
*)
6489 (rdev
->mec_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
6490 table_offset
= le32_to_cpu(hdr
->jt_offset
);
6491 table_size
= le32_to_cpu(hdr
->jt_size
);
6493 hdr
= (const struct gfx_firmware_header_v1_0
*)rdev
->mec2_fw
->data
;
6494 fw_data
= (const __le32
*)
6495 (rdev
->mec2_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
6496 table_offset
= le32_to_cpu(hdr
->jt_offset
);
6497 table_size
= le32_to_cpu(hdr
->jt_size
);
6500 for (i
= 0; i
< table_size
; i
++) {
6501 dst_ptr
[bo_offset
+ i
] =
6502 cpu_to_le32(le32_to_cpu(fw_data
[table_offset
+ i
]));
6504 bo_offset
+= table_size
;
6506 const __be32
*fw_data
;
6507 table_size
= CP_ME_TABLE_SIZE
;
6510 fw_data
= (const __be32
*)rdev
->ce_fw
->data
;
6511 table_offset
= CP_ME_TABLE_OFFSET
;
6512 } else if (me
== 1) {
6513 fw_data
= (const __be32
*)rdev
->pfp_fw
->data
;
6514 table_offset
= CP_ME_TABLE_OFFSET
;
6515 } else if (me
== 2) {
6516 fw_data
= (const __be32
*)rdev
->me_fw
->data
;
6517 table_offset
= CP_ME_TABLE_OFFSET
;
6519 fw_data
= (const __be32
*)rdev
->mec_fw
->data
;
6520 table_offset
= CP_MEC_TABLE_OFFSET
;
6523 for (i
= 0; i
< table_size
; i
++) {
6524 dst_ptr
[bo_offset
+ i
] =
6525 cpu_to_le32(be32_to_cpu(fw_data
[table_offset
+ i
]));
6527 bo_offset
+= table_size
;
6532 static void cik_enable_gfx_cgpg(struct radeon_device
*rdev
,
6537 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_GFX_PG
)) {
6538 orig
= data
= RREG32(RLC_PG_CNTL
);
6539 data
|= GFX_PG_ENABLE
;
6541 WREG32(RLC_PG_CNTL
, data
);
6543 orig
= data
= RREG32(RLC_AUTO_PG_CTRL
);
6546 WREG32(RLC_AUTO_PG_CTRL
, data
);
6548 orig
= data
= RREG32(RLC_PG_CNTL
);
6549 data
&= ~GFX_PG_ENABLE
;
6551 WREG32(RLC_PG_CNTL
, data
);
6553 orig
= data
= RREG32(RLC_AUTO_PG_CTRL
);
6554 data
&= ~AUTO_PG_EN
;
6556 WREG32(RLC_AUTO_PG_CTRL
, data
);
6558 data
= RREG32(DB_RENDER_CONTROL
);
6562 static u32
cik_get_cu_active_bitmap(struct radeon_device
*rdev
, u32 se
, u32 sh
)
6564 u32 mask
= 0, tmp
, tmp1
;
6567 cik_select_se_sh(rdev
, se
, sh
);
6568 tmp
= RREG32(CC_GC_SHADER_ARRAY_CONFIG
);
6569 tmp1
= RREG32(GC_USER_SHADER_ARRAY_CONFIG
);
6570 cik_select_se_sh(rdev
, 0xffffffff, 0xffffffff);
6577 for (i
= 0; i
< rdev
->config
.cik
.max_cu_per_sh
; i
++) {
6582 return (~tmp
) & mask
;
6585 static void cik_init_ao_cu_mask(struct radeon_device
*rdev
)
6587 u32 i
, j
, k
, active_cu_number
= 0;
6588 u32 mask
, counter
, cu_bitmap
;
6591 for (i
= 0; i
< rdev
->config
.cik
.max_shader_engines
; i
++) {
6592 for (j
= 0; j
< rdev
->config
.cik
.max_sh_per_se
; j
++) {
6596 for (k
= 0; k
< rdev
->config
.cik
.max_cu_per_sh
; k
++) {
6597 if (cik_get_cu_active_bitmap(rdev
, i
, j
) & mask
) {
6605 active_cu_number
+= counter
;
6606 tmp
|= (cu_bitmap
<< (i
* 16 + j
* 8));
6610 WREG32(RLC_PG_AO_CU_MASK
, tmp
);
6612 tmp
= RREG32(RLC_MAX_PG_CU
);
6613 tmp
&= ~MAX_PU_CU_MASK
;
6614 tmp
|= MAX_PU_CU(active_cu_number
);
6615 WREG32(RLC_MAX_PG_CU
, tmp
);
6618 static void cik_enable_gfx_static_mgpg(struct radeon_device
*rdev
,
6623 orig
= data
= RREG32(RLC_PG_CNTL
);
6624 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_GFX_SMG
))
6625 data
|= STATIC_PER_CU_PG_ENABLE
;
6627 data
&= ~STATIC_PER_CU_PG_ENABLE
;
6629 WREG32(RLC_PG_CNTL
, data
);
6632 static void cik_enable_gfx_dynamic_mgpg(struct radeon_device
*rdev
,
6637 orig
= data
= RREG32(RLC_PG_CNTL
);
6638 if (enable
&& (rdev
->pg_flags
& RADEON_PG_SUPPORT_GFX_DMG
))
6639 data
|= DYN_PER_CU_PG_ENABLE
;
6641 data
&= ~DYN_PER_CU_PG_ENABLE
;
6643 WREG32(RLC_PG_CNTL
, data
);
6646 #define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
6647 #define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
6649 static void cik_init_gfx_cgpg(struct radeon_device
*rdev
)
6654 if (rdev
->rlc
.cs_data
) {
6655 WREG32(RLC_GPM_SCRATCH_ADDR
, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET
);
6656 WREG32(RLC_GPM_SCRATCH_DATA
, upper_32_bits(rdev
->rlc
.clear_state_gpu_addr
));
6657 WREG32(RLC_GPM_SCRATCH_DATA
, lower_32_bits(rdev
->rlc
.clear_state_gpu_addr
));
6658 WREG32(RLC_GPM_SCRATCH_DATA
, rdev
->rlc
.clear_state_size
);
6660 WREG32(RLC_GPM_SCRATCH_ADDR
, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET
);
6661 for (i
= 0; i
< 3; i
++)
6662 WREG32(RLC_GPM_SCRATCH_DATA
, 0);
6664 if (rdev
->rlc
.reg_list
) {
6665 WREG32(RLC_GPM_SCRATCH_ADDR
, RLC_SAVE_AND_RESTORE_STARTING_OFFSET
);
6666 for (i
= 0; i
< rdev
->rlc
.reg_list_size
; i
++)
6667 WREG32(RLC_GPM_SCRATCH_DATA
, rdev
->rlc
.reg_list
[i
]);
6670 orig
= data
= RREG32(RLC_PG_CNTL
);
6673 WREG32(RLC_PG_CNTL
, data
);
6675 WREG32(RLC_SAVE_AND_RESTORE_BASE
, rdev
->rlc
.save_restore_gpu_addr
>> 8);
6676 WREG32(RLC_CP_TABLE_RESTORE
, rdev
->rlc
.cp_table_gpu_addr
>> 8);
6678 data
= RREG32(CP_RB_WPTR_POLL_CNTL
);
6679 data
&= ~IDLE_POLL_COUNT_MASK
;
6680 data
|= IDLE_POLL_COUNT(0x60);
6681 WREG32(CP_RB_WPTR_POLL_CNTL
, data
);
6684 WREG32(RLC_PG_DELAY
, data
);
6686 data
= RREG32(RLC_PG_DELAY_2
);
6689 WREG32(RLC_PG_DELAY_2
, data
);
6691 data
= RREG32(RLC_AUTO_PG_CTRL
);
6692 data
&= ~GRBM_REG_SGIT_MASK
;
6693 data
|= GRBM_REG_SGIT(0x700);
6694 WREG32(RLC_AUTO_PG_CTRL
, data
);
6698 static void cik_update_gfx_pg(struct radeon_device
*rdev
, bool enable
)
6700 cik_enable_gfx_cgpg(rdev
, enable
);
6701 cik_enable_gfx_static_mgpg(rdev
, enable
);
6702 cik_enable_gfx_dynamic_mgpg(rdev
, enable
);
6705 u32
cik_get_csb_size(struct radeon_device
*rdev
)
6708 const struct cs_section_def
*sect
= NULL
;
6709 const struct cs_extent_def
*ext
= NULL
;
6711 if (rdev
->rlc
.cs_data
== NULL
)
6714 /* begin clear state */
6716 /* context control state */
6719 for (sect
= rdev
->rlc
.cs_data
; sect
->section
!= NULL
; ++sect
) {
6720 for (ext
= sect
->section
; ext
->extent
!= NULL
; ++ext
) {
6721 if (sect
->id
== SECT_CONTEXT
)
6722 count
+= 2 + ext
->reg_count
;
6727 /* pa_sc_raster_config/pa_sc_raster_config1 */
6729 /* end clear state */
6737 void cik_get_csb_buffer(struct radeon_device
*rdev
, volatile u32
*buffer
)
6740 const struct cs_section_def
*sect
= NULL
;
6741 const struct cs_extent_def
*ext
= NULL
;
6743 if (rdev
->rlc
.cs_data
== NULL
)
6748 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
6749 buffer
[count
++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE
);
6751 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL
, 1));
6752 buffer
[count
++] = cpu_to_le32(0x80000000);
6753 buffer
[count
++] = cpu_to_le32(0x80000000);
6755 for (sect
= rdev
->rlc
.cs_data
; sect
->section
!= NULL
; ++sect
) {
6756 for (ext
= sect
->section
; ext
->extent
!= NULL
; ++ext
) {
6757 if (sect
->id
== SECT_CONTEXT
) {
6759 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG
, ext
->reg_count
));
6760 buffer
[count
++] = cpu_to_le32(ext
->reg_index
- 0xa000);
6761 for (i
= 0; i
< ext
->reg_count
; i
++)
6762 buffer
[count
++] = cpu_to_le32(ext
->extent
[i
]);
6769 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG
, 2));
6770 buffer
[count
++] = cpu_to_le32(PA_SC_RASTER_CONFIG
- PACKET3_SET_CONTEXT_REG_START
);
6771 switch (rdev
->family
) {
6773 buffer
[count
++] = cpu_to_le32(0x16000012);
6774 buffer
[count
++] = cpu_to_le32(0x00000000);
6777 buffer
[count
++] = cpu_to_le32(0x00000000); /* XXX */
6778 buffer
[count
++] = cpu_to_le32(0x00000000);
6782 buffer
[count
++] = cpu_to_le32(0x00000000); /* XXX */
6783 buffer
[count
++] = cpu_to_le32(0x00000000);
6786 buffer
[count
++] = cpu_to_le32(0x3a00161a);
6787 buffer
[count
++] = cpu_to_le32(0x0000002e);
6790 buffer
[count
++] = cpu_to_le32(0x00000000);
6791 buffer
[count
++] = cpu_to_le32(0x00000000);
6795 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
6796 buffer
[count
++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE
);
6798 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE
, 0));
6799 buffer
[count
++] = cpu_to_le32(0);
6802 static void cik_init_pg(struct radeon_device
*rdev
)
6804 if (rdev
->pg_flags
) {
6805 cik_enable_sck_slowdown_on_pu(rdev
, true);
6806 cik_enable_sck_slowdown_on_pd(rdev
, true);
6807 if (rdev
->pg_flags
& RADEON_PG_SUPPORT_GFX_PG
) {
6808 cik_init_gfx_cgpg(rdev
);
6809 cik_enable_cp_pg(rdev
, true);
6810 cik_enable_gds_pg(rdev
, true);
6812 cik_init_ao_cu_mask(rdev
);
6813 cik_update_gfx_pg(rdev
, true);
6817 static void cik_fini_pg(struct radeon_device
*rdev
)
6819 if (rdev
->pg_flags
) {
6820 cik_update_gfx_pg(rdev
, false);
6821 if (rdev
->pg_flags
& RADEON_PG_SUPPORT_GFX_PG
) {
6822 cik_enable_cp_pg(rdev
, false);
6823 cik_enable_gds_pg(rdev
, false);
6830 * Starting with r6xx, interrupts are handled via a ring buffer.
6831 * Ring buffers are areas of GPU accessible memory that the GPU
6832 * writes interrupt vectors into and the host reads vectors out of.
6833 * There is a rptr (read pointer) that determines where the
6834 * host is currently reading, and a wptr (write pointer)
6835 * which determines where the GPU has written. When the
6836 * pointers are equal, the ring is idle. When the GPU
6837 * writes vectors to the ring buffer, it increments the
6838 * wptr. When there is an interrupt, the host then starts
6839 * fetching commands and processing them until the pointers are
6840 * equal again at which point it updates the rptr.
6844 * cik_enable_interrupts - Enable the interrupt ring buffer
6846 * @rdev: radeon_device pointer
6848 * Enable the interrupt ring buffer (CIK).
6850 static void cik_enable_interrupts(struct radeon_device
*rdev
)
6852 u32 ih_cntl
= RREG32(IH_CNTL
);
6853 u32 ih_rb_cntl
= RREG32(IH_RB_CNTL
);
6855 ih_cntl
|= ENABLE_INTR
;
6856 ih_rb_cntl
|= IH_RB_ENABLE
;
6857 WREG32(IH_CNTL
, ih_cntl
);
6858 WREG32(IH_RB_CNTL
, ih_rb_cntl
);
6859 rdev
->ih
.enabled
= true;
6863 * cik_disable_interrupts - Disable the interrupt ring buffer
6865 * @rdev: radeon_device pointer
6867 * Disable the interrupt ring buffer (CIK).
6869 static void cik_disable_interrupts(struct radeon_device
*rdev
)
6871 u32 ih_rb_cntl
= RREG32(IH_RB_CNTL
);
6872 u32 ih_cntl
= RREG32(IH_CNTL
);
6874 ih_rb_cntl
&= ~IH_RB_ENABLE
;
6875 ih_cntl
&= ~ENABLE_INTR
;
6876 WREG32(IH_RB_CNTL
, ih_rb_cntl
);
6877 WREG32(IH_CNTL
, ih_cntl
);
6878 /* set rptr, wptr to 0 */
6879 WREG32(IH_RB_RPTR
, 0);
6880 WREG32(IH_RB_WPTR
, 0);
6881 rdev
->ih
.enabled
= false;
6886 * cik_disable_interrupt_state - Disable all interrupt sources
6888 * @rdev: radeon_device pointer
6890 * Clear all interrupt enable bits used by the driver (CIK).
6892 static void cik_disable_interrupt_state(struct radeon_device
*rdev
)
6897 tmp
= RREG32(CP_INT_CNTL_RING0
) &
6898 (CNTX_BUSY_INT_ENABLE
| CNTX_EMPTY_INT_ENABLE
);
6899 WREG32(CP_INT_CNTL_RING0
, tmp
);
6901 tmp
= RREG32(SDMA0_CNTL
+ SDMA0_REGISTER_OFFSET
) & ~TRAP_ENABLE
;
6902 WREG32(SDMA0_CNTL
+ SDMA0_REGISTER_OFFSET
, tmp
);
6903 tmp
= RREG32(SDMA0_CNTL
+ SDMA1_REGISTER_OFFSET
) & ~TRAP_ENABLE
;
6904 WREG32(SDMA0_CNTL
+ SDMA1_REGISTER_OFFSET
, tmp
);
6905 /* compute queues */
6906 WREG32(CP_ME1_PIPE0_INT_CNTL
, 0);
6907 WREG32(CP_ME1_PIPE1_INT_CNTL
, 0);
6908 WREG32(CP_ME1_PIPE2_INT_CNTL
, 0);
6909 WREG32(CP_ME1_PIPE3_INT_CNTL
, 0);
6910 WREG32(CP_ME2_PIPE0_INT_CNTL
, 0);
6911 WREG32(CP_ME2_PIPE1_INT_CNTL
, 0);
6912 WREG32(CP_ME2_PIPE2_INT_CNTL
, 0);
6913 WREG32(CP_ME2_PIPE3_INT_CNTL
, 0);
6915 WREG32(GRBM_INT_CNTL
, 0);
6917 WREG32(SRBM_INT_CNTL
, 0);
6918 /* vline/vblank, etc. */
6919 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC0_REGISTER_OFFSET
, 0);
6920 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC1_REGISTER_OFFSET
, 0);
6921 if (rdev
->num_crtc
>= 4) {
6922 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC2_REGISTER_OFFSET
, 0);
6923 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC3_REGISTER_OFFSET
, 0);
6925 if (rdev
->num_crtc
>= 6) {
6926 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC4_REGISTER_OFFSET
, 0);
6927 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC5_REGISTER_OFFSET
, 0);
6930 if (rdev
->num_crtc
>= 2) {
6931 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC0_REGISTER_OFFSET
, 0);
6932 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC1_REGISTER_OFFSET
, 0);
6934 if (rdev
->num_crtc
>= 4) {
6935 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC2_REGISTER_OFFSET
, 0);
6936 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC3_REGISTER_OFFSET
, 0);
6938 if (rdev
->num_crtc
>= 6) {
6939 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC4_REGISTER_OFFSET
, 0);
6940 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC5_REGISTER_OFFSET
, 0);
6944 WREG32(DAC_AUTODETECT_INT_CONTROL
, 0);
6946 /* digital hotplug */
6947 tmp
= RREG32(DC_HPD1_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6948 WREG32(DC_HPD1_INT_CONTROL
, tmp
);
6949 tmp
= RREG32(DC_HPD2_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6950 WREG32(DC_HPD2_INT_CONTROL
, tmp
);
6951 tmp
= RREG32(DC_HPD3_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6952 WREG32(DC_HPD3_INT_CONTROL
, tmp
);
6953 tmp
= RREG32(DC_HPD4_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6954 WREG32(DC_HPD4_INT_CONTROL
, tmp
);
6955 tmp
= RREG32(DC_HPD5_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6956 WREG32(DC_HPD5_INT_CONTROL
, tmp
);
6957 tmp
= RREG32(DC_HPD6_INT_CONTROL
) & DC_HPDx_INT_POLARITY
;
6958 WREG32(DC_HPD6_INT_CONTROL
, tmp
);
6963 * cik_irq_init - init and enable the interrupt ring
6965 * @rdev: radeon_device pointer
6967 * Allocate a ring buffer for the interrupt controller,
6968 * enable the RLC, disable interrupts, enable the IH
6969 * ring buffer and enable it (CIK).
6970 * Called at device load and reume.
6971 * Returns 0 for success, errors for failure.
6973 static int cik_irq_init(struct radeon_device
*rdev
)
6977 u32 interrupt_cntl
, ih_cntl
, ih_rb_cntl
;
6980 ret
= r600_ih_ring_alloc(rdev
);
6985 cik_disable_interrupts(rdev
);
6988 ret
= cik_rlc_resume(rdev
);
6990 r600_ih_ring_fini(rdev
);
6994 /* setup interrupt control */
6995 /* XXX this should actually be a bus address, not an MC address. same on older asics */
6996 WREG32(INTERRUPT_CNTL2
, rdev
->ih
.gpu_addr
>> 8);
6997 interrupt_cntl
= RREG32(INTERRUPT_CNTL
);
6998 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
6999 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
7001 interrupt_cntl
&= ~IH_DUMMY_RD_OVERRIDE
;
7002 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
7003 interrupt_cntl
&= ~IH_REQ_NONSNOOP_EN
;
7004 WREG32(INTERRUPT_CNTL
, interrupt_cntl
);
7006 WREG32(IH_RB_BASE
, rdev
->ih
.gpu_addr
>> 8);
7007 rb_bufsz
= order_base_2(rdev
->ih
.ring_size
/ 4);
7009 ih_rb_cntl
= (IH_WPTR_OVERFLOW_ENABLE
|
7010 IH_WPTR_OVERFLOW_CLEAR
|
7013 if (rdev
->wb
.enabled
)
7014 ih_rb_cntl
|= IH_WPTR_WRITEBACK_ENABLE
;
7016 /* set the writeback address whether it's enabled or not */
7017 WREG32(IH_RB_WPTR_ADDR_LO
, (rdev
->wb
.gpu_addr
+ R600_WB_IH_WPTR_OFFSET
) & 0xFFFFFFFC);
7018 WREG32(IH_RB_WPTR_ADDR_HI
, upper_32_bits(rdev
->wb
.gpu_addr
+ R600_WB_IH_WPTR_OFFSET
) & 0xFF);
7020 WREG32(IH_RB_CNTL
, ih_rb_cntl
);
7022 /* set rptr, wptr to 0 */
7023 WREG32(IH_RB_RPTR
, 0);
7024 WREG32(IH_RB_WPTR
, 0);
7026 /* Default settings for IH_CNTL (disabled at first) */
7027 ih_cntl
= MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
7028 /* RPTR_REARM only works if msi's are enabled */
7029 if (rdev
->msi_enabled
)
7030 ih_cntl
|= RPTR_REARM
;
7031 WREG32(IH_CNTL
, ih_cntl
);
7033 /* force the active interrupt state to all disabled */
7034 cik_disable_interrupt_state(rdev
);
7036 pci_set_master(rdev
->pdev
);
7039 cik_enable_interrupts(rdev
);
7045 * cik_irq_set - enable/disable interrupt sources
7047 * @rdev: radeon_device pointer
7049 * Enable interrupt sources on the GPU (vblanks, hpd,
7051 * Returns 0 for success, errors for failure.
7053 int cik_irq_set(struct radeon_device
*rdev
)
7056 u32 cp_m1p0
, cp_m1p1
, cp_m1p2
, cp_m1p3
;
7057 u32 cp_m2p0
, cp_m2p1
, cp_m2p2
, cp_m2p3
;
7058 u32 crtc1
= 0, crtc2
= 0, crtc3
= 0, crtc4
= 0, crtc5
= 0, crtc6
= 0;
7059 u32 hpd1
, hpd2
, hpd3
, hpd4
, hpd5
, hpd6
;
7060 u32 grbm_int_cntl
= 0;
7061 u32 dma_cntl
, dma_cntl1
;
7063 if (!rdev
->irq
.installed
) {
7064 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
7067 /* don't enable anything if the ih is disabled */
7068 if (!rdev
->ih
.enabled
) {
7069 cik_disable_interrupts(rdev
);
7070 /* force the active interrupt state to all disabled */
7071 cik_disable_interrupt_state(rdev
);
7075 cp_int_cntl
= RREG32(CP_INT_CNTL_RING0
) &
7076 (CNTX_BUSY_INT_ENABLE
| CNTX_EMPTY_INT_ENABLE
);
7077 cp_int_cntl
|= PRIV_INSTR_INT_ENABLE
| PRIV_REG_INT_ENABLE
;
7079 hpd1
= RREG32(DC_HPD1_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7080 hpd2
= RREG32(DC_HPD2_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7081 hpd3
= RREG32(DC_HPD3_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7082 hpd4
= RREG32(DC_HPD4_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7083 hpd5
= RREG32(DC_HPD5_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7084 hpd6
= RREG32(DC_HPD6_INT_CONTROL
) & ~(DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
);
7086 dma_cntl
= RREG32(SDMA0_CNTL
+ SDMA0_REGISTER_OFFSET
) & ~TRAP_ENABLE
;
7087 dma_cntl1
= RREG32(SDMA0_CNTL
+ SDMA1_REGISTER_OFFSET
) & ~TRAP_ENABLE
;
7089 cp_m1p0
= RREG32(CP_ME1_PIPE0_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7090 cp_m1p1
= RREG32(CP_ME1_PIPE1_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7091 cp_m1p2
= RREG32(CP_ME1_PIPE2_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7092 cp_m1p3
= RREG32(CP_ME1_PIPE3_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7093 cp_m2p0
= RREG32(CP_ME2_PIPE0_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7094 cp_m2p1
= RREG32(CP_ME2_PIPE1_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7095 cp_m2p2
= RREG32(CP_ME2_PIPE2_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7096 cp_m2p3
= RREG32(CP_ME2_PIPE3_INT_CNTL
) & ~TIME_STAMP_INT_ENABLE
;
7098 /* enable CP interrupts on all rings */
7099 if (atomic_read(&rdev
->irq
.ring_int
[RADEON_RING_TYPE_GFX_INDEX
])) {
7100 DRM_DEBUG("cik_irq_set: sw int gfx\n");
7101 cp_int_cntl
|= TIME_STAMP_INT_ENABLE
;
7103 if (atomic_read(&rdev
->irq
.ring_int
[CAYMAN_RING_TYPE_CP1_INDEX
])) {
7104 struct radeon_ring
*ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
];
7105 DRM_DEBUG("si_irq_set: sw int cp1\n");
7106 if (ring
->me
== 1) {
7107 switch (ring
->pipe
) {
7109 cp_m1p0
|= TIME_STAMP_INT_ENABLE
;
7112 cp_m1p1
|= TIME_STAMP_INT_ENABLE
;
7115 cp_m1p2
|= TIME_STAMP_INT_ENABLE
;
7118 cp_m1p2
|= TIME_STAMP_INT_ENABLE
;
7121 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring
->pipe
);
7124 } else if (ring
->me
== 2) {
7125 switch (ring
->pipe
) {
7127 cp_m2p0
|= TIME_STAMP_INT_ENABLE
;
7130 cp_m2p1
|= TIME_STAMP_INT_ENABLE
;
7133 cp_m2p2
|= TIME_STAMP_INT_ENABLE
;
7136 cp_m2p2
|= TIME_STAMP_INT_ENABLE
;
7139 DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring
->pipe
);
7143 DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring
->me
);
7146 if (atomic_read(&rdev
->irq
.ring_int
[CAYMAN_RING_TYPE_CP2_INDEX
])) {
7147 struct radeon_ring
*ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
];
7148 DRM_DEBUG("si_irq_set: sw int cp2\n");
7149 if (ring
->me
== 1) {
7150 switch (ring
->pipe
) {
7152 cp_m1p0
|= TIME_STAMP_INT_ENABLE
;
7155 cp_m1p1
|= TIME_STAMP_INT_ENABLE
;
7158 cp_m1p2
|= TIME_STAMP_INT_ENABLE
;
7161 cp_m1p2
|= TIME_STAMP_INT_ENABLE
;
7164 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring
->pipe
);
7167 } else if (ring
->me
== 2) {
7168 switch (ring
->pipe
) {
7170 cp_m2p0
|= TIME_STAMP_INT_ENABLE
;
7173 cp_m2p1
|= TIME_STAMP_INT_ENABLE
;
7176 cp_m2p2
|= TIME_STAMP_INT_ENABLE
;
7179 cp_m2p2
|= TIME_STAMP_INT_ENABLE
;
7182 DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring
->pipe
);
7186 DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring
->me
);
7190 if (atomic_read(&rdev
->irq
.ring_int
[R600_RING_TYPE_DMA_INDEX
])) {
7191 DRM_DEBUG("cik_irq_set: sw int dma\n");
7192 dma_cntl
|= TRAP_ENABLE
;
7195 if (atomic_read(&rdev
->irq
.ring_int
[CAYMAN_RING_TYPE_DMA1_INDEX
])) {
7196 DRM_DEBUG("cik_irq_set: sw int dma1\n");
7197 dma_cntl1
|= TRAP_ENABLE
;
7200 if (rdev
->irq
.crtc_vblank_int
[0] ||
7201 atomic_read(&rdev
->irq
.pflip
[0])) {
7202 DRM_DEBUG("cik_irq_set: vblank 0\n");
7203 crtc1
|= VBLANK_INTERRUPT_MASK
;
7205 if (rdev
->irq
.crtc_vblank_int
[1] ||
7206 atomic_read(&rdev
->irq
.pflip
[1])) {
7207 DRM_DEBUG("cik_irq_set: vblank 1\n");
7208 crtc2
|= VBLANK_INTERRUPT_MASK
;
7210 if (rdev
->irq
.crtc_vblank_int
[2] ||
7211 atomic_read(&rdev
->irq
.pflip
[2])) {
7212 DRM_DEBUG("cik_irq_set: vblank 2\n");
7213 crtc3
|= VBLANK_INTERRUPT_MASK
;
7215 if (rdev
->irq
.crtc_vblank_int
[3] ||
7216 atomic_read(&rdev
->irq
.pflip
[3])) {
7217 DRM_DEBUG("cik_irq_set: vblank 3\n");
7218 crtc4
|= VBLANK_INTERRUPT_MASK
;
7220 if (rdev
->irq
.crtc_vblank_int
[4] ||
7221 atomic_read(&rdev
->irq
.pflip
[4])) {
7222 DRM_DEBUG("cik_irq_set: vblank 4\n");
7223 crtc5
|= VBLANK_INTERRUPT_MASK
;
7225 if (rdev
->irq
.crtc_vblank_int
[5] ||
7226 atomic_read(&rdev
->irq
.pflip
[5])) {
7227 DRM_DEBUG("cik_irq_set: vblank 5\n");
7228 crtc6
|= VBLANK_INTERRUPT_MASK
;
7230 if (rdev
->irq
.hpd
[0]) {
7231 DRM_DEBUG("cik_irq_set: hpd 1\n");
7232 hpd1
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7234 if (rdev
->irq
.hpd
[1]) {
7235 DRM_DEBUG("cik_irq_set: hpd 2\n");
7236 hpd2
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7238 if (rdev
->irq
.hpd
[2]) {
7239 DRM_DEBUG("cik_irq_set: hpd 3\n");
7240 hpd3
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7242 if (rdev
->irq
.hpd
[3]) {
7243 DRM_DEBUG("cik_irq_set: hpd 4\n");
7244 hpd4
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7246 if (rdev
->irq
.hpd
[4]) {
7247 DRM_DEBUG("cik_irq_set: hpd 5\n");
7248 hpd5
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7250 if (rdev
->irq
.hpd
[5]) {
7251 DRM_DEBUG("cik_irq_set: hpd 6\n");
7252 hpd6
|= DC_HPDx_INT_EN
| DC_HPDx_RX_INT_EN
;
7255 WREG32(CP_INT_CNTL_RING0
, cp_int_cntl
);
7257 WREG32(SDMA0_CNTL
+ SDMA0_REGISTER_OFFSET
, dma_cntl
);
7258 WREG32(SDMA0_CNTL
+ SDMA1_REGISTER_OFFSET
, dma_cntl1
);
7260 WREG32(CP_ME1_PIPE0_INT_CNTL
, cp_m1p0
);
7261 WREG32(CP_ME1_PIPE1_INT_CNTL
, cp_m1p1
);
7262 WREG32(CP_ME1_PIPE2_INT_CNTL
, cp_m1p2
);
7263 WREG32(CP_ME1_PIPE3_INT_CNTL
, cp_m1p3
);
7264 WREG32(CP_ME2_PIPE0_INT_CNTL
, cp_m2p0
);
7265 WREG32(CP_ME2_PIPE1_INT_CNTL
, cp_m2p1
);
7266 WREG32(CP_ME2_PIPE2_INT_CNTL
, cp_m2p2
);
7267 WREG32(CP_ME2_PIPE3_INT_CNTL
, cp_m2p3
);
7269 WREG32(GRBM_INT_CNTL
, grbm_int_cntl
);
7271 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC0_REGISTER_OFFSET
, crtc1
);
7272 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC1_REGISTER_OFFSET
, crtc2
);
7273 if (rdev
->num_crtc
>= 4) {
7274 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC2_REGISTER_OFFSET
, crtc3
);
7275 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC3_REGISTER_OFFSET
, crtc4
);
7277 if (rdev
->num_crtc
>= 6) {
7278 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC4_REGISTER_OFFSET
, crtc5
);
7279 WREG32(LB_INTERRUPT_MASK
+ EVERGREEN_CRTC5_REGISTER_OFFSET
, crtc6
);
7282 if (rdev
->num_crtc
>= 2) {
7283 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC0_REGISTER_OFFSET
,
7284 GRPH_PFLIP_INT_MASK
);
7285 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC1_REGISTER_OFFSET
,
7286 GRPH_PFLIP_INT_MASK
);
7288 if (rdev
->num_crtc
>= 4) {
7289 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC2_REGISTER_OFFSET
,
7290 GRPH_PFLIP_INT_MASK
);
7291 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC3_REGISTER_OFFSET
,
7292 GRPH_PFLIP_INT_MASK
);
7294 if (rdev
->num_crtc
>= 6) {
7295 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC4_REGISTER_OFFSET
,
7296 GRPH_PFLIP_INT_MASK
);
7297 WREG32(GRPH_INT_CONTROL
+ EVERGREEN_CRTC5_REGISTER_OFFSET
,
7298 GRPH_PFLIP_INT_MASK
);
7301 WREG32(DC_HPD1_INT_CONTROL
, hpd1
);
7302 WREG32(DC_HPD2_INT_CONTROL
, hpd2
);
7303 WREG32(DC_HPD3_INT_CONTROL
, hpd3
);
7304 WREG32(DC_HPD4_INT_CONTROL
, hpd4
);
7305 WREG32(DC_HPD5_INT_CONTROL
, hpd5
);
7306 WREG32(DC_HPD6_INT_CONTROL
, hpd6
);
7309 RREG32(SRBM_STATUS
);
7315 * cik_irq_ack - ack interrupt sources
7317 * @rdev: radeon_device pointer
7319 * Ack interrupt sources on the GPU (vblanks, hpd,
7320 * etc.) (CIK). Certain interrupts sources are sw
7321 * generated and do not require an explicit ack.
7323 static inline void cik_irq_ack(struct radeon_device
*rdev
)
7327 rdev
->irq
.stat_regs
.cik
.disp_int
= RREG32(DISP_INTERRUPT_STATUS
);
7328 rdev
->irq
.stat_regs
.cik
.disp_int_cont
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE
);
7329 rdev
->irq
.stat_regs
.cik
.disp_int_cont2
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE2
);
7330 rdev
->irq
.stat_regs
.cik
.disp_int_cont3
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE3
);
7331 rdev
->irq
.stat_regs
.cik
.disp_int_cont4
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE4
);
7332 rdev
->irq
.stat_regs
.cik
.disp_int_cont5
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE5
);
7333 rdev
->irq
.stat_regs
.cik
.disp_int_cont6
= RREG32(DISP_INTERRUPT_STATUS_CONTINUE6
);
7335 rdev
->irq
.stat_regs
.cik
.d1grph_int
= RREG32(GRPH_INT_STATUS
+
7336 EVERGREEN_CRTC0_REGISTER_OFFSET
);
7337 rdev
->irq
.stat_regs
.cik
.d2grph_int
= RREG32(GRPH_INT_STATUS
+
7338 EVERGREEN_CRTC1_REGISTER_OFFSET
);
7339 if (rdev
->num_crtc
>= 4) {
7340 rdev
->irq
.stat_regs
.cik
.d3grph_int
= RREG32(GRPH_INT_STATUS
+
7341 EVERGREEN_CRTC2_REGISTER_OFFSET
);
7342 rdev
->irq
.stat_regs
.cik
.d4grph_int
= RREG32(GRPH_INT_STATUS
+
7343 EVERGREEN_CRTC3_REGISTER_OFFSET
);
7345 if (rdev
->num_crtc
>= 6) {
7346 rdev
->irq
.stat_regs
.cik
.d5grph_int
= RREG32(GRPH_INT_STATUS
+
7347 EVERGREEN_CRTC4_REGISTER_OFFSET
);
7348 rdev
->irq
.stat_regs
.cik
.d6grph_int
= RREG32(GRPH_INT_STATUS
+
7349 EVERGREEN_CRTC5_REGISTER_OFFSET
);
7352 if (rdev
->irq
.stat_regs
.cik
.d1grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7353 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC0_REGISTER_OFFSET
,
7354 GRPH_PFLIP_INT_CLEAR
);
7355 if (rdev
->irq
.stat_regs
.cik
.d2grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7356 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC1_REGISTER_OFFSET
,
7357 GRPH_PFLIP_INT_CLEAR
);
7358 if (rdev
->irq
.stat_regs
.cik
.disp_int
& LB_D1_VBLANK_INTERRUPT
)
7359 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC0_REGISTER_OFFSET
, VBLANK_ACK
);
7360 if (rdev
->irq
.stat_regs
.cik
.disp_int
& LB_D1_VLINE_INTERRUPT
)
7361 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC0_REGISTER_OFFSET
, VLINE_ACK
);
7362 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont
& LB_D2_VBLANK_INTERRUPT
)
7363 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC1_REGISTER_OFFSET
, VBLANK_ACK
);
7364 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont
& LB_D2_VLINE_INTERRUPT
)
7365 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC1_REGISTER_OFFSET
, VLINE_ACK
);
7367 if (rdev
->num_crtc
>= 4) {
7368 if (rdev
->irq
.stat_regs
.cik
.d3grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7369 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC2_REGISTER_OFFSET
,
7370 GRPH_PFLIP_INT_CLEAR
);
7371 if (rdev
->irq
.stat_regs
.cik
.d4grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7372 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC3_REGISTER_OFFSET
,
7373 GRPH_PFLIP_INT_CLEAR
);
7374 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& LB_D3_VBLANK_INTERRUPT
)
7375 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC2_REGISTER_OFFSET
, VBLANK_ACK
);
7376 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& LB_D3_VLINE_INTERRUPT
)
7377 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC2_REGISTER_OFFSET
, VLINE_ACK
);
7378 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& LB_D4_VBLANK_INTERRUPT
)
7379 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC3_REGISTER_OFFSET
, VBLANK_ACK
);
7380 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& LB_D4_VLINE_INTERRUPT
)
7381 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC3_REGISTER_OFFSET
, VLINE_ACK
);
7384 if (rdev
->num_crtc
>= 6) {
7385 if (rdev
->irq
.stat_regs
.cik
.d5grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7386 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC4_REGISTER_OFFSET
,
7387 GRPH_PFLIP_INT_CLEAR
);
7388 if (rdev
->irq
.stat_regs
.cik
.d6grph_int
& GRPH_PFLIP_INT_OCCURRED
)
7389 WREG32(GRPH_INT_STATUS
+ EVERGREEN_CRTC5_REGISTER_OFFSET
,
7390 GRPH_PFLIP_INT_CLEAR
);
7391 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& LB_D5_VBLANK_INTERRUPT
)
7392 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC4_REGISTER_OFFSET
, VBLANK_ACK
);
7393 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& LB_D5_VLINE_INTERRUPT
)
7394 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC4_REGISTER_OFFSET
, VLINE_ACK
);
7395 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& LB_D6_VBLANK_INTERRUPT
)
7396 WREG32(LB_VBLANK_STATUS
+ EVERGREEN_CRTC5_REGISTER_OFFSET
, VBLANK_ACK
);
7397 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& LB_D6_VLINE_INTERRUPT
)
7398 WREG32(LB_VLINE_STATUS
+ EVERGREEN_CRTC5_REGISTER_OFFSET
, VLINE_ACK
);
7401 if (rdev
->irq
.stat_regs
.cik
.disp_int
& DC_HPD1_INTERRUPT
) {
7402 tmp
= RREG32(DC_HPD1_INT_CONTROL
);
7403 tmp
|= DC_HPDx_INT_ACK
;
7404 WREG32(DC_HPD1_INT_CONTROL
, tmp
);
7406 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont
& DC_HPD2_INTERRUPT
) {
7407 tmp
= RREG32(DC_HPD2_INT_CONTROL
);
7408 tmp
|= DC_HPDx_INT_ACK
;
7409 WREG32(DC_HPD2_INT_CONTROL
, tmp
);
7411 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& DC_HPD3_INTERRUPT
) {
7412 tmp
= RREG32(DC_HPD3_INT_CONTROL
);
7413 tmp
|= DC_HPDx_INT_ACK
;
7414 WREG32(DC_HPD3_INT_CONTROL
, tmp
);
7416 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& DC_HPD4_INTERRUPT
) {
7417 tmp
= RREG32(DC_HPD4_INT_CONTROL
);
7418 tmp
|= DC_HPDx_INT_ACK
;
7419 WREG32(DC_HPD4_INT_CONTROL
, tmp
);
7421 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& DC_HPD5_INTERRUPT
) {
7422 tmp
= RREG32(DC_HPD5_INT_CONTROL
);
7423 tmp
|= DC_HPDx_INT_ACK
;
7424 WREG32(DC_HPD5_INT_CONTROL
, tmp
);
7426 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& DC_HPD6_INTERRUPT
) {
7427 tmp
= RREG32(DC_HPD6_INT_CONTROL
);
7428 tmp
|= DC_HPDx_INT_ACK
;
7429 WREG32(DC_HPD6_INT_CONTROL
, tmp
);
7431 if (rdev
->irq
.stat_regs
.cik
.disp_int
& DC_HPD1_RX_INTERRUPT
) {
7432 tmp
= RREG32(DC_HPD1_INT_CONTROL
);
7433 tmp
|= DC_HPDx_RX_INT_ACK
;
7434 WREG32(DC_HPD1_INT_CONTROL
, tmp
);
7436 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont
& DC_HPD2_RX_INTERRUPT
) {
7437 tmp
= RREG32(DC_HPD2_INT_CONTROL
);
7438 tmp
|= DC_HPDx_RX_INT_ACK
;
7439 WREG32(DC_HPD2_INT_CONTROL
, tmp
);
7441 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& DC_HPD3_RX_INTERRUPT
) {
7442 tmp
= RREG32(DC_HPD3_INT_CONTROL
);
7443 tmp
|= DC_HPDx_RX_INT_ACK
;
7444 WREG32(DC_HPD3_INT_CONTROL
, tmp
);
7446 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& DC_HPD4_RX_INTERRUPT
) {
7447 tmp
= RREG32(DC_HPD4_INT_CONTROL
);
7448 tmp
|= DC_HPDx_RX_INT_ACK
;
7449 WREG32(DC_HPD4_INT_CONTROL
, tmp
);
7451 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& DC_HPD5_RX_INTERRUPT
) {
7452 tmp
= RREG32(DC_HPD5_INT_CONTROL
);
7453 tmp
|= DC_HPDx_RX_INT_ACK
;
7454 WREG32(DC_HPD5_INT_CONTROL
, tmp
);
7456 if (rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& DC_HPD6_RX_INTERRUPT
) {
7457 tmp
= RREG32(DC_HPD6_INT_CONTROL
);
7458 tmp
|= DC_HPDx_RX_INT_ACK
;
7459 WREG32(DC_HPD6_INT_CONTROL
, tmp
);
7464 * cik_irq_disable - disable interrupts
7466 * @rdev: radeon_device pointer
7468 * Disable interrupts on the hw (CIK).
7470 static void cik_irq_disable(struct radeon_device
*rdev
)
7472 cik_disable_interrupts(rdev
);
7473 /* Wait and acknowledge irq */
7476 cik_disable_interrupt_state(rdev
);
7480 * cik_irq_disable - disable interrupts for suspend
7482 * @rdev: radeon_device pointer
7484 * Disable interrupts and stop the RLC (CIK).
7487 static void cik_irq_suspend(struct radeon_device
*rdev
)
7489 cik_irq_disable(rdev
);
7494 * cik_irq_fini - tear down interrupt support
7496 * @rdev: radeon_device pointer
7498 * Disable interrupts on the hw and free the IH ring
7500 * Used for driver unload.
7502 static void cik_irq_fini(struct radeon_device
*rdev
)
7504 cik_irq_suspend(rdev
);
7505 r600_ih_ring_fini(rdev
);
7509 * cik_get_ih_wptr - get the IH ring buffer wptr
7511 * @rdev: radeon_device pointer
7513 * Get the IH ring buffer wptr from either the register
7514 * or the writeback memory buffer (CIK). Also check for
7515 * ring buffer overflow and deal with it.
7516 * Used by cik_irq_process().
7517 * Returns the value of the wptr.
7519 static inline u32
cik_get_ih_wptr(struct radeon_device
*rdev
)
7523 if (rdev
->wb
.enabled
)
7524 wptr
= le32_to_cpu(rdev
->wb
.wb
[R600_WB_IH_WPTR_OFFSET
/4]);
7526 wptr
= RREG32(IH_RB_WPTR
);
7528 if (wptr
& RB_OVERFLOW
) {
7529 wptr
&= ~RB_OVERFLOW
;
7530 /* When a ring buffer overflow happen start parsing interrupt
7531 * from the last not overwritten vector (wptr + 16). Hopefully
7532 * this should allow us to catchup.
7534 dev_warn(rdev
->dev
, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
7535 wptr
, rdev
->ih
.rptr
, (wptr
+ 16) & rdev
->ih
.ptr_mask
);
7536 rdev
->ih
.rptr
= (wptr
+ 16) & rdev
->ih
.ptr_mask
;
7537 tmp
= RREG32(IH_RB_CNTL
);
7538 tmp
|= IH_WPTR_OVERFLOW_CLEAR
;
7539 WREG32(IH_RB_CNTL
, tmp
);
7541 return (wptr
& rdev
->ih
.ptr_mask
);
7545 * Each IV ring entry is 128 bits:
7546 * [7:0] - interrupt source id
7548 * [59:32] - interrupt source data
7549 * [63:60] - reserved
7552 * ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
7553 * QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
7554 * - for gfx, hw shader state (0=PS...5=LS, 6=CS)
7555 * ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
7556 * PIPE_ID - ME0 0=3D
7557 * - ME1&2 compute dispatcher (4 pipes each)
7559 * INSTANCE_ID [1:0], QUEUE_ID[1:0]
7560 * INSTANCE_ID - 0 = sdma0, 1 = sdma1
7561 * QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
7564 * [127:96] - reserved
7567 * cik_irq_process - interrupt handler
7569 * @rdev: radeon_device pointer
7571 * Interrupt hander (CIK). Walk the IH ring,
7572 * ack interrupts and schedule work to handle
7574 * Returns irq process return code.
7576 int cik_irq_process(struct radeon_device
*rdev
)
7578 struct radeon_ring
*cp1_ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
];
7579 struct radeon_ring
*cp2_ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
];
7582 u32 src_id
, src_data
, ring_id
;
7583 u8 me_id
, pipe_id
, queue_id
;
7585 bool queue_hotplug
= false;
7586 bool queue_dp
= false;
7587 bool queue_reset
= false;
7588 u32 addr
, status
, mc_client
;
7589 bool queue_thermal
= false;
7591 if (!rdev
->ih
.enabled
|| rdev
->shutdown
)
7594 wptr
= cik_get_ih_wptr(rdev
);
7597 /* is somebody else already processing irqs? */
7598 if (atomic_xchg(&rdev
->ih
.lock
, 1))
7601 rptr
= rdev
->ih
.rptr
;
7602 DRM_DEBUG("cik_irq_process start: rptr %d, wptr %d\n", rptr
, wptr
);
7604 /* Order reading of wptr vs. reading of IH ring data */
7607 /* display interrupts */
7610 while (rptr
!= wptr
) {
7611 /* wptr/rptr are in bytes! */
7612 ring_index
= rptr
/ 4;
7614 src_id
= le32_to_cpu(rdev
->ih
.ring
[ring_index
]) & 0xff;
7615 src_data
= le32_to_cpu(rdev
->ih
.ring
[ring_index
+ 1]) & 0xfffffff;
7616 ring_id
= le32_to_cpu(rdev
->ih
.ring
[ring_index
+ 2]) & 0xff;
7619 case 1: /* D1 vblank/vline */
7621 case 0: /* D1 vblank */
7622 if (!(rdev
->irq
.stat_regs
.cik
.disp_int
& LB_D1_VBLANK_INTERRUPT
))
7623 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7625 if (rdev
->irq
.crtc_vblank_int
[0]) {
7626 drm_handle_vblank(rdev
->ddev
, 0);
7627 rdev
->pm
.vblank_sync
= true;
7628 wake_up(&rdev
->irq
.vblank_queue
);
7630 if (atomic_read(&rdev
->irq
.pflip
[0]))
7631 radeon_crtc_handle_vblank(rdev
, 0);
7632 rdev
->irq
.stat_regs
.cik
.disp_int
&= ~LB_D1_VBLANK_INTERRUPT
;
7633 DRM_DEBUG("IH: D1 vblank\n");
7636 case 1: /* D1 vline */
7637 if (!(rdev
->irq
.stat_regs
.cik
.disp_int
& LB_D1_VLINE_INTERRUPT
))
7638 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7640 rdev
->irq
.stat_regs
.cik
.disp_int
&= ~LB_D1_VLINE_INTERRUPT
;
7641 DRM_DEBUG("IH: D1 vline\n");
7645 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7649 case 2: /* D2 vblank/vline */
7651 case 0: /* D2 vblank */
7652 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont
& LB_D2_VBLANK_INTERRUPT
))
7653 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7655 if (rdev
->irq
.crtc_vblank_int
[1]) {
7656 drm_handle_vblank(rdev
->ddev
, 1);
7657 rdev
->pm
.vblank_sync
= true;
7658 wake_up(&rdev
->irq
.vblank_queue
);
7660 if (atomic_read(&rdev
->irq
.pflip
[1]))
7661 radeon_crtc_handle_vblank(rdev
, 1);
7662 rdev
->irq
.stat_regs
.cik
.disp_int_cont
&= ~LB_D2_VBLANK_INTERRUPT
;
7663 DRM_DEBUG("IH: D2 vblank\n");
7666 case 1: /* D2 vline */
7667 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont
& LB_D2_VLINE_INTERRUPT
))
7668 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7670 rdev
->irq
.stat_regs
.cik
.disp_int_cont
&= ~LB_D2_VLINE_INTERRUPT
;
7671 DRM_DEBUG("IH: D2 vline\n");
7675 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7679 case 3: /* D3 vblank/vline */
7681 case 0: /* D3 vblank */
7682 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& LB_D3_VBLANK_INTERRUPT
))
7683 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7685 if (rdev
->irq
.crtc_vblank_int
[2]) {
7686 drm_handle_vblank(rdev
->ddev
, 2);
7687 rdev
->pm
.vblank_sync
= true;
7688 wake_up(&rdev
->irq
.vblank_queue
);
7690 if (atomic_read(&rdev
->irq
.pflip
[2]))
7691 radeon_crtc_handle_vblank(rdev
, 2);
7692 rdev
->irq
.stat_regs
.cik
.disp_int_cont2
&= ~LB_D3_VBLANK_INTERRUPT
;
7693 DRM_DEBUG("IH: D3 vblank\n");
7696 case 1: /* D3 vline */
7697 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& LB_D3_VLINE_INTERRUPT
))
7698 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7700 rdev
->irq
.stat_regs
.cik
.disp_int_cont2
&= ~LB_D3_VLINE_INTERRUPT
;
7701 DRM_DEBUG("IH: D3 vline\n");
7705 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7709 case 4: /* D4 vblank/vline */
7711 case 0: /* D4 vblank */
7712 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& LB_D4_VBLANK_INTERRUPT
))
7713 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7715 if (rdev
->irq
.crtc_vblank_int
[3]) {
7716 drm_handle_vblank(rdev
->ddev
, 3);
7717 rdev
->pm
.vblank_sync
= true;
7718 wake_up(&rdev
->irq
.vblank_queue
);
7720 if (atomic_read(&rdev
->irq
.pflip
[3]))
7721 radeon_crtc_handle_vblank(rdev
, 3);
7722 rdev
->irq
.stat_regs
.cik
.disp_int_cont3
&= ~LB_D4_VBLANK_INTERRUPT
;
7723 DRM_DEBUG("IH: D4 vblank\n");
7726 case 1: /* D4 vline */
7727 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& LB_D4_VLINE_INTERRUPT
))
7728 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7730 rdev
->irq
.stat_regs
.cik
.disp_int_cont3
&= ~LB_D4_VLINE_INTERRUPT
;
7731 DRM_DEBUG("IH: D4 vline\n");
7735 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7739 case 5: /* D5 vblank/vline */
7741 case 0: /* D5 vblank */
7742 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& LB_D5_VBLANK_INTERRUPT
))
7743 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7745 if (rdev
->irq
.crtc_vblank_int
[4]) {
7746 drm_handle_vblank(rdev
->ddev
, 4);
7747 rdev
->pm
.vblank_sync
= true;
7748 wake_up(&rdev
->irq
.vblank_queue
);
7750 if (atomic_read(&rdev
->irq
.pflip
[4]))
7751 radeon_crtc_handle_vblank(rdev
, 4);
7752 rdev
->irq
.stat_regs
.cik
.disp_int_cont4
&= ~LB_D5_VBLANK_INTERRUPT
;
7753 DRM_DEBUG("IH: D5 vblank\n");
7756 case 1: /* D5 vline */
7757 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& LB_D5_VLINE_INTERRUPT
))
7758 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7760 rdev
->irq
.stat_regs
.cik
.disp_int_cont4
&= ~LB_D5_VLINE_INTERRUPT
;
7761 DRM_DEBUG("IH: D5 vline\n");
7765 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7769 case 6: /* D6 vblank/vline */
7771 case 0: /* D6 vblank */
7772 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& LB_D6_VBLANK_INTERRUPT
))
7773 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7775 if (rdev
->irq
.crtc_vblank_int
[5]) {
7776 drm_handle_vblank(rdev
->ddev
, 5);
7777 rdev
->pm
.vblank_sync
= true;
7778 wake_up(&rdev
->irq
.vblank_queue
);
7780 if (atomic_read(&rdev
->irq
.pflip
[5]))
7781 radeon_crtc_handle_vblank(rdev
, 5);
7782 rdev
->irq
.stat_regs
.cik
.disp_int_cont5
&= ~LB_D6_VBLANK_INTERRUPT
;
7783 DRM_DEBUG("IH: D6 vblank\n");
7786 case 1: /* D6 vline */
7787 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& LB_D6_VLINE_INTERRUPT
))
7788 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7790 rdev
->irq
.stat_regs
.cik
.disp_int_cont5
&= ~LB_D6_VLINE_INTERRUPT
;
7791 DRM_DEBUG("IH: D6 vline\n");
7795 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7799 case 8: /* D1 page flip */
7800 case 10: /* D2 page flip */
7801 case 12: /* D3 page flip */
7802 case 14: /* D4 page flip */
7803 case 16: /* D5 page flip */
7804 case 18: /* D6 page flip */
7805 DRM_DEBUG("IH: D%d flip\n", ((src_id
- 8) >> 1) + 1);
7806 if (radeon_use_pflipirq
> 0)
7807 radeon_crtc_handle_flip(rdev
, (src_id
- 8) >> 1);
7809 case 42: /* HPD hotplug */
7812 if (!(rdev
->irq
.stat_regs
.cik
.disp_int
& DC_HPD1_INTERRUPT
))
7813 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7815 rdev
->irq
.stat_regs
.cik
.disp_int
&= ~DC_HPD1_INTERRUPT
;
7816 queue_hotplug
= true;
7817 DRM_DEBUG("IH: HPD1\n");
7821 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont
& DC_HPD2_INTERRUPT
))
7822 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7824 rdev
->irq
.stat_regs
.cik
.disp_int_cont
&= ~DC_HPD2_INTERRUPT
;
7825 queue_hotplug
= true;
7826 DRM_DEBUG("IH: HPD2\n");
7830 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& DC_HPD3_INTERRUPT
))
7831 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7833 rdev
->irq
.stat_regs
.cik
.disp_int_cont2
&= ~DC_HPD3_INTERRUPT
;
7834 queue_hotplug
= true;
7835 DRM_DEBUG("IH: HPD3\n");
7839 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& DC_HPD4_INTERRUPT
))
7840 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7842 rdev
->irq
.stat_regs
.cik
.disp_int_cont3
&= ~DC_HPD4_INTERRUPT
;
7843 queue_hotplug
= true;
7844 DRM_DEBUG("IH: HPD4\n");
7848 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& DC_HPD5_INTERRUPT
))
7849 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7851 rdev
->irq
.stat_regs
.cik
.disp_int_cont4
&= ~DC_HPD5_INTERRUPT
;
7852 queue_hotplug
= true;
7853 DRM_DEBUG("IH: HPD5\n");
7857 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& DC_HPD6_INTERRUPT
))
7858 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7860 rdev
->irq
.stat_regs
.cik
.disp_int_cont5
&= ~DC_HPD6_INTERRUPT
;
7861 queue_hotplug
= true;
7862 DRM_DEBUG("IH: HPD6\n");
7866 if (!(rdev
->irq
.stat_regs
.cik
.disp_int
& DC_HPD1_RX_INTERRUPT
))
7867 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7869 rdev
->irq
.stat_regs
.cik
.disp_int
&= ~DC_HPD1_RX_INTERRUPT
;
7871 DRM_DEBUG("IH: HPD_RX 1\n");
7875 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont
& DC_HPD2_RX_INTERRUPT
))
7876 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7878 rdev
->irq
.stat_regs
.cik
.disp_int_cont
&= ~DC_HPD2_RX_INTERRUPT
;
7880 DRM_DEBUG("IH: HPD_RX 2\n");
7884 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont2
& DC_HPD3_RX_INTERRUPT
))
7885 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7887 rdev
->irq
.stat_regs
.cik
.disp_int_cont2
&= ~DC_HPD3_RX_INTERRUPT
;
7889 DRM_DEBUG("IH: HPD_RX 3\n");
7893 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont3
& DC_HPD4_RX_INTERRUPT
))
7894 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7896 rdev
->irq
.stat_regs
.cik
.disp_int_cont3
&= ~DC_HPD4_RX_INTERRUPT
;
7898 DRM_DEBUG("IH: HPD_RX 4\n");
7902 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont4
& DC_HPD5_RX_INTERRUPT
))
7903 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7905 rdev
->irq
.stat_regs
.cik
.disp_int_cont4
&= ~DC_HPD5_RX_INTERRUPT
;
7907 DRM_DEBUG("IH: HPD_RX 5\n");
7911 if (!(rdev
->irq
.stat_regs
.cik
.disp_int_cont5
& DC_HPD6_RX_INTERRUPT
))
7912 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
7914 rdev
->irq
.stat_regs
.cik
.disp_int_cont5
&= ~DC_HPD6_RX_INTERRUPT
;
7916 DRM_DEBUG("IH: HPD_RX 6\n");
7920 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7925 DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR
));
7926 WREG32(SRBM_INT_ACK
, 0x1);
7929 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data
);
7930 radeon_fence_process(rdev
, R600_RING_TYPE_UVD_INDEX
);
7934 addr
= RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR
);
7935 status
= RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS
);
7936 mc_client
= RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT
);
7937 /* reset addr and status */
7938 WREG32_P(VM_CONTEXT1_CNTL2
, 1, ~1);
7939 if (addr
== 0x0 && status
== 0x0)
7941 dev_err(rdev
->dev
, "GPU fault detected: %d 0x%08x\n", src_id
, src_data
);
7942 dev_err(rdev
->dev
, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
7944 dev_err(rdev
->dev
, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
7946 cik_vm_decode_fault(rdev
, status
, addr
, mc_client
);
7949 DRM_DEBUG("IH: VCE int: 0x%08x\n", src_data
);
7952 radeon_fence_process(rdev
, TN_RING_TYPE_VCE1_INDEX
);
7955 radeon_fence_process(rdev
, TN_RING_TYPE_VCE2_INDEX
);
7958 DRM_ERROR("Unhandled interrupt: %d %d\n", src_id
, src_data
);
7962 case 176: /* GFX RB CP_INT */
7963 case 177: /* GFX IB CP_INT */
7964 radeon_fence_process(rdev
, RADEON_RING_TYPE_GFX_INDEX
);
7966 case 181: /* CP EOP event */
7967 DRM_DEBUG("IH: CP EOP\n");
7968 /* XXX check the bitfield order! */
7969 me_id
= (ring_id
& 0x60) >> 5;
7970 pipe_id
= (ring_id
& 0x18) >> 3;
7971 queue_id
= (ring_id
& 0x7) >> 0;
7974 radeon_fence_process(rdev
, RADEON_RING_TYPE_GFX_INDEX
);
7978 if ((cp1_ring
->me
== me_id
) & (cp1_ring
->pipe
== pipe_id
))
7979 radeon_fence_process(rdev
, CAYMAN_RING_TYPE_CP1_INDEX
);
7980 if ((cp2_ring
->me
== me_id
) & (cp2_ring
->pipe
== pipe_id
))
7981 radeon_fence_process(rdev
, CAYMAN_RING_TYPE_CP2_INDEX
);
7985 case 184: /* CP Privileged reg access */
7986 DRM_ERROR("Illegal register access in command stream\n");
7987 /* XXX check the bitfield order! */
7988 me_id
= (ring_id
& 0x60) >> 5;
7989 pipe_id
= (ring_id
& 0x18) >> 3;
7990 queue_id
= (ring_id
& 0x7) >> 0;
7993 /* This results in a full GPU reset, but all we need to do is soft
7994 * reset the CP for gfx
8008 case 185: /* CP Privileged inst */
8009 DRM_ERROR("Illegal instruction in command stream\n");
8010 /* XXX check the bitfield order! */
8011 me_id
= (ring_id
& 0x60) >> 5;
8012 pipe_id
= (ring_id
& 0x18) >> 3;
8013 queue_id
= (ring_id
& 0x7) >> 0;
8016 /* This results in a full GPU reset, but all we need to do is soft
8017 * reset the CP for gfx
8031 case 224: /* SDMA trap event */
8032 /* XXX check the bitfield order! */
8033 me_id
= (ring_id
& 0x3) >> 0;
8034 queue_id
= (ring_id
& 0xc) >> 2;
8035 DRM_DEBUG("IH: SDMA trap\n");
8040 radeon_fence_process(rdev
, R600_RING_TYPE_DMA_INDEX
);
8053 radeon_fence_process(rdev
, CAYMAN_RING_TYPE_DMA1_INDEX
);
8065 case 230: /* thermal low to high */
8066 DRM_DEBUG("IH: thermal low to high\n");
8067 rdev
->pm
.dpm
.thermal
.high_to_low
= false;
8068 queue_thermal
= true;
8070 case 231: /* thermal high to low */
8071 DRM_DEBUG("IH: thermal high to low\n");
8072 rdev
->pm
.dpm
.thermal
.high_to_low
= true;
8073 queue_thermal
= true;
8075 case 233: /* GUI IDLE */
8076 DRM_DEBUG("IH: GUI idle\n");
8078 case 241: /* SDMA Privileged inst */
8079 case 247: /* SDMA Privileged inst */
8080 DRM_ERROR("Illegal instruction in SDMA command stream\n");
8081 /* XXX check the bitfield order! */
8082 me_id
= (ring_id
& 0x3) >> 0;
8083 queue_id
= (ring_id
& 0xc) >> 2;
8118 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id
, src_data
);
8122 /* wptr/rptr are in bytes! */
8124 rptr
&= rdev
->ih
.ptr_mask
;
8125 WREG32(IH_RB_RPTR
, rptr
);
8128 schedule_work(&rdev
->dp_work
);
8130 schedule_delayed_work(&rdev
->hotplug_work
, 0);
8132 rdev
->needs_reset
= true;
8133 wake_up_all(&rdev
->fence_queue
);
8136 schedule_work(&rdev
->pm
.dpm
.thermal
.work
);
8137 rdev
->ih
.rptr
= rptr
;
8138 atomic_set(&rdev
->ih
.lock
, 0);
8140 /* make sure wptr hasn't changed while processing */
8141 wptr
= cik_get_ih_wptr(rdev
);
8149 * startup/shutdown callbacks
8151 static void cik_uvd_init(struct radeon_device
*rdev
)
8158 r
= radeon_uvd_init(rdev
);
8160 dev_err(rdev
->dev
, "failed UVD (%d) init.\n", r
);
8162 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
8163 * to early fails cik_uvd_start() and thus nothing happens
8164 * there. So it is pointless to try to go through that code
8165 * hence why we disable uvd here.
8170 rdev
->ring
[R600_RING_TYPE_UVD_INDEX
].ring_obj
= NULL
;
8171 r600_ring_init(rdev
, &rdev
->ring
[R600_RING_TYPE_UVD_INDEX
], 4096);
8174 static void cik_uvd_start(struct radeon_device
*rdev
)
8181 r
= radeon_uvd_resume(rdev
);
8183 dev_err(rdev
->dev
, "failed UVD resume (%d).\n", r
);
8186 r
= uvd_v4_2_resume(rdev
);
8188 dev_err(rdev
->dev
, "failed UVD 4.2 resume (%d).\n", r
);
8191 r
= radeon_fence_driver_start_ring(rdev
, R600_RING_TYPE_UVD_INDEX
);
8193 dev_err(rdev
->dev
, "failed initializing UVD fences (%d).\n", r
);
8199 rdev
->ring
[R600_RING_TYPE_UVD_INDEX
].ring_size
= 0;
8202 static void cik_uvd_resume(struct radeon_device
*rdev
)
8204 struct radeon_ring
*ring
;
8207 if (!rdev
->has_uvd
|| !rdev
->ring
[R600_RING_TYPE_UVD_INDEX
].ring_size
)
8210 ring
= &rdev
->ring
[R600_RING_TYPE_UVD_INDEX
];
8211 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, 0, PACKET0(UVD_NO_OP
, 0));
8213 dev_err(rdev
->dev
, "failed initializing UVD ring (%d).\n", r
);
8216 r
= uvd_v1_0_init(rdev
);
8218 dev_err(rdev
->dev
, "failed initializing UVD (%d).\n", r
);
8223 static void cik_vce_init(struct radeon_device
*rdev
)
8230 r
= radeon_vce_init(rdev
);
8232 dev_err(rdev
->dev
, "failed VCE (%d) init.\n", r
);
8234 * At this point rdev->vce.vcpu_bo is NULL which trickles down
8235 * to early fails cik_vce_start() and thus nothing happens
8236 * there. So it is pointless to try to go through that code
8237 * hence why we disable vce here.
8242 rdev
->ring
[TN_RING_TYPE_VCE1_INDEX
].ring_obj
= NULL
;
8243 r600_ring_init(rdev
, &rdev
->ring
[TN_RING_TYPE_VCE1_INDEX
], 4096);
8244 rdev
->ring
[TN_RING_TYPE_VCE2_INDEX
].ring_obj
= NULL
;
8245 r600_ring_init(rdev
, &rdev
->ring
[TN_RING_TYPE_VCE2_INDEX
], 4096);
8248 static void cik_vce_start(struct radeon_device
*rdev
)
8255 r
= radeon_vce_resume(rdev
);
8257 dev_err(rdev
->dev
, "failed VCE resume (%d).\n", r
);
8260 r
= vce_v2_0_resume(rdev
);
8262 dev_err(rdev
->dev
, "failed VCE resume (%d).\n", r
);
8265 r
= radeon_fence_driver_start_ring(rdev
, TN_RING_TYPE_VCE1_INDEX
);
8267 dev_err(rdev
->dev
, "failed initializing VCE1 fences (%d).\n", r
);
8270 r
= radeon_fence_driver_start_ring(rdev
, TN_RING_TYPE_VCE2_INDEX
);
8272 dev_err(rdev
->dev
, "failed initializing VCE2 fences (%d).\n", r
);
8278 rdev
->ring
[TN_RING_TYPE_VCE1_INDEX
].ring_size
= 0;
8279 rdev
->ring
[TN_RING_TYPE_VCE2_INDEX
].ring_size
= 0;
8282 static void cik_vce_resume(struct radeon_device
*rdev
)
8284 struct radeon_ring
*ring
;
8287 if (!rdev
->has_vce
|| !rdev
->ring
[TN_RING_TYPE_VCE1_INDEX
].ring_size
)
8290 ring
= &rdev
->ring
[TN_RING_TYPE_VCE1_INDEX
];
8291 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, 0, VCE_CMD_NO_OP
);
8293 dev_err(rdev
->dev
, "failed initializing VCE1 ring (%d).\n", r
);
8296 ring
= &rdev
->ring
[TN_RING_TYPE_VCE2_INDEX
];
8297 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, 0, VCE_CMD_NO_OP
);
8299 dev_err(rdev
->dev
, "failed initializing VCE1 ring (%d).\n", r
);
8302 r
= vce_v1_0_init(rdev
);
8304 dev_err(rdev
->dev
, "failed initializing VCE (%d).\n", r
);
8310 * cik_startup - program the asic to a functional state
8312 * @rdev: radeon_device pointer
8314 * Programs the asic to a functional state (CIK).
8315 * Called by cik_init() and cik_resume().
8316 * Returns 0 for success, error for failure.
8318 static int cik_startup(struct radeon_device
*rdev
)
8320 struct radeon_ring
*ring
;
8324 /* enable pcie gen2/3 link */
8325 cik_pcie_gen3_enable(rdev
);
8327 cik_program_aspm(rdev
);
8329 /* scratch needs to be initialized before MC */
8330 r
= r600_vram_scratch_init(rdev
);
8334 cik_mc_program(rdev
);
8336 if (!(rdev
->flags
& RADEON_IS_IGP
) && !rdev
->pm
.dpm_enabled
) {
8337 r
= ci_mc_load_microcode(rdev
);
8339 DRM_ERROR("Failed to load MC firmware!\n");
8344 r
= cik_pcie_gart_enable(rdev
);
8349 /* allocate rlc buffers */
8350 if (rdev
->flags
& RADEON_IS_IGP
) {
8351 if (rdev
->family
== CHIP_KAVERI
) {
8352 rdev
->rlc
.reg_list
= spectre_rlc_save_restore_register_list
;
8353 rdev
->rlc
.reg_list_size
=
8354 (u32
)ARRAY_SIZE(spectre_rlc_save_restore_register_list
);
8356 rdev
->rlc
.reg_list
= kalindi_rlc_save_restore_register_list
;
8357 rdev
->rlc
.reg_list_size
=
8358 (u32
)ARRAY_SIZE(kalindi_rlc_save_restore_register_list
);
8361 rdev
->rlc
.cs_data
= ci_cs_data
;
8362 rdev
->rlc
.cp_table_size
= ALIGN(CP_ME_TABLE_SIZE
* 5 * 4, 2048); /* CP JT */
8363 rdev
->rlc
.cp_table_size
+= 64 * 1024; /* GDS */
8364 r
= sumo_rlc_init(rdev
);
8366 DRM_ERROR("Failed to init rlc BOs!\n");
8370 /* allocate wb buffer */
8371 r
= radeon_wb_init(rdev
);
8375 /* allocate mec buffers */
8376 r
= cik_mec_init(rdev
);
8378 DRM_ERROR("Failed to init MEC BOs!\n");
8382 r
= radeon_fence_driver_start_ring(rdev
, RADEON_RING_TYPE_GFX_INDEX
);
8384 dev_err(rdev
->dev
, "failed initializing CP fences (%d).\n", r
);
8388 r
= radeon_fence_driver_start_ring(rdev
, CAYMAN_RING_TYPE_CP1_INDEX
);
8390 dev_err(rdev
->dev
, "failed initializing CP fences (%d).\n", r
);
8394 r
= radeon_fence_driver_start_ring(rdev
, CAYMAN_RING_TYPE_CP2_INDEX
);
8396 dev_err(rdev
->dev
, "failed initializing CP fences (%d).\n", r
);
8400 r
= radeon_fence_driver_start_ring(rdev
, R600_RING_TYPE_DMA_INDEX
);
8402 dev_err(rdev
->dev
, "failed initializing DMA fences (%d).\n", r
);
8406 r
= radeon_fence_driver_start_ring(rdev
, CAYMAN_RING_TYPE_DMA1_INDEX
);
8408 dev_err(rdev
->dev
, "failed initializing DMA fences (%d).\n", r
);
8412 cik_uvd_start(rdev
);
8413 cik_vce_start(rdev
);
8416 if (!rdev
->irq
.installed
) {
8417 r
= radeon_irq_kms_init(rdev
);
8422 r
= cik_irq_init(rdev
);
8424 DRM_ERROR("radeon: IH init failed (%d).\n", r
);
8425 radeon_irq_kms_fini(rdev
);
8430 if (rdev
->family
== CHIP_HAWAII
) {
8432 nop
= PACKET3(PACKET3_NOP
, 0x3FFF);
8434 nop
= RADEON_CP_PACKET2
;
8436 nop
= PACKET3(PACKET3_NOP
, 0x3FFF);
8439 ring
= &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
];
8440 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, RADEON_WB_CP_RPTR_OFFSET
,
8445 /* set up the compute queues */
8446 /* type-2 packets are deprecated on MEC, use type-3 instead */
8447 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
];
8448 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, RADEON_WB_CP1_RPTR_OFFSET
,
8452 ring
->me
= 1; /* first MEC */
8453 ring
->pipe
= 0; /* first pipe */
8454 ring
->queue
= 0; /* first queue */
8455 ring
->wptr_offs
= CIK_WB_CP1_WPTR_OFFSET
;
8457 /* type-2 packets are deprecated on MEC, use type-3 instead */
8458 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
];
8459 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, RADEON_WB_CP2_RPTR_OFFSET
,
8463 /* dGPU only have 1 MEC */
8464 ring
->me
= 1; /* first MEC */
8465 ring
->pipe
= 0; /* first pipe */
8466 ring
->queue
= 1; /* second queue */
8467 ring
->wptr_offs
= CIK_WB_CP2_WPTR_OFFSET
;
8469 ring
= &rdev
->ring
[R600_RING_TYPE_DMA_INDEX
];
8470 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, R600_WB_DMA_RPTR_OFFSET
,
8471 SDMA_PACKET(SDMA_OPCODE_NOP
, 0, 0));
8475 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_DMA1_INDEX
];
8476 r
= radeon_ring_init(rdev
, ring
, ring
->ring_size
, CAYMAN_WB_DMA1_RPTR_OFFSET
,
8477 SDMA_PACKET(SDMA_OPCODE_NOP
, 0, 0));
8481 r
= cik_cp_resume(rdev
);
8485 r
= cik_sdma_resume(rdev
);
8489 cik_uvd_resume(rdev
);
8490 cik_vce_resume(rdev
);
8492 r
= radeon_ib_pool_init(rdev
);
8494 dev_err(rdev
->dev
, "IB initialization failed (%d).\n", r
);
8498 r
= radeon_vm_manager_init(rdev
);
8500 dev_err(rdev
->dev
, "vm manager initialization failed (%d).\n", r
);
8504 r
= radeon_audio_init(rdev
);
8512 * cik_resume - resume the asic to a functional state
8514 * @rdev: radeon_device pointer
8516 * Programs the asic to a functional state (CIK).
8518 * Returns 0 for success, error for failure.
8520 int cik_resume(struct radeon_device
*rdev
)
8525 atom_asic_init(rdev
->mode_info
.atom_context
);
8527 /* init golden registers */
8528 cik_init_golden_registers(rdev
);
8530 if (rdev
->pm
.pm_method
== PM_METHOD_DPM
)
8531 radeon_pm_resume(rdev
);
8533 rdev
->accel_working
= true;
8534 r
= cik_startup(rdev
);
8536 DRM_ERROR("cik startup failed on resume\n");
8537 rdev
->accel_working
= false;
8546 * cik_suspend - suspend the asic
8548 * @rdev: radeon_device pointer
8550 * Bring the chip into a state suitable for suspend (CIK).
8551 * Called at suspend.
8552 * Returns 0 for success.
8554 int cik_suspend(struct radeon_device
*rdev
)
8556 radeon_pm_suspend(rdev
);
8557 radeon_audio_fini(rdev
);
8558 radeon_vm_manager_fini(rdev
);
8559 cik_cp_enable(rdev
, false);
8560 cik_sdma_enable(rdev
, false);
8561 if (rdev
->has_uvd
) {
8562 uvd_v1_0_fini(rdev
);
8563 radeon_uvd_suspend(rdev
);
8566 radeon_vce_suspend(rdev
);
8569 cik_irq_suspend(rdev
);
8570 radeon_wb_disable(rdev
);
8571 cik_pcie_gart_disable(rdev
);
8575 /* Plan is to move initialization in that function and use
8576 * helper function so that radeon_device_init pretty much
8577 * do nothing more than calling asic specific function. This
8578 * should also allow to remove a bunch of callback function
8582 * cik_init - asic specific driver and hw init
8584 * @rdev: radeon_device pointer
8586 * Setup asic specific driver variables and program the hw
8587 * to a functional state (CIK).
8588 * Called at driver startup.
8589 * Returns 0 for success, errors for failure.
8591 int cik_init(struct radeon_device
*rdev
)
8593 struct radeon_ring
*ring
;
8597 if (!radeon_get_bios(rdev
)) {
8598 if (ASIC_IS_AVIVO(rdev
))
8601 /* Must be an ATOMBIOS */
8602 if (!rdev
->is_atom_bios
) {
8603 dev_err(rdev
->dev
, "Expecting atombios for cayman GPU\n");
8606 r
= radeon_atombios_init(rdev
);
8610 /* Post card if necessary */
8611 if (!radeon_card_posted(rdev
)) {
8613 dev_err(rdev
->dev
, "Card not posted and no BIOS - ignoring\n");
8616 DRM_INFO("GPU not posted. posting now...\n");
8617 atom_asic_init(rdev
->mode_info
.atom_context
);
8619 /* init golden registers */
8620 cik_init_golden_registers(rdev
);
8621 /* Initialize scratch registers */
8622 cik_scratch_init(rdev
);
8623 /* Initialize surface registers */
8624 radeon_surface_init(rdev
);
8625 /* Initialize clocks */
8626 radeon_get_clock_info(rdev
->ddev
);
8629 r
= radeon_fence_driver_init(rdev
);
8633 /* initialize memory controller */
8634 r
= cik_mc_init(rdev
);
8637 /* Memory manager */
8638 r
= radeon_bo_init(rdev
);
8642 if (rdev
->flags
& RADEON_IS_IGP
) {
8643 if (!rdev
->me_fw
|| !rdev
->pfp_fw
|| !rdev
->ce_fw
||
8644 !rdev
->mec_fw
|| !rdev
->sdma_fw
|| !rdev
->rlc_fw
) {
8645 r
= cik_init_microcode(rdev
);
8647 DRM_ERROR("Failed to load firmware!\n");
8652 if (!rdev
->me_fw
|| !rdev
->pfp_fw
|| !rdev
->ce_fw
||
8653 !rdev
->mec_fw
|| !rdev
->sdma_fw
|| !rdev
->rlc_fw
||
8655 r
= cik_init_microcode(rdev
);
8657 DRM_ERROR("Failed to load firmware!\n");
8663 /* Initialize power management */
8664 radeon_pm_init(rdev
);
8666 ring
= &rdev
->ring
[RADEON_RING_TYPE_GFX_INDEX
];
8667 ring
->ring_obj
= NULL
;
8668 r600_ring_init(rdev
, ring
, 1024 * 1024);
8670 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP1_INDEX
];
8671 ring
->ring_obj
= NULL
;
8672 r600_ring_init(rdev
, ring
, 1024 * 1024);
8673 r
= radeon_doorbell_get(rdev
, &ring
->doorbell_index
);
8677 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_CP2_INDEX
];
8678 ring
->ring_obj
= NULL
;
8679 r600_ring_init(rdev
, ring
, 1024 * 1024);
8680 r
= radeon_doorbell_get(rdev
, &ring
->doorbell_index
);
8684 ring
= &rdev
->ring
[R600_RING_TYPE_DMA_INDEX
];
8685 ring
->ring_obj
= NULL
;
8686 r600_ring_init(rdev
, ring
, 256 * 1024);
8688 ring
= &rdev
->ring
[CAYMAN_RING_TYPE_DMA1_INDEX
];
8689 ring
->ring_obj
= NULL
;
8690 r600_ring_init(rdev
, ring
, 256 * 1024);
8695 rdev
->ih
.ring_obj
= NULL
;
8696 r600_ih_ring_init(rdev
, 64 * 1024);
8698 r
= r600_pcie_gart_init(rdev
);
8702 rdev
->accel_working
= true;
8703 r
= cik_startup(rdev
);
8705 dev_err(rdev
->dev
, "disabling GPU acceleration\n");
8707 cik_sdma_fini(rdev
);
8709 sumo_rlc_fini(rdev
);
8711 radeon_wb_fini(rdev
);
8712 radeon_ib_pool_fini(rdev
);
8713 radeon_vm_manager_fini(rdev
);
8714 radeon_irq_kms_fini(rdev
);
8715 cik_pcie_gart_fini(rdev
);
8716 rdev
->accel_working
= false;
8719 /* Don't start up if the MC ucode is missing.
8720 * The default clocks and voltages before the MC ucode
8721 * is loaded are not suffient for advanced operations.
8723 if (!rdev
->mc_fw
&& !(rdev
->flags
& RADEON_IS_IGP
)) {
8724 DRM_ERROR("radeon: MC ucode required for NI+.\n");
8732 * cik_fini - asic specific driver and hw fini
8734 * @rdev: radeon_device pointer
8736 * Tear down the asic specific driver variables and program the hw
8737 * to an idle state (CIK).
8738 * Called at driver unload.
8740 void cik_fini(struct radeon_device
*rdev
)
8742 radeon_pm_fini(rdev
);
8744 cik_sdma_fini(rdev
);
8748 sumo_rlc_fini(rdev
);
8750 radeon_wb_fini(rdev
);
8751 radeon_vm_manager_fini(rdev
);
8752 radeon_ib_pool_fini(rdev
);
8753 radeon_irq_kms_fini(rdev
);
8754 uvd_v1_0_fini(rdev
);
8755 radeon_uvd_fini(rdev
);
8756 radeon_vce_fini(rdev
);
8757 cik_pcie_gart_fini(rdev
);
8758 r600_vram_scratch_fini(rdev
);
8759 radeon_gem_fini(rdev
);
8760 radeon_fence_driver_fini(rdev
);
8761 radeon_bo_fini(rdev
);
8762 radeon_atombios_fini(rdev
);
8767 void dce8_program_fmt(struct drm_encoder
*encoder
)
8769 struct drm_device
*dev
= encoder
->dev
;
8770 struct radeon_device
*rdev
= dev
->dev_private
;
8771 struct radeon_encoder
*radeon_encoder
= to_radeon_encoder(encoder
);
8772 struct radeon_crtc
*radeon_crtc
= to_radeon_crtc(encoder
->crtc
);
8773 struct drm_connector
*connector
= radeon_get_connector_for_encoder(encoder
);
8776 enum radeon_connector_dither dither
= RADEON_FMT_DITHER_DISABLE
;
8779 struct radeon_connector
*radeon_connector
= to_radeon_connector(connector
);
8780 bpc
= radeon_get_monitor_bpc(connector
);
8781 dither
= radeon_connector
->dither
;
8784 /* LVDS/eDP FMT is set up by atom */
8785 if (radeon_encoder
->devices
& ATOM_DEVICE_LCD_SUPPORT
)
8788 /* not needed for analog */
8789 if ((radeon_encoder
->encoder_id
== ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1
) ||
8790 (radeon_encoder
->encoder_id
== ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2
))
8798 if (dither
== RADEON_FMT_DITHER_ENABLE
)
8799 /* XXX sort out optimal dither settings */
8800 tmp
|= (FMT_FRAME_RANDOM_ENABLE
| FMT_HIGHPASS_RANDOM_ENABLE
|
8801 FMT_SPATIAL_DITHER_EN
| FMT_SPATIAL_DITHER_DEPTH(0));
8803 tmp
|= (FMT_TRUNCATE_EN
| FMT_TRUNCATE_DEPTH(0));
8806 if (dither
== RADEON_FMT_DITHER_ENABLE
)
8807 /* XXX sort out optimal dither settings */
8808 tmp
|= (FMT_FRAME_RANDOM_ENABLE
| FMT_HIGHPASS_RANDOM_ENABLE
|
8809 FMT_RGB_RANDOM_ENABLE
|
8810 FMT_SPATIAL_DITHER_EN
| FMT_SPATIAL_DITHER_DEPTH(1));
8812 tmp
|= (FMT_TRUNCATE_EN
| FMT_TRUNCATE_DEPTH(1));
8815 if (dither
== RADEON_FMT_DITHER_ENABLE
)
8816 /* XXX sort out optimal dither settings */
8817 tmp
|= (FMT_FRAME_RANDOM_ENABLE
| FMT_HIGHPASS_RANDOM_ENABLE
|
8818 FMT_RGB_RANDOM_ENABLE
|
8819 FMT_SPATIAL_DITHER_EN
| FMT_SPATIAL_DITHER_DEPTH(2));
8821 tmp
|= (FMT_TRUNCATE_EN
| FMT_TRUNCATE_DEPTH(2));
8828 WREG32(FMT_BIT_DEPTH_CONTROL
+ radeon_crtc
->crtc_offset
, tmp
);
8831 /* display watermark setup */
8833 * dce8_line_buffer_adjust - Set up the line buffer
8835 * @rdev: radeon_device pointer
8836 * @radeon_crtc: the selected display controller
8837 * @mode: the current display mode on the selected display
8840 * Setup up the line buffer allocation for
8841 * the selected display controller (CIK).
8842 * Returns the line buffer size in pixels.
8844 static u32
dce8_line_buffer_adjust(struct radeon_device
*rdev
,
8845 struct radeon_crtc
*radeon_crtc
,
8846 struct drm_display_mode
*mode
)
8848 u32 tmp
, buffer_alloc
, i
;
8849 u32 pipe_offset
= radeon_crtc
->crtc_id
* 0x20;
8852 * There are 6 line buffers, one for each display controllers.
8853 * There are 3 partitions per LB. Select the number of partitions
8854 * to enable based on the display width. For display widths larger
8855 * than 4096, you need use to use 2 display controllers and combine
8856 * them using the stereo blender.
8858 if (radeon_crtc
->base
.enabled
&& mode
) {
8859 if (mode
->crtc_hdisplay
< 1920) {
8862 } else if (mode
->crtc_hdisplay
< 2560) {
8865 } else if (mode
->crtc_hdisplay
< 4096) {
8867 buffer_alloc
= (rdev
->flags
& RADEON_IS_IGP
) ? 2 : 4;
8869 DRM_DEBUG_KMS("Mode too big for LB!\n");
8871 buffer_alloc
= (rdev
->flags
& RADEON_IS_IGP
) ? 2 : 4;
8878 WREG32(LB_MEMORY_CTRL
+ radeon_crtc
->crtc_offset
,
8879 LB_MEMORY_CONFIG(tmp
) | LB_MEMORY_SIZE(0x6B0));
8881 WREG32(PIPE0_DMIF_BUFFER_CONTROL
+ pipe_offset
,
8882 DMIF_BUFFERS_ALLOCATED(buffer_alloc
));
8883 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
8884 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL
+ pipe_offset
) &
8885 DMIF_BUFFERS_ALLOCATED_COMPLETED
)
8890 if (radeon_crtc
->base
.enabled
&& mode
) {
8902 /* controller not enabled, so no lb used */
8907 * cik_get_number_of_dram_channels - get the number of dram channels
8909 * @rdev: radeon_device pointer
8911 * Look up the number of video ram channels (CIK).
8912 * Used for display watermark bandwidth calculations
8913 * Returns the number of dram channels
8915 static u32
cik_get_number_of_dram_channels(struct radeon_device
*rdev
)
8917 u32 tmp
= RREG32(MC_SHARED_CHMAP
);
8919 switch ((tmp
& NOOFCHAN_MASK
) >> NOOFCHAN_SHIFT
) {
8942 struct dce8_wm_params
{
8943 u32 dram_channels
; /* number of dram channels */
8944 u32 yclk
; /* bandwidth per dram data pin in kHz */
8945 u32 sclk
; /* engine clock in kHz */
8946 u32 disp_clk
; /* display clock in kHz */
8947 u32 src_width
; /* viewport width */
8948 u32 active_time
; /* active display time in ns */
8949 u32 blank_time
; /* blank time in ns */
8950 bool interlaced
; /* mode is interlaced */
8951 fixed20_12 vsc
; /* vertical scale ratio */
8952 u32 num_heads
; /* number of active crtcs */
8953 u32 bytes_per_pixel
; /* bytes per pixel display + overlay */
8954 u32 lb_size
; /* line buffer allocated to pipe */
8955 u32 vtaps
; /* vertical scaler taps */
8959 * dce8_dram_bandwidth - get the dram bandwidth
8961 * @wm: watermark calculation data
8963 * Calculate the raw dram bandwidth (CIK).
8964 * Used for display watermark bandwidth calculations
8965 * Returns the dram bandwidth in MBytes/s
8967 static u32
dce8_dram_bandwidth(struct dce8_wm_params
*wm
)
8969 /* Calculate raw DRAM Bandwidth */
8970 fixed20_12 dram_efficiency
; /* 0.7 */
8971 fixed20_12 yclk
, dram_channels
, bandwidth
;
8974 a
.full
= dfixed_const(1000);
8975 yclk
.full
= dfixed_const(wm
->yclk
);
8976 yclk
.full
= dfixed_div(yclk
, a
);
8977 dram_channels
.full
= dfixed_const(wm
->dram_channels
* 4);
8978 a
.full
= dfixed_const(10);
8979 dram_efficiency
.full
= dfixed_const(7);
8980 dram_efficiency
.full
= dfixed_div(dram_efficiency
, a
);
8981 bandwidth
.full
= dfixed_mul(dram_channels
, yclk
);
8982 bandwidth
.full
= dfixed_mul(bandwidth
, dram_efficiency
);
8984 return dfixed_trunc(bandwidth
);
8988 * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
8990 * @wm: watermark calculation data
8992 * Calculate the dram bandwidth used for display (CIK).
8993 * Used for display watermark bandwidth calculations
8994 * Returns the dram bandwidth for display in MBytes/s
8996 static u32
dce8_dram_bandwidth_for_display(struct dce8_wm_params
*wm
)
8998 /* Calculate DRAM Bandwidth and the part allocated to display. */
8999 fixed20_12 disp_dram_allocation
; /* 0.3 to 0.7 */
9000 fixed20_12 yclk
, dram_channels
, bandwidth
;
9003 a
.full
= dfixed_const(1000);
9004 yclk
.full
= dfixed_const(wm
->yclk
);
9005 yclk
.full
= dfixed_div(yclk
, a
);
9006 dram_channels
.full
= dfixed_const(wm
->dram_channels
* 4);
9007 a
.full
= dfixed_const(10);
9008 disp_dram_allocation
.full
= dfixed_const(3); /* XXX worse case value 0.3 */
9009 disp_dram_allocation
.full
= dfixed_div(disp_dram_allocation
, a
);
9010 bandwidth
.full
= dfixed_mul(dram_channels
, yclk
);
9011 bandwidth
.full
= dfixed_mul(bandwidth
, disp_dram_allocation
);
9013 return dfixed_trunc(bandwidth
);
9017 * dce8_data_return_bandwidth - get the data return bandwidth
9019 * @wm: watermark calculation data
9021 * Calculate the data return bandwidth used for display (CIK).
9022 * Used for display watermark bandwidth calculations
9023 * Returns the data return bandwidth in MBytes/s
9025 static u32
dce8_data_return_bandwidth(struct dce8_wm_params
*wm
)
9027 /* Calculate the display Data return Bandwidth */
9028 fixed20_12 return_efficiency
; /* 0.8 */
9029 fixed20_12 sclk
, bandwidth
;
9032 a
.full
= dfixed_const(1000);
9033 sclk
.full
= dfixed_const(wm
->sclk
);
9034 sclk
.full
= dfixed_div(sclk
, a
);
9035 a
.full
= dfixed_const(10);
9036 return_efficiency
.full
= dfixed_const(8);
9037 return_efficiency
.full
= dfixed_div(return_efficiency
, a
);
9038 a
.full
= dfixed_const(32);
9039 bandwidth
.full
= dfixed_mul(a
, sclk
);
9040 bandwidth
.full
= dfixed_mul(bandwidth
, return_efficiency
);
9042 return dfixed_trunc(bandwidth
);
9046 * dce8_dmif_request_bandwidth - get the dmif bandwidth
9048 * @wm: watermark calculation data
9050 * Calculate the dmif bandwidth used for display (CIK).
9051 * Used for display watermark bandwidth calculations
9052 * Returns the dmif bandwidth in MBytes/s
9054 static u32
dce8_dmif_request_bandwidth(struct dce8_wm_params
*wm
)
9056 /* Calculate the DMIF Request Bandwidth */
9057 fixed20_12 disp_clk_request_efficiency
; /* 0.8 */
9058 fixed20_12 disp_clk
, bandwidth
;
9061 a
.full
= dfixed_const(1000);
9062 disp_clk
.full
= dfixed_const(wm
->disp_clk
);
9063 disp_clk
.full
= dfixed_div(disp_clk
, a
);
9064 a
.full
= dfixed_const(32);
9065 b
.full
= dfixed_mul(a
, disp_clk
);
9067 a
.full
= dfixed_const(10);
9068 disp_clk_request_efficiency
.full
= dfixed_const(8);
9069 disp_clk_request_efficiency
.full
= dfixed_div(disp_clk_request_efficiency
, a
);
9071 bandwidth
.full
= dfixed_mul(b
, disp_clk_request_efficiency
);
9073 return dfixed_trunc(bandwidth
);
9077 * dce8_available_bandwidth - get the min available bandwidth
9079 * @wm: watermark calculation data
9081 * Calculate the min available bandwidth used for display (CIK).
9082 * Used for display watermark bandwidth calculations
9083 * Returns the min available bandwidth in MBytes/s
9085 static u32
dce8_available_bandwidth(struct dce8_wm_params
*wm
)
9087 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
9088 u32 dram_bandwidth
= dce8_dram_bandwidth(wm
);
9089 u32 data_return_bandwidth
= dce8_data_return_bandwidth(wm
);
9090 u32 dmif_req_bandwidth
= dce8_dmif_request_bandwidth(wm
);
9092 return min(dram_bandwidth
, min(data_return_bandwidth
, dmif_req_bandwidth
));
9096 * dce8_average_bandwidth - get the average available bandwidth
9098 * @wm: watermark calculation data
9100 * Calculate the average available bandwidth used for display (CIK).
9101 * Used for display watermark bandwidth calculations
9102 * Returns the average available bandwidth in MBytes/s
9104 static u32
dce8_average_bandwidth(struct dce8_wm_params
*wm
)
9106 /* Calculate the display mode Average Bandwidth
9107 * DisplayMode should contain the source and destination dimensions,
9111 fixed20_12 line_time
;
9112 fixed20_12 src_width
;
9113 fixed20_12 bandwidth
;
9116 a
.full
= dfixed_const(1000);
9117 line_time
.full
= dfixed_const(wm
->active_time
+ wm
->blank_time
);
9118 line_time
.full
= dfixed_div(line_time
, a
);
9119 bpp
.full
= dfixed_const(wm
->bytes_per_pixel
);
9120 src_width
.full
= dfixed_const(wm
->src_width
);
9121 bandwidth
.full
= dfixed_mul(src_width
, bpp
);
9122 bandwidth
.full
= dfixed_mul(bandwidth
, wm
->vsc
);
9123 bandwidth
.full
= dfixed_div(bandwidth
, line_time
);
9125 return dfixed_trunc(bandwidth
);
9129 * dce8_latency_watermark - get the latency watermark
9131 * @wm: watermark calculation data
9133 * Calculate the latency watermark (CIK).
9134 * Used for display watermark bandwidth calculations
9135 * Returns the latency watermark in ns
9137 static u32
dce8_latency_watermark(struct dce8_wm_params
*wm
)
9139 /* First calculate the latency in ns */
9140 u32 mc_latency
= 2000; /* 2000 ns. */
9141 u32 available_bandwidth
= dce8_available_bandwidth(wm
);
9142 u32 worst_chunk_return_time
= (512 * 8 * 1000) / available_bandwidth
;
9143 u32 cursor_line_pair_return_time
= (128 * 4 * 1000) / available_bandwidth
;
9144 u32 dc_latency
= 40000000 / wm
->disp_clk
; /* dc pipe latency */
9145 u32 other_heads_data_return_time
= ((wm
->num_heads
+ 1) * worst_chunk_return_time
) +
9146 (wm
->num_heads
* cursor_line_pair_return_time
);
9147 u32 latency
= mc_latency
+ other_heads_data_return_time
+ dc_latency
;
9148 u32 max_src_lines_per_dst_line
, lb_fill_bw
, line_fill_time
;
9149 u32 tmp
, dmif_size
= 12288;
9152 if (wm
->num_heads
== 0)
9155 a
.full
= dfixed_const(2);
9156 b
.full
= dfixed_const(1);
9157 if ((wm
->vsc
.full
> a
.full
) ||
9158 ((wm
->vsc
.full
> b
.full
) && (wm
->vtaps
>= 3)) ||
9160 ((wm
->vsc
.full
>= a
.full
) && wm
->interlaced
))
9161 max_src_lines_per_dst_line
= 4;
9163 max_src_lines_per_dst_line
= 2;
9165 a
.full
= dfixed_const(available_bandwidth
);
9166 b
.full
= dfixed_const(wm
->num_heads
);
9167 a
.full
= dfixed_div(a
, b
);
9168 tmp
= div_u64((u64
) dmif_size
* (u64
) wm
->disp_clk
, mc_latency
+ 512);
9169 tmp
= min(dfixed_trunc(a
), tmp
);
9171 lb_fill_bw
= min(tmp
, wm
->disp_clk
* wm
->bytes_per_pixel
/ 1000);
9173 a
.full
= dfixed_const(max_src_lines_per_dst_line
* wm
->src_width
* wm
->bytes_per_pixel
);
9174 b
.full
= dfixed_const(1000);
9175 c
.full
= dfixed_const(lb_fill_bw
);
9176 b
.full
= dfixed_div(c
, b
);
9177 a
.full
= dfixed_div(a
, b
);
9178 line_fill_time
= dfixed_trunc(a
);
9180 if (line_fill_time
< wm
->active_time
)
9183 return latency
+ (line_fill_time
- wm
->active_time
);
9188 * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
9189 * average and available dram bandwidth
9191 * @wm: watermark calculation data
9193 * Check if the display average bandwidth fits in the display
9194 * dram bandwidth (CIK).
9195 * Used for display watermark bandwidth calculations
9196 * Returns true if the display fits, false if not.
9198 static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params
*wm
)
9200 if (dce8_average_bandwidth(wm
) <=
9201 (dce8_dram_bandwidth_for_display(wm
) / wm
->num_heads
))
9208 * dce8_average_bandwidth_vs_available_bandwidth - check
9209 * average and available bandwidth
9211 * @wm: watermark calculation data
9213 * Check if the display average bandwidth fits in the display
9214 * available bandwidth (CIK).
9215 * Used for display watermark bandwidth calculations
9216 * Returns true if the display fits, false if not.
9218 static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params
*wm
)
9220 if (dce8_average_bandwidth(wm
) <=
9221 (dce8_available_bandwidth(wm
) / wm
->num_heads
))
9228 * dce8_check_latency_hiding - check latency hiding
9230 * @wm: watermark calculation data
9232 * Check latency hiding (CIK).
9233 * Used for display watermark bandwidth calculations
9234 * Returns true if the display fits, false if not.
9236 static bool dce8_check_latency_hiding(struct dce8_wm_params
*wm
)
9238 u32 lb_partitions
= wm
->lb_size
/ wm
->src_width
;
9239 u32 line_time
= wm
->active_time
+ wm
->blank_time
;
9240 u32 latency_tolerant_lines
;
9244 a
.full
= dfixed_const(1);
9245 if (wm
->vsc
.full
> a
.full
)
9246 latency_tolerant_lines
= 1;
9248 if (lb_partitions
<= (wm
->vtaps
+ 1))
9249 latency_tolerant_lines
= 1;
9251 latency_tolerant_lines
= 2;
9254 latency_hiding
= (latency_tolerant_lines
* line_time
+ wm
->blank_time
);
9256 if (dce8_latency_watermark(wm
) <= latency_hiding
)
9263 * dce8_program_watermarks - program display watermarks
9265 * @rdev: radeon_device pointer
9266 * @radeon_crtc: the selected display controller
9267 * @lb_size: line buffer size
9268 * @num_heads: number of display controllers in use
9270 * Calculate and program the display watermarks for the
9271 * selected display controller (CIK).
9273 static void dce8_program_watermarks(struct radeon_device
*rdev
,
9274 struct radeon_crtc
*radeon_crtc
,
9275 u32 lb_size
, u32 num_heads
)
9277 struct drm_display_mode
*mode
= &radeon_crtc
->base
.mode
;
9278 struct dce8_wm_params wm_low
, wm_high
;
9281 u32 latency_watermark_a
= 0, latency_watermark_b
= 0;
9284 if (radeon_crtc
->base
.enabled
&& num_heads
&& mode
) {
9285 active_time
= (u32
) div_u64((u64
)mode
->crtc_hdisplay
* 1000000,
9287 line_time
= (u32
) div_u64((u64
)mode
->crtc_htotal
* 1000000,
9289 line_time
= min(line_time
, (u32
)65535);
9291 /* watermark for high clocks */
9292 if ((rdev
->pm
.pm_method
== PM_METHOD_DPM
) &&
9293 rdev
->pm
.dpm_enabled
) {
9295 radeon_dpm_get_mclk(rdev
, false) * 10;
9297 radeon_dpm_get_sclk(rdev
, false) * 10;
9299 wm_high
.yclk
= rdev
->pm
.current_mclk
* 10;
9300 wm_high
.sclk
= rdev
->pm
.current_sclk
* 10;
9303 wm_high
.disp_clk
= mode
->clock
;
9304 wm_high
.src_width
= mode
->crtc_hdisplay
;
9305 wm_high
.active_time
= active_time
;
9306 wm_high
.blank_time
= line_time
- wm_high
.active_time
;
9307 wm_high
.interlaced
= false;
9308 if (mode
->flags
& DRM_MODE_FLAG_INTERLACE
)
9309 wm_high
.interlaced
= true;
9310 wm_high
.vsc
= radeon_crtc
->vsc
;
9312 if (radeon_crtc
->rmx_type
!= RMX_OFF
)
9314 wm_high
.bytes_per_pixel
= 4; /* XXX: get this from fb config */
9315 wm_high
.lb_size
= lb_size
;
9316 wm_high
.dram_channels
= cik_get_number_of_dram_channels(rdev
);
9317 wm_high
.num_heads
= num_heads
;
9319 /* set for high clocks */
9320 latency_watermark_a
= min(dce8_latency_watermark(&wm_high
), (u32
)65535);
9322 /* possibly force display priority to high */
9323 /* should really do this at mode validation time... */
9324 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high
) ||
9325 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high
) ||
9326 !dce8_check_latency_hiding(&wm_high
) ||
9327 (rdev
->disp_priority
== 2)) {
9328 DRM_DEBUG_KMS("force priority to high\n");
9331 /* watermark for low clocks */
9332 if ((rdev
->pm
.pm_method
== PM_METHOD_DPM
) &&
9333 rdev
->pm
.dpm_enabled
) {
9335 radeon_dpm_get_mclk(rdev
, true) * 10;
9337 radeon_dpm_get_sclk(rdev
, true) * 10;
9339 wm_low
.yclk
= rdev
->pm
.current_mclk
* 10;
9340 wm_low
.sclk
= rdev
->pm
.current_sclk
* 10;
9343 wm_low
.disp_clk
= mode
->clock
;
9344 wm_low
.src_width
= mode
->crtc_hdisplay
;
9345 wm_low
.active_time
= active_time
;
9346 wm_low
.blank_time
= line_time
- wm_low
.active_time
;
9347 wm_low
.interlaced
= false;
9348 if (mode
->flags
& DRM_MODE_FLAG_INTERLACE
)
9349 wm_low
.interlaced
= true;
9350 wm_low
.vsc
= radeon_crtc
->vsc
;
9352 if (radeon_crtc
->rmx_type
!= RMX_OFF
)
9354 wm_low
.bytes_per_pixel
= 4; /* XXX: get this from fb config */
9355 wm_low
.lb_size
= lb_size
;
9356 wm_low
.dram_channels
= cik_get_number_of_dram_channels(rdev
);
9357 wm_low
.num_heads
= num_heads
;
9359 /* set for low clocks */
9360 latency_watermark_b
= min(dce8_latency_watermark(&wm_low
), (u32
)65535);
9362 /* possibly force display priority to high */
9363 /* should really do this at mode validation time... */
9364 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low
) ||
9365 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low
) ||
9366 !dce8_check_latency_hiding(&wm_low
) ||
9367 (rdev
->disp_priority
== 2)) {
9368 DRM_DEBUG_KMS("force priority to high\n");
9371 /* Save number of lines the linebuffer leads before the scanout */
9372 radeon_crtc
->lb_vblank_lead_lines
= DIV_ROUND_UP(lb_size
, mode
->crtc_hdisplay
);
9376 wm_mask
= RREG32(DPG_WATERMARK_MASK_CONTROL
+ radeon_crtc
->crtc_offset
);
9378 tmp
&= ~LATENCY_WATERMARK_MASK(3);
9379 tmp
|= LATENCY_WATERMARK_MASK(1);
9380 WREG32(DPG_WATERMARK_MASK_CONTROL
+ radeon_crtc
->crtc_offset
, tmp
);
9381 WREG32(DPG_PIPE_LATENCY_CONTROL
+ radeon_crtc
->crtc_offset
,
9382 (LATENCY_LOW_WATERMARK(latency_watermark_a
) |
9383 LATENCY_HIGH_WATERMARK(line_time
)));
9385 tmp
= RREG32(DPG_WATERMARK_MASK_CONTROL
+ radeon_crtc
->crtc_offset
);
9386 tmp
&= ~LATENCY_WATERMARK_MASK(3);
9387 tmp
|= LATENCY_WATERMARK_MASK(2);
9388 WREG32(DPG_WATERMARK_MASK_CONTROL
+ radeon_crtc
->crtc_offset
, tmp
);
9389 WREG32(DPG_PIPE_LATENCY_CONTROL
+ radeon_crtc
->crtc_offset
,
9390 (LATENCY_LOW_WATERMARK(latency_watermark_b
) |
9391 LATENCY_HIGH_WATERMARK(line_time
)));
9392 /* restore original selection */
9393 WREG32(DPG_WATERMARK_MASK_CONTROL
+ radeon_crtc
->crtc_offset
, wm_mask
);
9395 /* save values for DPM */
9396 radeon_crtc
->line_time
= line_time
;
9397 radeon_crtc
->wm_high
= latency_watermark_a
;
9398 radeon_crtc
->wm_low
= latency_watermark_b
;
9402 * dce8_bandwidth_update - program display watermarks
9404 * @rdev: radeon_device pointer
9406 * Calculate and program the display watermarks and line
9407 * buffer allocation (CIK).
9409 void dce8_bandwidth_update(struct radeon_device
*rdev
)
9411 struct drm_display_mode
*mode
= NULL
;
9412 u32 num_heads
= 0, lb_size
;
9415 if (!rdev
->mode_info
.mode_config_initialized
)
9418 radeon_update_display_priority(rdev
);
9420 for (i
= 0; i
< rdev
->num_crtc
; i
++) {
9421 if (rdev
->mode_info
.crtcs
[i
]->base
.enabled
)
9424 for (i
= 0; i
< rdev
->num_crtc
; i
++) {
9425 mode
= &rdev
->mode_info
.crtcs
[i
]->base
.mode
;
9426 lb_size
= dce8_line_buffer_adjust(rdev
, rdev
->mode_info
.crtcs
[i
], mode
);
9427 dce8_program_watermarks(rdev
, rdev
->mode_info
.crtcs
[i
], lb_size
, num_heads
);
9432 * cik_get_gpu_clock_counter - return GPU clock counter snapshot
9434 * @rdev: radeon_device pointer
9436 * Fetches a GPU clock counter snapshot (SI).
9437 * Returns the 64 bit clock counter snapshot.
9439 uint64_t cik_get_gpu_clock_counter(struct radeon_device
*rdev
)
9443 mutex_lock(&rdev
->gpu_clock_mutex
);
9444 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT
, 1);
9445 clock
= (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB
) |
9446 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB
) << 32ULL);
9447 mutex_unlock(&rdev
->gpu_clock_mutex
);
9451 static int cik_set_uvd_clock(struct radeon_device
*rdev
, u32 clock
,
9452 u32 cntl_reg
, u32 status_reg
)
9455 struct atom_clock_dividers dividers
;
9458 r
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK
,
9459 clock
, false, ÷rs
);
9463 tmp
= RREG32_SMC(cntl_reg
);
9464 tmp
&= ~(DCLK_DIR_CNTL_EN
|DCLK_DIVIDER_MASK
);
9465 tmp
|= dividers
.post_divider
;
9466 WREG32_SMC(cntl_reg
, tmp
);
9468 for (i
= 0; i
< 100; i
++) {
9469 if (RREG32_SMC(status_reg
) & DCLK_STATUS
)
9479 int cik_set_uvd_clocks(struct radeon_device
*rdev
, u32 vclk
, u32 dclk
)
9483 r
= cik_set_uvd_clock(rdev
, vclk
, CG_VCLK_CNTL
, CG_VCLK_STATUS
);
9487 r
= cik_set_uvd_clock(rdev
, dclk
, CG_DCLK_CNTL
, CG_DCLK_STATUS
);
9491 int cik_set_vce_clocks(struct radeon_device
*rdev
, u32 evclk
, u32 ecclk
)
9494 struct atom_clock_dividers dividers
;
9497 r
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK
,
9498 ecclk
, false, ÷rs
);
9502 for (i
= 0; i
< 100; i
++) {
9503 if (RREG32_SMC(CG_ECLK_STATUS
) & ECLK_STATUS
)
9510 tmp
= RREG32_SMC(CG_ECLK_CNTL
);
9511 tmp
&= ~(ECLK_DIR_CNTL_EN
|ECLK_DIVIDER_MASK
);
9512 tmp
|= dividers
.post_divider
;
9513 WREG32_SMC(CG_ECLK_CNTL
, tmp
);
9515 for (i
= 0; i
< 100; i
++) {
9516 if (RREG32_SMC(CG_ECLK_STATUS
) & ECLK_STATUS
)
9526 static void cik_pcie_gen3_enable(struct radeon_device
*rdev
)
9528 struct pci_dev
*root
= rdev
->pdev
->bus
->self
;
9529 int bridge_pos
, gpu_pos
;
9530 u32 speed_cntl
, mask
, current_data_rate
;
9534 if (pci_is_root_bus(rdev
->pdev
->bus
))
9537 if (radeon_pcie_gen2
== 0)
9540 if (rdev
->flags
& RADEON_IS_IGP
)
9543 if (!(rdev
->flags
& RADEON_IS_PCIE
))
9546 ret
= drm_pcie_get_speed_cap_mask(rdev
->ddev
, &mask
);
9550 if (!(mask
& (DRM_PCIE_SPEED_50
| DRM_PCIE_SPEED_80
)))
9553 speed_cntl
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
9554 current_data_rate
= (speed_cntl
& LC_CURRENT_DATA_RATE_MASK
) >>
9555 LC_CURRENT_DATA_RATE_SHIFT
;
9556 if (mask
& DRM_PCIE_SPEED_80
) {
9557 if (current_data_rate
== 2) {
9558 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
9561 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
9562 } else if (mask
& DRM_PCIE_SPEED_50
) {
9563 if (current_data_rate
== 1) {
9564 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
9567 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
9570 bridge_pos
= pci_pcie_cap(root
);
9574 gpu_pos
= pci_pcie_cap(rdev
->pdev
);
9578 if (mask
& DRM_PCIE_SPEED_80
) {
9579 /* re-try equalization if gen3 is not already enabled */
9580 if (current_data_rate
!= 2) {
9581 u16 bridge_cfg
, gpu_cfg
;
9582 u16 bridge_cfg2
, gpu_cfg2
;
9583 u32 max_lw
, current_lw
, tmp
;
9585 pci_read_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL
, &bridge_cfg
);
9586 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL
, &gpu_cfg
);
9588 tmp16
= bridge_cfg
| PCI_EXP_LNKCTL_HAWD
;
9589 pci_write_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL
, tmp16
);
9591 tmp16
= gpu_cfg
| PCI_EXP_LNKCTL_HAWD
;
9592 pci_write_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL
, tmp16
);
9594 tmp
= RREG32_PCIE_PORT(PCIE_LC_STATUS1
);
9595 max_lw
= (tmp
& LC_DETECTED_LINK_WIDTH_MASK
) >> LC_DETECTED_LINK_WIDTH_SHIFT
;
9596 current_lw
= (tmp
& LC_OPERATING_LINK_WIDTH_MASK
) >> LC_OPERATING_LINK_WIDTH_SHIFT
;
9598 if (current_lw
< max_lw
) {
9599 tmp
= RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL
);
9600 if (tmp
& LC_RENEGOTIATION_SUPPORT
) {
9601 tmp
&= ~(LC_LINK_WIDTH_MASK
| LC_UPCONFIGURE_DIS
);
9602 tmp
|= (max_lw
<< LC_LINK_WIDTH_SHIFT
);
9603 tmp
|= LC_UPCONFIGURE_SUPPORT
| LC_RENEGOTIATE_EN
| LC_RECONFIG_NOW
;
9604 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL
, tmp
);
9608 for (i
= 0; i
< 10; i
++) {
9610 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_DEVSTA
, &tmp16
);
9611 if (tmp16
& PCI_EXP_DEVSTA_TRPND
)
9614 pci_read_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL
, &bridge_cfg
);
9615 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL
, &gpu_cfg
);
9617 pci_read_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL2
, &bridge_cfg2
);
9618 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL2
, &gpu_cfg2
);
9620 tmp
= RREG32_PCIE_PORT(PCIE_LC_CNTL4
);
9621 tmp
|= LC_SET_QUIESCE
;
9622 WREG32_PCIE_PORT(PCIE_LC_CNTL4
, tmp
);
9624 tmp
= RREG32_PCIE_PORT(PCIE_LC_CNTL4
);
9626 WREG32_PCIE_PORT(PCIE_LC_CNTL4
, tmp
);
9631 pci_read_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL
, &tmp16
);
9632 tmp16
&= ~PCI_EXP_LNKCTL_HAWD
;
9633 tmp16
|= (bridge_cfg
& PCI_EXP_LNKCTL_HAWD
);
9634 pci_write_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL
, tmp16
);
9636 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL
, &tmp16
);
9637 tmp16
&= ~PCI_EXP_LNKCTL_HAWD
;
9638 tmp16
|= (gpu_cfg
& PCI_EXP_LNKCTL_HAWD
);
9639 pci_write_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL
, tmp16
);
9642 pci_read_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL2
, &tmp16
);
9643 tmp16
&= ~((1 << 4) | (7 << 9));
9644 tmp16
|= (bridge_cfg2
& ((1 << 4) | (7 << 9)));
9645 pci_write_config_word(root
, bridge_pos
+ PCI_EXP_LNKCTL2
, tmp16
);
9647 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL2
, &tmp16
);
9648 tmp16
&= ~((1 << 4) | (7 << 9));
9649 tmp16
|= (gpu_cfg2
& ((1 << 4) | (7 << 9)));
9650 pci_write_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL2
, tmp16
);
9652 tmp
= RREG32_PCIE_PORT(PCIE_LC_CNTL4
);
9653 tmp
&= ~LC_SET_QUIESCE
;
9654 WREG32_PCIE_PORT(PCIE_LC_CNTL4
, tmp
);
9659 /* set the link speed */
9660 speed_cntl
|= LC_FORCE_EN_SW_SPEED_CHANGE
| LC_FORCE_DIS_HW_SPEED_CHANGE
;
9661 speed_cntl
&= ~LC_FORCE_DIS_SW_SPEED_CHANGE
;
9662 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, speed_cntl
);
9664 pci_read_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL2
, &tmp16
);
9666 if (mask
& DRM_PCIE_SPEED_80
)
9667 tmp16
|= 3; /* gen3 */
9668 else if (mask
& DRM_PCIE_SPEED_50
)
9669 tmp16
|= 2; /* gen2 */
9671 tmp16
|= 1; /* gen1 */
9672 pci_write_config_word(rdev
->pdev
, gpu_pos
+ PCI_EXP_LNKCTL2
, tmp16
);
9674 speed_cntl
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
9675 speed_cntl
|= LC_INITIATE_LINK_SPEED_CHANGE
;
9676 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, speed_cntl
);
9678 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
9679 speed_cntl
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
9680 if ((speed_cntl
& LC_INITIATE_LINK_SPEED_CHANGE
) == 0)
9686 static void cik_program_aspm(struct radeon_device
*rdev
)
9689 bool disable_l0s
= false, disable_l1
= false, disable_plloff_in_l1
= false;
9690 bool disable_clkreq
= false;
9692 if (radeon_aspm
== 0)
9695 /* XXX double check IGPs */
9696 if (rdev
->flags
& RADEON_IS_IGP
)
9699 if (!(rdev
->flags
& RADEON_IS_PCIE
))
9702 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL
);
9703 data
&= ~LC_XMIT_N_FTS_MASK
;
9704 data
|= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN
;
9706 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL
, data
);
9708 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_CNTL3
);
9709 data
|= LC_GO_TO_RECOVERY
;
9711 WREG32_PCIE_PORT(PCIE_LC_CNTL3
, data
);
9713 orig
= data
= RREG32_PCIE_PORT(PCIE_P_CNTL
);
9714 data
|= P_IGNORE_EDB_ERR
;
9716 WREG32_PCIE_PORT(PCIE_P_CNTL
, data
);
9718 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_CNTL
);
9719 data
&= ~(LC_L0S_INACTIVITY_MASK
| LC_L1_INACTIVITY_MASK
);
9720 data
|= LC_PMI_TO_L1_DIS
;
9722 data
|= LC_L0S_INACTIVITY(7);
9725 data
|= LC_L1_INACTIVITY(7);
9726 data
&= ~LC_PMI_TO_L1_DIS
;
9728 WREG32_PCIE_PORT(PCIE_LC_CNTL
, data
);
9730 if (!disable_plloff_in_l1
) {
9731 bool clk_req_support
;
9733 orig
= data
= RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0
);
9734 data
&= ~(PLL_POWER_STATE_IN_OFF_0_MASK
| PLL_POWER_STATE_IN_TXS2_0_MASK
);
9735 data
|= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9737 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0
, data
);
9739 orig
= data
= RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1
);
9740 data
&= ~(PLL_POWER_STATE_IN_OFF_1_MASK
| PLL_POWER_STATE_IN_TXS2_1_MASK
);
9741 data
|= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9743 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1
, data
);
9745 orig
= data
= RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0
);
9746 data
&= ~(PLL_POWER_STATE_IN_OFF_0_MASK
| PLL_POWER_STATE_IN_TXS2_0_MASK
);
9747 data
|= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9749 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0
, data
);
9751 orig
= data
= RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1
);
9752 data
&= ~(PLL_POWER_STATE_IN_OFF_1_MASK
| PLL_POWER_STATE_IN_TXS2_1_MASK
);
9753 data
|= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9755 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1
, data
);
9757 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL
);
9758 data
&= ~LC_DYN_LANES_PWR_STATE_MASK
;
9759 data
|= LC_DYN_LANES_PWR_STATE(3);
9761 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL
, data
);
9763 if (!disable_clkreq
&&
9764 !pci_is_root_bus(rdev
->pdev
->bus
)) {
9765 struct pci_dev
*root
= rdev
->pdev
->bus
->self
;
9768 clk_req_support
= false;
9769 pcie_capability_read_dword(root
, PCI_EXP_LNKCAP
, &lnkcap
);
9770 if (lnkcap
& PCI_EXP_LNKCAP_CLKPM
)
9771 clk_req_support
= true;
9773 clk_req_support
= false;
9776 if (clk_req_support
) {
9777 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_CNTL2
);
9778 data
|= LC_ALLOW_PDWN_IN_L1
| LC_ALLOW_PDWN_IN_L23
;
9780 WREG32_PCIE_PORT(PCIE_LC_CNTL2
, data
);
9782 orig
= data
= RREG32_SMC(THM_CLK_CNTL
);
9783 data
&= ~(CMON_CLK_SEL_MASK
| TMON_CLK_SEL_MASK
);
9784 data
|= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
9786 WREG32_SMC(THM_CLK_CNTL
, data
);
9788 orig
= data
= RREG32_SMC(MISC_CLK_CTRL
);
9789 data
&= ~(DEEP_SLEEP_CLK_SEL_MASK
| ZCLK_SEL_MASK
);
9790 data
|= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
9792 WREG32_SMC(MISC_CLK_CTRL
, data
);
9794 orig
= data
= RREG32_SMC(CG_CLKPIN_CNTL
);
9795 data
&= ~BCLK_AS_XCLK
;
9797 WREG32_SMC(CG_CLKPIN_CNTL
, data
);
9799 orig
= data
= RREG32_SMC(CG_CLKPIN_CNTL_2
);
9800 data
&= ~FORCE_BIF_REFCLK_EN
;
9802 WREG32_SMC(CG_CLKPIN_CNTL_2
, data
);
9804 orig
= data
= RREG32_SMC(MPLL_BYPASSCLK_SEL
);
9805 data
&= ~MPLL_CLKOUT_SEL_MASK
;
9806 data
|= MPLL_CLKOUT_SEL(4);
9808 WREG32_SMC(MPLL_BYPASSCLK_SEL
, data
);
9813 WREG32_PCIE_PORT(PCIE_LC_CNTL
, data
);
9816 orig
= data
= RREG32_PCIE_PORT(PCIE_CNTL2
);
9817 data
|= SLV_MEM_LS_EN
| MST_MEM_LS_EN
| REPLAY_MEM_LS_EN
;
9819 WREG32_PCIE_PORT(PCIE_CNTL2
, data
);
9822 data
= RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL
);
9823 if((data
& LC_N_FTS_MASK
) == LC_N_FTS_MASK
) {
9824 data
= RREG32_PCIE_PORT(PCIE_LC_STATUS1
);
9825 if ((data
& LC_REVERSE_XMIT
) && (data
& LC_REVERSE_RCVR
)) {
9826 orig
= data
= RREG32_PCIE_PORT(PCIE_LC_CNTL
);
9827 data
&= ~LC_L0S_INACTIVITY_MASK
;
9829 WREG32_PCIE_PORT(PCIE_LC_CNTL
, data
);