blob: 3a3fdf5b5dd25d400fd92f0909b3ca3eb8f26d62 [file] [log] [blame]
Alex Deucher0af62b02011-01-06 21:19:31 -05001/*
2 * Copyright 2010 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24#include <linux/firmware.h>
25#include <linux/platform_device.h>
26#include <linux/slab.h>
27#include "drmP.h"
28#include "radeon.h"
29#include "radeon_asic.h"
30#include "radeon_drm.h"
31#include "nid.h"
32#include "atom.h"
33#include "ni_reg.h"
Alex Deucher0c88a022011-03-02 20:07:31 -050034#include "cayman_blit_shaders.h"
Alex Deucher0af62b02011-01-06 21:19:31 -050035
Alex Deucherb9952a82011-03-02 20:07:33 -050036extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
37extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
38extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
39
Alex Deucher0af62b02011-01-06 21:19:31 -050040#define EVERGREEN_PFP_UCODE_SIZE 1120
41#define EVERGREEN_PM4_UCODE_SIZE 1376
42#define EVERGREEN_RLC_UCODE_SIZE 768
43#define BTC_MC_UCODE_SIZE 6024
44
Alex Deucher9b8253c2011-03-02 20:07:28 -050045#define CAYMAN_PFP_UCODE_SIZE 2176
46#define CAYMAN_PM4_UCODE_SIZE 2176
47#define CAYMAN_RLC_UCODE_SIZE 1024
48#define CAYMAN_MC_UCODE_SIZE 6037
49
Alex Deucher0af62b02011-01-06 21:19:31 -050050/* Firmware Names */
51MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
52MODULE_FIRMWARE("radeon/BARTS_me.bin");
53MODULE_FIRMWARE("radeon/BARTS_mc.bin");
54MODULE_FIRMWARE("radeon/BTC_rlc.bin");
55MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
56MODULE_FIRMWARE("radeon/TURKS_me.bin");
57MODULE_FIRMWARE("radeon/TURKS_mc.bin");
58MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
59MODULE_FIRMWARE("radeon/CAICOS_me.bin");
60MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
Alex Deucher9b8253c2011-03-02 20:07:28 -050061MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
62MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
63MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
64MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
Alex Deucher0af62b02011-01-06 21:19:31 -050065
66#define BTC_IO_MC_REGS_SIZE 29
67
68static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
69 {0x00000077, 0xff010100},
70 {0x00000078, 0x00000000},
71 {0x00000079, 0x00001434},
72 {0x0000007a, 0xcc08ec08},
73 {0x0000007b, 0x00040000},
74 {0x0000007c, 0x000080c0},
75 {0x0000007d, 0x09000000},
76 {0x0000007e, 0x00210404},
77 {0x00000081, 0x08a8e800},
78 {0x00000082, 0x00030444},
79 {0x00000083, 0x00000000},
80 {0x00000085, 0x00000001},
81 {0x00000086, 0x00000002},
82 {0x00000087, 0x48490000},
83 {0x00000088, 0x20244647},
84 {0x00000089, 0x00000005},
85 {0x0000008b, 0x66030000},
86 {0x0000008c, 0x00006603},
87 {0x0000008d, 0x00000100},
88 {0x0000008f, 0x00001c0a},
89 {0x00000090, 0xff000001},
90 {0x00000094, 0x00101101},
91 {0x00000095, 0x00000fff},
92 {0x00000096, 0x00116fff},
93 {0x00000097, 0x60010000},
94 {0x00000098, 0x10010000},
95 {0x00000099, 0x00006000},
96 {0x0000009a, 0x00001000},
97 {0x0000009f, 0x00946a00}
98};
99
100static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
101 {0x00000077, 0xff010100},
102 {0x00000078, 0x00000000},
103 {0x00000079, 0x00001434},
104 {0x0000007a, 0xcc08ec08},
105 {0x0000007b, 0x00040000},
106 {0x0000007c, 0x000080c0},
107 {0x0000007d, 0x09000000},
108 {0x0000007e, 0x00210404},
109 {0x00000081, 0x08a8e800},
110 {0x00000082, 0x00030444},
111 {0x00000083, 0x00000000},
112 {0x00000085, 0x00000001},
113 {0x00000086, 0x00000002},
114 {0x00000087, 0x48490000},
115 {0x00000088, 0x20244647},
116 {0x00000089, 0x00000005},
117 {0x0000008b, 0x66030000},
118 {0x0000008c, 0x00006603},
119 {0x0000008d, 0x00000100},
120 {0x0000008f, 0x00001c0a},
121 {0x00000090, 0xff000001},
122 {0x00000094, 0x00101101},
123 {0x00000095, 0x00000fff},
124 {0x00000096, 0x00116fff},
125 {0x00000097, 0x60010000},
126 {0x00000098, 0x10010000},
127 {0x00000099, 0x00006000},
128 {0x0000009a, 0x00001000},
129 {0x0000009f, 0x00936a00}
130};
131
132static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
133 {0x00000077, 0xff010100},
134 {0x00000078, 0x00000000},
135 {0x00000079, 0x00001434},
136 {0x0000007a, 0xcc08ec08},
137 {0x0000007b, 0x00040000},
138 {0x0000007c, 0x000080c0},
139 {0x0000007d, 0x09000000},
140 {0x0000007e, 0x00210404},
141 {0x00000081, 0x08a8e800},
142 {0x00000082, 0x00030444},
143 {0x00000083, 0x00000000},
144 {0x00000085, 0x00000001},
145 {0x00000086, 0x00000002},
146 {0x00000087, 0x48490000},
147 {0x00000088, 0x20244647},
148 {0x00000089, 0x00000005},
149 {0x0000008b, 0x66030000},
150 {0x0000008c, 0x00006603},
151 {0x0000008d, 0x00000100},
152 {0x0000008f, 0x00001c0a},
153 {0x00000090, 0xff000001},
154 {0x00000094, 0x00101101},
155 {0x00000095, 0x00000fff},
156 {0x00000096, 0x00116fff},
157 {0x00000097, 0x60010000},
158 {0x00000098, 0x10010000},
159 {0x00000099, 0x00006000},
160 {0x0000009a, 0x00001000},
161 {0x0000009f, 0x00916a00}
162};
163
Alex Deucher9b8253c2011-03-02 20:07:28 -0500164static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
165 {0x00000077, 0xff010100},
166 {0x00000078, 0x00000000},
167 {0x00000079, 0x00001434},
168 {0x0000007a, 0xcc08ec08},
169 {0x0000007b, 0x00040000},
170 {0x0000007c, 0x000080c0},
171 {0x0000007d, 0x09000000},
172 {0x0000007e, 0x00210404},
173 {0x00000081, 0x08a8e800},
174 {0x00000082, 0x00030444},
175 {0x00000083, 0x00000000},
176 {0x00000085, 0x00000001},
177 {0x00000086, 0x00000002},
178 {0x00000087, 0x48490000},
179 {0x00000088, 0x20244647},
180 {0x00000089, 0x00000005},
181 {0x0000008b, 0x66030000},
182 {0x0000008c, 0x00006603},
183 {0x0000008d, 0x00000100},
184 {0x0000008f, 0x00001c0a},
185 {0x00000090, 0xff000001},
186 {0x00000094, 0x00101101},
187 {0x00000095, 0x00000fff},
188 {0x00000096, 0x00116fff},
189 {0x00000097, 0x60010000},
190 {0x00000098, 0x10010000},
191 {0x00000099, 0x00006000},
192 {0x0000009a, 0x00001000},
193 {0x0000009f, 0x00976b00}
194};
195
Alex Deucher0af62b02011-01-06 21:19:31 -0500196int btc_mc_load_microcode(struct radeon_device *rdev)
197{
198 const __be32 *fw_data;
199 u32 mem_type, running, blackout = 0;
200 u32 *io_mc_regs;
Alex Deucher9b8253c2011-03-02 20:07:28 -0500201 int i, ucode_size, regs_size;
Alex Deucher0af62b02011-01-06 21:19:31 -0500202
203 if (!rdev->mc_fw)
204 return -EINVAL;
205
206 switch (rdev->family) {
207 case CHIP_BARTS:
208 io_mc_regs = (u32 *)&barts_io_mc_regs;
Alex Deucher9b8253c2011-03-02 20:07:28 -0500209 ucode_size = BTC_MC_UCODE_SIZE;
210 regs_size = BTC_IO_MC_REGS_SIZE;
Alex Deucher0af62b02011-01-06 21:19:31 -0500211 break;
212 case CHIP_TURKS:
213 io_mc_regs = (u32 *)&turks_io_mc_regs;
Alex Deucher9b8253c2011-03-02 20:07:28 -0500214 ucode_size = BTC_MC_UCODE_SIZE;
215 regs_size = BTC_IO_MC_REGS_SIZE;
Alex Deucher0af62b02011-01-06 21:19:31 -0500216 break;
217 case CHIP_CAICOS:
218 default:
219 io_mc_regs = (u32 *)&caicos_io_mc_regs;
Alex Deucher9b8253c2011-03-02 20:07:28 -0500220 ucode_size = BTC_MC_UCODE_SIZE;
221 regs_size = BTC_IO_MC_REGS_SIZE;
222 break;
223 case CHIP_CAYMAN:
224 io_mc_regs = (u32 *)&cayman_io_mc_regs;
225 ucode_size = CAYMAN_MC_UCODE_SIZE;
226 regs_size = BTC_IO_MC_REGS_SIZE;
Alex Deucher0af62b02011-01-06 21:19:31 -0500227 break;
228 }
229
230 mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
231 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
232
233 if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
234 if (running) {
235 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
236 WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
237 }
238
239 /* reset the engine and set to writable */
240 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
241 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
242
243 /* load mc io regs */
Alex Deucher9b8253c2011-03-02 20:07:28 -0500244 for (i = 0; i < regs_size; i++) {
Alex Deucher0af62b02011-01-06 21:19:31 -0500245 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
246 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
247 }
248 /* load the MC ucode */
249 fw_data = (const __be32 *)rdev->mc_fw->data;
Alex Deucher9b8253c2011-03-02 20:07:28 -0500250 for (i = 0; i < ucode_size; i++)
Alex Deucher0af62b02011-01-06 21:19:31 -0500251 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
252
253 /* put the engine back into the active state */
254 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
255 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
256 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
257
258 /* wait for training to complete */
259 while (!(RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD))
260 udelay(10);
261
262 if (running)
263 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
264 }
265
266 return 0;
267}
268
269int ni_init_microcode(struct radeon_device *rdev)
270{
271 struct platform_device *pdev;
272 const char *chip_name;
273 const char *rlc_chip_name;
274 size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
275 char fw_name[30];
276 int err;
277
278 DRM_DEBUG("\n");
279
280 pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
281 err = IS_ERR(pdev);
282 if (err) {
283 printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
284 return -EINVAL;
285 }
286
287 switch (rdev->family) {
288 case CHIP_BARTS:
289 chip_name = "BARTS";
290 rlc_chip_name = "BTC";
Alex Deucher9b8253c2011-03-02 20:07:28 -0500291 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
292 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
293 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
294 mc_req_size = BTC_MC_UCODE_SIZE * 4;
Alex Deucher0af62b02011-01-06 21:19:31 -0500295 break;
296 case CHIP_TURKS:
297 chip_name = "TURKS";
298 rlc_chip_name = "BTC";
Alex Deucher9b8253c2011-03-02 20:07:28 -0500299 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
300 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
301 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
302 mc_req_size = BTC_MC_UCODE_SIZE * 4;
Alex Deucher0af62b02011-01-06 21:19:31 -0500303 break;
304 case CHIP_CAICOS:
305 chip_name = "CAICOS";
306 rlc_chip_name = "BTC";
Alex Deucher9b8253c2011-03-02 20:07:28 -0500307 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
308 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
309 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
310 mc_req_size = BTC_MC_UCODE_SIZE * 4;
311 break;
312 case CHIP_CAYMAN:
313 chip_name = "CAYMAN";
314 rlc_chip_name = "CAYMAN";
315 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
316 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
317 rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
318 mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
Alex Deucher0af62b02011-01-06 21:19:31 -0500319 break;
320 default: BUG();
321 }
322
Alex Deucher0af62b02011-01-06 21:19:31 -0500323 DRM_INFO("Loading %s Microcode\n", chip_name);
324
325 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
326 err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
327 if (err)
328 goto out;
329 if (rdev->pfp_fw->size != pfp_req_size) {
330 printk(KERN_ERR
331 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
332 rdev->pfp_fw->size, fw_name);
333 err = -EINVAL;
334 goto out;
335 }
336
337 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
338 err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
339 if (err)
340 goto out;
341 if (rdev->me_fw->size != me_req_size) {
342 printk(KERN_ERR
343 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
344 rdev->me_fw->size, fw_name);
345 err = -EINVAL;
346 }
347
348 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
349 err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
350 if (err)
351 goto out;
352 if (rdev->rlc_fw->size != rlc_req_size) {
353 printk(KERN_ERR
354 "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
355 rdev->rlc_fw->size, fw_name);
356 err = -EINVAL;
357 }
358
359 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
360 err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
361 if (err)
362 goto out;
363 if (rdev->mc_fw->size != mc_req_size) {
364 printk(KERN_ERR
365 "ni_mc: Bogus length %zu in firmware \"%s\"\n",
366 rdev->mc_fw->size, fw_name);
367 err = -EINVAL;
368 }
369out:
370 platform_device_unregister(pdev);
371
372 if (err) {
373 if (err != -EINVAL)
374 printk(KERN_ERR
375 "ni_cp: Failed to load firmware \"%s\"\n",
376 fw_name);
377 release_firmware(rdev->pfp_fw);
378 rdev->pfp_fw = NULL;
379 release_firmware(rdev->me_fw);
380 rdev->me_fw = NULL;
381 release_firmware(rdev->rlc_fw);
382 rdev->rlc_fw = NULL;
383 release_firmware(rdev->mc_fw);
384 rdev->mc_fw = NULL;
385 }
386 return err;
387}
388
Alex Deucherfecf1d02011-03-02 20:07:29 -0500389/*
390 * Core functions
391 */
392static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
393 u32 num_tile_pipes,
394 u32 num_backends_per_asic,
395 u32 *backend_disable_mask_per_asic,
396 u32 num_shader_engines)
397{
398 u32 backend_map = 0;
399 u32 enabled_backends_mask = 0;
400 u32 enabled_backends_count = 0;
401 u32 num_backends_per_se;
402 u32 cur_pipe;
403 u32 swizzle_pipe[CAYMAN_MAX_PIPES];
404 u32 cur_backend = 0;
405 u32 i;
406 bool force_no_swizzle;
407
408 /* force legal values */
409 if (num_tile_pipes < 1)
410 num_tile_pipes = 1;
411 if (num_tile_pipes > rdev->config.cayman.max_tile_pipes)
412 num_tile_pipes = rdev->config.cayman.max_tile_pipes;
413 if (num_shader_engines < 1)
414 num_shader_engines = 1;
415 if (num_shader_engines > rdev->config.cayman.max_shader_engines)
416 num_shader_engines = rdev->config.cayman.max_shader_engines;
417 if (num_backends_per_asic > num_shader_engines)
418 num_backends_per_asic = num_shader_engines;
419 if (num_backends_per_asic > (rdev->config.cayman.max_backends_per_se * num_shader_engines))
420 num_backends_per_asic = rdev->config.cayman.max_backends_per_se * num_shader_engines;
421
422 /* make sure we have the same number of backends per se */
423 num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines);
424 /* set up the number of backends per se */
425 num_backends_per_se = num_backends_per_asic / num_shader_engines;
426 if (num_backends_per_se > rdev->config.cayman.max_backends_per_se) {
427 num_backends_per_se = rdev->config.cayman.max_backends_per_se;
428 num_backends_per_asic = num_backends_per_se * num_shader_engines;
429 }
430
431 /* create enable mask and count for enabled backends */
432 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
433 if (((*backend_disable_mask_per_asic >> i) & 1) == 0) {
434 enabled_backends_mask |= (1 << i);
435 ++enabled_backends_count;
436 }
437 if (enabled_backends_count == num_backends_per_asic)
438 break;
439 }
440
441 /* force the backends mask to match the current number of backends */
442 if (enabled_backends_count != num_backends_per_asic) {
443 u32 this_backend_enabled;
444 u32 shader_engine;
445 u32 backend_per_se;
446
447 enabled_backends_mask = 0;
448 enabled_backends_count = 0;
449 *backend_disable_mask_per_asic = CAYMAN_MAX_BACKENDS_MASK;
450 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
451 /* calc the current se */
452 shader_engine = i / rdev->config.cayman.max_backends_per_se;
453 /* calc the backend per se */
454 backend_per_se = i % rdev->config.cayman.max_backends_per_se;
455 /* default to not enabled */
456 this_backend_enabled = 0;
457 if ((shader_engine < num_shader_engines) &&
458 (backend_per_se < num_backends_per_se))
459 this_backend_enabled = 1;
460 if (this_backend_enabled) {
461 enabled_backends_mask |= (1 << i);
462 *backend_disable_mask_per_asic &= ~(1 << i);
463 ++enabled_backends_count;
464 }
465 }
466 }
467
468
469 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * CAYMAN_MAX_PIPES);
470 switch (rdev->family) {
471 case CHIP_CAYMAN:
472 force_no_swizzle = true;
473 break;
474 default:
475 force_no_swizzle = false;
476 break;
477 }
478 if (force_no_swizzle) {
479 bool last_backend_enabled = false;
480
481 force_no_swizzle = false;
482 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
483 if (((enabled_backends_mask >> i) & 1) == 1) {
484 if (last_backend_enabled)
485 force_no_swizzle = true;
486 last_backend_enabled = true;
487 } else
488 last_backend_enabled = false;
489 }
490 }
491
492 switch (num_tile_pipes) {
493 case 1:
494 case 3:
495 case 5:
496 case 7:
497 DRM_ERROR("odd number of pipes!\n");
498 break;
499 case 2:
500 swizzle_pipe[0] = 0;
501 swizzle_pipe[1] = 1;
502 break;
503 case 4:
504 if (force_no_swizzle) {
505 swizzle_pipe[0] = 0;
506 swizzle_pipe[1] = 1;
507 swizzle_pipe[2] = 2;
508 swizzle_pipe[3] = 3;
509 } else {
510 swizzle_pipe[0] = 0;
511 swizzle_pipe[1] = 2;
512 swizzle_pipe[2] = 1;
513 swizzle_pipe[3] = 3;
514 }
515 break;
516 case 6:
517 if (force_no_swizzle) {
518 swizzle_pipe[0] = 0;
519 swizzle_pipe[1] = 1;
520 swizzle_pipe[2] = 2;
521 swizzle_pipe[3] = 3;
522 swizzle_pipe[4] = 4;
523 swizzle_pipe[5] = 5;
524 } else {
525 swizzle_pipe[0] = 0;
526 swizzle_pipe[1] = 2;
527 swizzle_pipe[2] = 4;
528 swizzle_pipe[3] = 1;
529 swizzle_pipe[4] = 3;
530 swizzle_pipe[5] = 5;
531 }
532 break;
533 case 8:
534 if (force_no_swizzle) {
535 swizzle_pipe[0] = 0;
536 swizzle_pipe[1] = 1;
537 swizzle_pipe[2] = 2;
538 swizzle_pipe[3] = 3;
539 swizzle_pipe[4] = 4;
540 swizzle_pipe[5] = 5;
541 swizzle_pipe[6] = 6;
542 swizzle_pipe[7] = 7;
543 } else {
544 swizzle_pipe[0] = 0;
545 swizzle_pipe[1] = 2;
546 swizzle_pipe[2] = 4;
547 swizzle_pipe[3] = 6;
548 swizzle_pipe[4] = 1;
549 swizzle_pipe[5] = 3;
550 swizzle_pipe[6] = 5;
551 swizzle_pipe[7] = 7;
552 }
553 break;
554 }
555
556 for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
557 while (((1 << cur_backend) & enabled_backends_mask) == 0)
558 cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
559
560 backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4)));
561
562 cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
563 }
564
565 return backend_map;
566}
567
568static void cayman_program_channel_remap(struct radeon_device *rdev)
569{
570 u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp;
571
572 tmp = RREG32(MC_SHARED_CHMAP);
573 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
574 case 0:
575 case 1:
576 case 2:
577 case 3:
578 default:
579 /* default mapping */
580 mc_shared_chremap = 0x00fac688;
581 break;
582 }
583
584 switch (rdev->family) {
585 case CHIP_CAYMAN:
586 default:
587 //tcp_chan_steer_lo = 0x54763210
588 tcp_chan_steer_lo = 0x76543210;
589 tcp_chan_steer_hi = 0x0000ba98;
590 break;
591 }
592
593 WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo);
594 WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi);
595 WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
596}
597
598static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev,
599 u32 disable_mask_per_se,
600 u32 max_disable_mask_per_se,
601 u32 num_shader_engines)
602{
603 u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se);
604 u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se;
605
606 if (num_shader_engines == 1)
607 return disable_mask_per_asic;
608 else if (num_shader_engines == 2)
609 return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se);
610 else
611 return 0xffffffff;
612}
613
614static void cayman_gpu_init(struct radeon_device *rdev)
615{
616 u32 cc_rb_backend_disable = 0;
617 u32 cc_gc_shader_pipe_config;
618 u32 gb_addr_config = 0;
619 u32 mc_shared_chmap, mc_arb_ramcfg;
620 u32 gb_backend_map;
621 u32 cgts_tcc_disable;
622 u32 sx_debug_1;
623 u32 smx_dc_ctl0;
624 u32 gc_user_shader_pipe_config;
625 u32 gc_user_rb_backend_disable;
626 u32 cgts_user_tcc_disable;
627 u32 cgts_sm_ctrl_reg;
628 u32 hdp_host_path_cntl;
629 u32 tmp;
630 int i, j;
631
632 switch (rdev->family) {
633 case CHIP_CAYMAN:
634 default:
635 rdev->config.cayman.max_shader_engines = 2;
636 rdev->config.cayman.max_pipes_per_simd = 4;
637 rdev->config.cayman.max_tile_pipes = 8;
638 rdev->config.cayman.max_simds_per_se = 12;
639 rdev->config.cayman.max_backends_per_se = 4;
640 rdev->config.cayman.max_texture_channel_caches = 8;
641 rdev->config.cayman.max_gprs = 256;
642 rdev->config.cayman.max_threads = 256;
643 rdev->config.cayman.max_gs_threads = 32;
644 rdev->config.cayman.max_stack_entries = 512;
645 rdev->config.cayman.sx_num_of_sets = 8;
646 rdev->config.cayman.sx_max_export_size = 256;
647 rdev->config.cayman.sx_max_export_pos_size = 64;
648 rdev->config.cayman.sx_max_export_smx_size = 192;
649 rdev->config.cayman.max_hw_contexts = 8;
650 rdev->config.cayman.sq_num_cf_insts = 2;
651
652 rdev->config.cayman.sc_prim_fifo_size = 0x100;
653 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
654 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
655 break;
656 }
657
658 /* Initialize HDP */
659 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
660 WREG32((0x2c14 + j), 0x00000000);
661 WREG32((0x2c18 + j), 0x00000000);
662 WREG32((0x2c1c + j), 0x00000000);
663 WREG32((0x2c20 + j), 0x00000000);
664 WREG32((0x2c24 + j), 0x00000000);
665 }
666
667 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
668
669 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
670 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
671
672 cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE);
673 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
674 cgts_tcc_disable = RREG32(CGTS_TCC_DISABLE);
675 gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE);
676 gc_user_shader_pipe_config = RREG32(GC_USER_SHADER_PIPE_CONFIG);
677 cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE);
678
679 rdev->config.cayman.num_shader_engines = rdev->config.cayman.max_shader_engines;
680 tmp = ((~gc_user_shader_pipe_config) & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
681 rdev->config.cayman.num_shader_pipes_per_simd = r600_count_pipe_bits(tmp);
682 rdev->config.cayman.num_tile_pipes = rdev->config.cayman.max_tile_pipes;
683 tmp = ((~gc_user_shader_pipe_config) & INACTIVE_SIMDS_MASK) >> INACTIVE_SIMDS_SHIFT;
684 rdev->config.cayman.num_simds_per_se = r600_count_pipe_bits(tmp);
685 tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
686 rdev->config.cayman.num_backends_per_se = r600_count_pipe_bits(tmp);
687 tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
688 rdev->config.cayman.backend_disable_mask_per_asic =
689 cayman_get_disable_mask_per_asic(rdev, tmp, CAYMAN_MAX_BACKENDS_PER_SE_MASK,
690 rdev->config.cayman.num_shader_engines);
691 rdev->config.cayman.backend_map =
692 cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
693 rdev->config.cayman.num_backends_per_se *
694 rdev->config.cayman.num_shader_engines,
695 &rdev->config.cayman.backend_disable_mask_per_asic,
696 rdev->config.cayman.num_shader_engines);
697 tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT;
698 rdev->config.cayman.num_texture_channel_caches = r600_count_pipe_bits(tmp);
699 tmp = (mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT;
700 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
701 if (rdev->config.cayman.mem_max_burst_length_bytes > 512)
702 rdev->config.cayman.mem_max_burst_length_bytes = 512;
703 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
704 rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
705 if (rdev->config.cayman.mem_row_size_in_kb > 4)
706 rdev->config.cayman.mem_row_size_in_kb = 4;
707 /* XXX use MC settings? */
708 rdev->config.cayman.shader_engine_tile_size = 32;
709 rdev->config.cayman.num_gpus = 1;
710 rdev->config.cayman.multi_gpu_tile_size = 64;
711
712 //gb_addr_config = 0x02011003
713#if 0
714 gb_addr_config = RREG32(GB_ADDR_CONFIG);
715#else
716 gb_addr_config = 0;
717 switch (rdev->config.cayman.num_tile_pipes) {
718 case 1:
719 default:
720 gb_addr_config |= NUM_PIPES(0);
721 break;
722 case 2:
723 gb_addr_config |= NUM_PIPES(1);
724 break;
725 case 4:
726 gb_addr_config |= NUM_PIPES(2);
727 break;
728 case 8:
729 gb_addr_config |= NUM_PIPES(3);
730 break;
731 }
732
733 tmp = (rdev->config.cayman.mem_max_burst_length_bytes / 256) - 1;
734 gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp);
735 gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.cayman.num_shader_engines - 1);
736 tmp = (rdev->config.cayman.shader_engine_tile_size / 16) - 1;
737 gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp);
738 switch (rdev->config.cayman.num_gpus) {
739 case 1:
740 default:
741 gb_addr_config |= NUM_GPUS(0);
742 break;
743 case 2:
744 gb_addr_config |= NUM_GPUS(1);
745 break;
746 case 4:
747 gb_addr_config |= NUM_GPUS(2);
748 break;
749 }
750 switch (rdev->config.cayman.multi_gpu_tile_size) {
751 case 16:
752 gb_addr_config |= MULTI_GPU_TILE_SIZE(0);
753 break;
754 case 32:
755 default:
756 gb_addr_config |= MULTI_GPU_TILE_SIZE(1);
757 break;
758 case 64:
759 gb_addr_config |= MULTI_GPU_TILE_SIZE(2);
760 break;
761 case 128:
762 gb_addr_config |= MULTI_GPU_TILE_SIZE(3);
763 break;
764 }
765 switch (rdev->config.cayman.mem_row_size_in_kb) {
766 case 1:
767 default:
768 gb_addr_config |= ROW_SIZE(0);
769 break;
770 case 2:
771 gb_addr_config |= ROW_SIZE(1);
772 break;
773 case 4:
774 gb_addr_config |= ROW_SIZE(2);
775 break;
776 }
777#endif
778
779 tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
780 rdev->config.cayman.num_tile_pipes = (1 << tmp);
781 tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
782 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
783 tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
784 rdev->config.cayman.num_shader_engines = tmp + 1;
785 tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
786 rdev->config.cayman.num_gpus = tmp + 1;
787 tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
788 rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
789 tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
790 rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
791
792 //gb_backend_map = 0x76541032;
793#if 0
794 gb_backend_map = RREG32(GB_BACKEND_MAP);
795#else
796 gb_backend_map =
797 cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
798 rdev->config.cayman.num_backends_per_se *
799 rdev->config.cayman.num_shader_engines,
800 &rdev->config.cayman.backend_disable_mask_per_asic,
801 rdev->config.cayman.num_shader_engines);
802#endif
803 /* setup tiling info dword. gb_addr_config is not adequate since it does
804 * not have bank info, so create a custom tiling dword.
805 * bits 3:0 num_pipes
806 * bits 7:4 num_banks
807 * bits 11:8 group_size
808 * bits 15:12 row_size
809 */
810 rdev->config.cayman.tile_config = 0;
811 switch (rdev->config.cayman.num_tile_pipes) {
812 case 1:
813 default:
814 rdev->config.cayman.tile_config |= (0 << 0);
815 break;
816 case 2:
817 rdev->config.cayman.tile_config |= (1 << 0);
818 break;
819 case 4:
820 rdev->config.cayman.tile_config |= (2 << 0);
821 break;
822 case 8:
823 rdev->config.cayman.tile_config |= (3 << 0);
824 break;
825 }
826 rdev->config.cayman.tile_config |=
827 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
828 rdev->config.cayman.tile_config |=
829 (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
830 rdev->config.cayman.tile_config |=
831 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
832
833 WREG32(GB_BACKEND_MAP, gb_backend_map);
834 WREG32(GB_ADDR_CONFIG, gb_addr_config);
835 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
836 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
837
838 cayman_program_channel_remap(rdev);
839
840 /* primary versions */
841 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
842 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
843 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
844
845 WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
846 WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
847
848 /* user versions */
849 WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable);
850 WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
851 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
852
853 WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
854 WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
855
856 /* reprogram the shader complex */
857 cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
858 for (i = 0; i < 16; i++)
859 WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
860 WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
861
862 /* set HW defaults for 3D engine */
863 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
864
865 sx_debug_1 = RREG32(SX_DEBUG_1);
866 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
867 WREG32(SX_DEBUG_1, sx_debug_1);
868
869 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
870 smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
871 smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
872 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
873
874 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
875
876 /* need to be explicitly zero-ed */
877 WREG32(VGT_OFFCHIP_LDS_BASE, 0);
878 WREG32(SQ_LSTMP_RING_BASE, 0);
879 WREG32(SQ_HSTMP_RING_BASE, 0);
880 WREG32(SQ_ESTMP_RING_BASE, 0);
881 WREG32(SQ_GSTMP_RING_BASE, 0);
882 WREG32(SQ_VSTMP_RING_BASE, 0);
883 WREG32(SQ_PSTMP_RING_BASE, 0);
884
885 WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
886
887 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
888 POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
889 SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
890
891 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
892 SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
893 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
894
895
896 WREG32(VGT_NUM_INSTANCES, 1);
897
898 WREG32(CP_PERFMON_CNTL, 0);
899
900 WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
901 FETCH_FIFO_HIWATER(0x4) |
902 DONE_FIFO_HIWATER(0xe0) |
903 ALU_UPDATE_FIFO_HIWATER(0x8)));
904
905 WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
906 WREG32(SQ_CONFIG, (VC_ENABLE |
907 EXPORT_SRC_C |
908 GFX_PRIO(0) |
909 CS1_PRIO(0) |
910 CS2_PRIO(1)));
911 WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
912
913 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
914 FORCE_EOV_MAX_REZ_CNT(255)));
915
916 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
917 AUTO_INVLD_EN(ES_AND_GS_AUTO));
918
919 WREG32(VGT_GS_VERTEX_REUSE, 16);
920 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
921
922 WREG32(CB_PERF_CTR0_SEL_0, 0);
923 WREG32(CB_PERF_CTR0_SEL_1, 0);
924 WREG32(CB_PERF_CTR1_SEL_0, 0);
925 WREG32(CB_PERF_CTR1_SEL_1, 0);
926 WREG32(CB_PERF_CTR2_SEL_0, 0);
927 WREG32(CB_PERF_CTR2_SEL_1, 0);
928 WREG32(CB_PERF_CTR3_SEL_0, 0);
929 WREG32(CB_PERF_CTR3_SEL_1, 0);
930
931 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
932 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
933
934 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
935
936 udelay(50);
937}
938
Alex Deucherfa8198e2011-03-02 20:07:30 -0500939/*
940 * GART
941 */
942void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
943{
944 /* flush hdp cache */
945 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
946
947 /* bits 0-7 are the VM contexts0-7 */
948 WREG32(VM_INVALIDATE_REQUEST, 1);
949}
950
951int cayman_pcie_gart_enable(struct radeon_device *rdev)
952{
953 int r;
954
955 if (rdev->gart.table.vram.robj == NULL) {
956 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
957 return -EINVAL;
958 }
959 r = radeon_gart_table_vram_pin(rdev);
960 if (r)
961 return r;
962 radeon_gart_restore(rdev);
963 /* Setup TLB control */
964 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB |
965 ENABLE_L1_FRAGMENT_PROCESSING |
966 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
967 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
968 /* Setup L2 cache */
969 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
970 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
971 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
972 EFFECTIVE_L2_QUEUE_SIZE(7) |
973 CONTEXT1_IDENTITY_ACCESS_MODE(1));
974 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
975 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
976 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
977 /* setup context0 */
978 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
979 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
980 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
981 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
982 (u32)(rdev->dummy_page.addr >> 12));
983 WREG32(VM_CONTEXT0_CNTL2, 0);
984 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
985 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
986 /* disable context1-7 */
987 WREG32(VM_CONTEXT1_CNTL2, 0);
988 WREG32(VM_CONTEXT1_CNTL, 0);
989
990 cayman_pcie_gart_tlb_flush(rdev);
991 rdev->gart.ready = true;
992 return 0;
993}
994
995void cayman_pcie_gart_disable(struct radeon_device *rdev)
996{
997 int r;
998
999 /* Disable all tables */
1000 WREG32(VM_CONTEXT0_CNTL, 0);
1001 WREG32(VM_CONTEXT1_CNTL, 0);
1002 /* Setup TLB control */
1003 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1004 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1005 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1006 /* Setup L2 cache */
1007 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1008 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1009 EFFECTIVE_L2_QUEUE_SIZE(7) |
1010 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1011 WREG32(VM_L2_CNTL2, 0);
1012 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1013 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1014 if (rdev->gart.table.vram.robj) {
1015 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
1016 if (likely(r == 0)) {
1017 radeon_bo_kunmap(rdev->gart.table.vram.robj);
1018 radeon_bo_unpin(rdev->gart.table.vram.robj);
1019 radeon_bo_unreserve(rdev->gart.table.vram.robj);
1020 }
1021 }
1022}
1023
1024void cayman_pcie_gart_fini(struct radeon_device *rdev)
1025{
1026 cayman_pcie_gart_disable(rdev);
1027 radeon_gart_table_vram_free(rdev);
1028 radeon_gart_fini(rdev);
1029}
1030
Alex Deucher0c88a022011-03-02 20:07:31 -05001031/*
1032 * CP.
1033 */
1034static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1035{
1036 if (enable)
1037 WREG32(CP_ME_CNTL, 0);
1038 else {
1039 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1040 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1041 WREG32(SCRATCH_UMSK, 0);
1042 }
1043}
1044
1045static int cayman_cp_load_microcode(struct radeon_device *rdev)
1046{
1047 const __be32 *fw_data;
1048 int i;
1049
1050 if (!rdev->me_fw || !rdev->pfp_fw)
1051 return -EINVAL;
1052
1053 cayman_cp_enable(rdev, false);
1054
1055 fw_data = (const __be32 *)rdev->pfp_fw->data;
1056 WREG32(CP_PFP_UCODE_ADDR, 0);
1057 for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1058 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1059 WREG32(CP_PFP_UCODE_ADDR, 0);
1060
1061 fw_data = (const __be32 *)rdev->me_fw->data;
1062 WREG32(CP_ME_RAM_WADDR, 0);
1063 for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1064 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1065
1066 WREG32(CP_PFP_UCODE_ADDR, 0);
1067 WREG32(CP_ME_RAM_WADDR, 0);
1068 WREG32(CP_ME_RAM_RADDR, 0);
1069 return 0;
1070}
1071
1072static int cayman_cp_start(struct radeon_device *rdev)
1073{
1074 int r, i;
1075
1076 r = radeon_ring_lock(rdev, 7);
1077 if (r) {
1078 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1079 return r;
1080 }
1081 radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5));
1082 radeon_ring_write(rdev, 0x1);
1083 radeon_ring_write(rdev, 0x0);
1084 radeon_ring_write(rdev, rdev->config.cayman.max_hw_contexts - 1);
1085 radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1086 radeon_ring_write(rdev, 0);
1087 radeon_ring_write(rdev, 0);
1088 radeon_ring_unlock_commit(rdev);
1089
1090 cayman_cp_enable(rdev, true);
1091
1092 r = radeon_ring_lock(rdev, cayman_default_size + 15);
1093 if (r) {
1094 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1095 return r;
1096 }
1097
1098 /* setup clear context state */
1099 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1100 radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1101
1102 for (i = 0; i < cayman_default_size; i++)
1103 radeon_ring_write(rdev, cayman_default_state[i]);
1104
1105 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1106 radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
1107
1108 /* set clear context state */
1109 radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
1110 radeon_ring_write(rdev, 0);
1111
1112 /* SQ_VTX_BASE_VTX_LOC */
1113 radeon_ring_write(rdev, 0xc0026f00);
1114 radeon_ring_write(rdev, 0x00000000);
1115 radeon_ring_write(rdev, 0x00000000);
1116 radeon_ring_write(rdev, 0x00000000);
1117
1118 /* Clear consts */
1119 radeon_ring_write(rdev, 0xc0036f00);
1120 radeon_ring_write(rdev, 0x00000bc4);
1121 radeon_ring_write(rdev, 0xffffffff);
1122 radeon_ring_write(rdev, 0xffffffff);
1123 radeon_ring_write(rdev, 0xffffffff);
1124
1125 radeon_ring_unlock_commit(rdev);
1126
1127 /* XXX init other rings */
1128
1129 return 0;
1130}
1131
1132int cayman_cp_resume(struct radeon_device *rdev)
1133{
1134 u32 tmp;
1135 u32 rb_bufsz;
1136 int r;
1137
1138 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1139 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1140 SOFT_RESET_PA |
1141 SOFT_RESET_SH |
1142 SOFT_RESET_VGT |
1143 SOFT_RESET_SX));
1144 RREG32(GRBM_SOFT_RESET);
1145 mdelay(15);
1146 WREG32(GRBM_SOFT_RESET, 0);
1147 RREG32(GRBM_SOFT_RESET);
1148
1149 WREG32(CP_SEM_WAIT_TIMER, 0x4);
1150
1151 /* Set the write pointer delay */
1152 WREG32(CP_RB_WPTR_DELAY, 0);
1153
1154 WREG32(CP_DEBUG, (1 << 27));
1155
1156 /* ring 0 - compute and gfx */
1157 /* Set ring buffer size */
1158 rb_bufsz = drm_order(rdev->cp.ring_size / 8);
1159 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1160#ifdef __BIG_ENDIAN
1161 tmp |= BUF_SWAP_32BIT;
1162#endif
1163 WREG32(CP_RB0_CNTL, tmp);
1164
1165 /* Initialize the ring buffer's read and write pointers */
1166 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
1167 WREG32(CP_RB0_WPTR, 0);
1168
1169 /* set the wb address wether it's enabled or not */
1170 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
1171 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
1172 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1173
1174 if (rdev->wb.enabled)
1175 WREG32(SCRATCH_UMSK, 0xff);
1176 else {
1177 tmp |= RB_NO_UPDATE;
1178 WREG32(SCRATCH_UMSK, 0);
1179 }
1180
1181 mdelay(1);
1182 WREG32(CP_RB0_CNTL, tmp);
1183
1184 WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8);
1185
1186 rdev->cp.rptr = RREG32(CP_RB0_RPTR);
1187 rdev->cp.wptr = RREG32(CP_RB0_WPTR);
1188
1189 /* ring1 - compute only */
1190 /* Set ring buffer size */
1191 rb_bufsz = drm_order(rdev->cp1.ring_size / 8);
1192 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1193#ifdef __BIG_ENDIAN
1194 tmp |= BUF_SWAP_32BIT;
1195#endif
1196 WREG32(CP_RB1_CNTL, tmp);
1197
1198 /* Initialize the ring buffer's read and write pointers */
1199 WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
1200 WREG32(CP_RB1_WPTR, 0);
1201
1202 /* set the wb address wether it's enabled or not */
1203 WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
1204 WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
1205
1206 mdelay(1);
1207 WREG32(CP_RB1_CNTL, tmp);
1208
1209 WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8);
1210
1211 rdev->cp1.rptr = RREG32(CP_RB1_RPTR);
1212 rdev->cp1.wptr = RREG32(CP_RB1_WPTR);
1213
1214 /* ring2 - compute only */
1215 /* Set ring buffer size */
1216 rb_bufsz = drm_order(rdev->cp2.ring_size / 8);
1217 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1218#ifdef __BIG_ENDIAN
1219 tmp |= BUF_SWAP_32BIT;
1220#endif
1221 WREG32(CP_RB2_CNTL, tmp);
1222
1223 /* Initialize the ring buffer's read and write pointers */
1224 WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
1225 WREG32(CP_RB2_WPTR, 0);
1226
1227 /* set the wb address wether it's enabled or not */
1228 WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
1229 WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
1230
1231 mdelay(1);
1232 WREG32(CP_RB2_CNTL, tmp);
1233
1234 WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8);
1235
1236 rdev->cp2.rptr = RREG32(CP_RB2_RPTR);
1237 rdev->cp2.wptr = RREG32(CP_RB2_WPTR);
1238
1239 /* start the rings */
1240 cayman_cp_start(rdev);
1241 rdev->cp.ready = true;
1242 rdev->cp1.ready = true;
1243 rdev->cp2.ready = true;
1244 /* this only test cp0 */
1245 r = radeon_ring_test(rdev);
1246 if (r) {
1247 rdev->cp.ready = false;
1248 rdev->cp1.ready = false;
1249 rdev->cp2.ready = false;
1250 return r;
1251 }
1252
1253 return 0;
1254}
1255
Alex Deucherb9952a82011-03-02 20:07:33 -05001256bool cayman_gpu_is_lockup(struct radeon_device *rdev)
1257{
1258 u32 srbm_status;
1259 u32 grbm_status;
1260 u32 grbm_status_se0, grbm_status_se1;
1261 struct r100_gpu_lockup *lockup = &rdev->config.cayman.lockup;
1262 int r;
1263
1264 srbm_status = RREG32(SRBM_STATUS);
1265 grbm_status = RREG32(GRBM_STATUS);
1266 grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
1267 grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
1268 if (!(grbm_status & GUI_ACTIVE)) {
1269 r100_gpu_lockup_update(lockup, &rdev->cp);
1270 return false;
1271 }
1272 /* force CP activities */
1273 r = radeon_ring_lock(rdev, 2);
1274 if (!r) {
1275 /* PACKET2 NOP */
1276 radeon_ring_write(rdev, 0x80000000);
1277 radeon_ring_write(rdev, 0x80000000);
1278 radeon_ring_unlock_commit(rdev);
1279 }
1280 /* XXX deal with CP0,1,2 */
1281 rdev->cp.rptr = RREG32(CP_RB0_RPTR);
1282 return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
1283}
1284
1285static int cayman_gpu_soft_reset(struct radeon_device *rdev)
1286{
1287 struct evergreen_mc_save save;
1288 u32 grbm_reset = 0;
1289
1290 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1291 return 0;
1292
1293 dev_info(rdev->dev, "GPU softreset \n");
1294 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1295 RREG32(GRBM_STATUS));
1296 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1297 RREG32(GRBM_STATUS_SE0));
1298 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1299 RREG32(GRBM_STATUS_SE1));
1300 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1301 RREG32(SRBM_STATUS));
1302 evergreen_mc_stop(rdev, &save);
1303 if (evergreen_mc_wait_for_idle(rdev)) {
1304 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1305 }
1306 /* Disable CP parsing/prefetching */
1307 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1308
1309 /* reset all the gfx blocks */
1310 grbm_reset = (SOFT_RESET_CP |
1311 SOFT_RESET_CB |
1312 SOFT_RESET_DB |
1313 SOFT_RESET_GDS |
1314 SOFT_RESET_PA |
1315 SOFT_RESET_SC |
1316 SOFT_RESET_SPI |
1317 SOFT_RESET_SH |
1318 SOFT_RESET_SX |
1319 SOFT_RESET_TC |
1320 SOFT_RESET_TA |
1321 SOFT_RESET_VGT |
1322 SOFT_RESET_IA);
1323
1324 dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
1325 WREG32(GRBM_SOFT_RESET, grbm_reset);
1326 (void)RREG32(GRBM_SOFT_RESET);
1327 udelay(50);
1328 WREG32(GRBM_SOFT_RESET, 0);
1329 (void)RREG32(GRBM_SOFT_RESET);
1330 /* Wait a little for things to settle down */
1331 udelay(50);
1332 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1333 RREG32(GRBM_STATUS));
1334 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1335 RREG32(GRBM_STATUS_SE0));
1336 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1337 RREG32(GRBM_STATUS_SE1));
1338 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1339 RREG32(SRBM_STATUS));
1340 evergreen_mc_resume(rdev, &save);
1341 return 0;
1342}
1343
1344int cayman_asic_reset(struct radeon_device *rdev)
1345{
1346 return cayman_gpu_soft_reset(rdev);
1347}
1348