1 /* 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/module.h> 26 #include <drm/drmP.h> 27 #include "radeon.h" 28 #include "radeon_asic.h" 29 #include "radeon_audio.h" 30 #include <drm/radeon_drm.h> 31 #include "nid.h" 32 #include "atom.h" 33 #include "ni_reg.h" 34 #include "cayman_blit_shaders.h" 35 #include "radeon_ucode.h" 36 #include "clearstate_cayman.h" 37 38 /* 39 * Indirect registers accessor 40 */ 41 u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg) 42 { 43 u32 r; 44 45 spin_lock(&rdev->smc_idx_lock); 46 WREG32(TN_SMC_IND_INDEX_0, (reg)); 47 r = RREG32(TN_SMC_IND_DATA_0); 48 spin_unlock(&rdev->smc_idx_lock); 49 return r; 50 } 51 52 void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v) 53 { 54 spin_lock(&rdev->smc_idx_lock); 55 WREG32(TN_SMC_IND_INDEX_0, (reg)); 56 WREG32(TN_SMC_IND_DATA_0, (v)); 57 spin_unlock(&rdev->smc_idx_lock); 58 } 59 60 static const u32 tn_rlc_save_restore_register_list[] = 61 { 62 0x98fc, 63 0x98f0, 64 0x9834, 65 0x9838, 66 0x9870, 67 0x9874, 68 0x8a14, 69 0x8b24, 70 0x8bcc, 71 0x8b10, 72 0x8c30, 73 0x8d00, 74 0x8d04, 75 0x8c00, 76 0x8c04, 77 0x8c10, 78 0x8c14, 79 0x8d8c, 80 0x8cf0, 81 0x8e38, 82 0x9508, 83 0x9688, 84 0x9608, 85 0x960c, 86 0x9610, 87 0x9614, 88 0x88c4, 89 0x8978, 90 0x88d4, 91 0x900c, 92 0x9100, 93 0x913c, 94 0x90e8, 95 0x9354, 96 0xa008, 97 0x98f8, 98 0x9148, 99 0x914c, 100 0x3f94, 101 0x98f4, 102 0x9b7c, 103 0x3f8c, 104 0x8950, 105 0x8954, 106 0x8a18, 107 0x8b28, 108 0x9144, 109 0x3f90, 110 0x915c, 111 0x9160, 112 0x9178, 113 0x917c, 114 0x9180, 115 0x918c, 116 0x9190, 117 0x9194, 118 0x9198, 119 0x919c, 120 0x91a8, 121 0x91ac, 122 0x91b0, 123 0x91b4, 124 0x91b8, 125 0x91c4, 126 0x91c8, 127 0x91cc, 128 0x91d0, 129 0x91d4, 130 0x91e0, 131 0x91e4, 132 0x91ec, 133 0x91f0, 134 0x91f4, 135 0x9200, 136 0x9204, 137 0x929c, 138 0x8030, 139 0x9150, 140 0x9a60, 141 0x920c, 142 0x9210, 143 0x9228, 144 0x922c, 145 0x9244, 146 0x9248, 147 0x91e8, 148 0x9294, 149 0x9208, 150 0x9224, 151 0x9240, 152 0x9220, 153 0x923c, 154 0x9258, 155 0x9744, 156 0xa200, 157 0xa204, 158 0xa208, 159 0xa20c, 160 0x8d58, 161 0x9030, 162 0x9034, 163 0x9038, 164 0x903c, 165 0x9040, 166 0x9654, 167 0x897c, 168 0xa210, 169 0xa214, 170 0x9868, 171 0xa02c, 172 0x9664, 173 0x9698, 174 0x949c, 175 0x8e10, 176 0x8e18, 177 0x8c50, 178 0x8c58, 179 0x8c60, 180 0x8c68, 181 0x89b4, 182 0x9830, 183 0x802c, 184 }; 185 186 /* Firmware Names */ 187 MODULE_FIRMWARE("radeon/BARTS_pfp.bin"); 188 MODULE_FIRMWARE("radeon/BARTS_me.bin"); 189 MODULE_FIRMWARE("radeon/BARTS_mc.bin"); 190 MODULE_FIRMWARE("radeon/BARTS_smc.bin"); 191 MODULE_FIRMWARE("radeon/BTC_rlc.bin"); 192 MODULE_FIRMWARE("radeon/TURKS_pfp.bin"); 193 MODULE_FIRMWARE("radeon/TURKS_me.bin"); 194 MODULE_FIRMWARE("radeon/TURKS_mc.bin"); 195 MODULE_FIRMWARE("radeon/TURKS_smc.bin"); 196 MODULE_FIRMWARE("radeon/CAICOS_pfp.bin"); 197 MODULE_FIRMWARE("radeon/CAICOS_me.bin"); 198 MODULE_FIRMWARE("radeon/CAICOS_mc.bin"); 199 MODULE_FIRMWARE("radeon/CAICOS_smc.bin"); 200 MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin"); 201 MODULE_FIRMWARE("radeon/CAYMAN_me.bin"); 202 MODULE_FIRMWARE("radeon/CAYMAN_mc.bin"); 203 MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin"); 204 MODULE_FIRMWARE("radeon/CAYMAN_smc.bin"); 205 MODULE_FIRMWARE("radeon/ARUBA_pfp.bin"); 206 MODULE_FIRMWARE("radeon/ARUBA_me.bin"); 207 MODULE_FIRMWARE("radeon/ARUBA_rlc.bin"); 208 209 210 static const u32 cayman_golden_registers2[] = 211 { 212 0x3e5c, 0xffffffff, 0x00000000, 213 0x3e48, 0xffffffff, 0x00000000, 214 0x3e4c, 0xffffffff, 0x00000000, 215 0x3e64, 0xffffffff, 0x00000000, 216 0x3e50, 0xffffffff, 0x00000000, 217 0x3e60, 0xffffffff, 0x00000000 218 }; 219 220 static const u32 cayman_golden_registers[] = 221 { 222 0x5eb4, 0xffffffff, 0x00000002, 223 0x5e78, 0x8f311ff1, 0x001000f0, 224 0x3f90, 0xffff0000, 0xff000000, 225 0x9148, 0xffff0000, 0xff000000, 226 0x3f94, 0xffff0000, 0xff000000, 227 0x914c, 0xffff0000, 0xff000000, 228 0xc78, 0x00000080, 0x00000080, 229 0xbd4, 0x70073777, 0x00011003, 230 0xd02c, 0xbfffff1f, 0x08421000, 231 0xd0b8, 0x73773777, 0x02011003, 232 0x5bc0, 0x00200000, 0x50100000, 233 0x98f8, 0x33773777, 0x02011003, 234 0x98fc, 0xffffffff, 0x76541032, 235 0x7030, 0x31000311, 0x00000011, 236 0x2f48, 0x33773777, 0x42010001, 237 0x6b28, 0x00000010, 0x00000012, 238 0x7728, 0x00000010, 0x00000012, 239 0x10328, 0x00000010, 0x00000012, 240 0x10f28, 0x00000010, 0x00000012, 241 0x11b28, 0x00000010, 0x00000012, 242 0x12728, 0x00000010, 0x00000012, 243 0x240c, 0x000007ff, 0x00000000, 244 0x8a14, 0xf000001f, 0x00000007, 245 0x8b24, 0x3fff3fff, 0x00ff0fff, 246 0x8b10, 0x0000ff0f, 0x00000000, 247 0x28a4c, 0x07ffffff, 0x06000000, 248 0x10c, 0x00000001, 0x00010003, 249 0xa02c, 0xffffffff, 0x0000009b, 250 0x913c, 0x0000010f, 0x01000100, 251 0x8c04, 0xf8ff00ff, 0x40600060, 252 0x28350, 0x00000f01, 0x00000000, 253 0x9508, 0x3700001f, 0x00000002, 254 0x960c, 0xffffffff, 0x54763210, 255 0x88c4, 0x001f3ae3, 0x00000082, 256 0x88d0, 0xffffffff, 0x0f40df40, 257 0x88d4, 0x0000001f, 0x00000010, 258 0x8974, 0xffffffff, 0x00000000 259 }; 260 261 static const u32 dvst_golden_registers2[] = 262 { 263 0x8f8, 0xffffffff, 0, 264 0x8fc, 0x00380000, 0, 265 0x8f8, 0xffffffff, 1, 266 0x8fc, 0x0e000000, 0 267 }; 268 269 static const u32 dvst_golden_registers[] = 270 { 271 0x690, 0x3fff3fff, 0x20c00033, 272 0x918c, 0x0fff0fff, 0x00010006, 273 0x91a8, 0x0fff0fff, 0x00010006, 274 0x9150, 0xffffdfff, 0x6e944040, 275 0x917c, 0x0fff0fff, 0x00030002, 276 0x9198, 0x0fff0fff, 0x00030002, 277 0x915c, 0x0fff0fff, 0x00010000, 278 0x3f90, 0xffff0001, 0xff000000, 279 0x9178, 0x0fff0fff, 0x00070000, 280 0x9194, 0x0fff0fff, 0x00070000, 281 0x9148, 0xffff0001, 0xff000000, 282 0x9190, 0x0fff0fff, 0x00090008, 283 0x91ac, 0x0fff0fff, 0x00090008, 284 0x3f94, 0xffff0000, 0xff000000, 285 0x914c, 0xffff0000, 0xff000000, 286 0x929c, 0x00000fff, 0x00000001, 287 0x55e4, 0xff607fff, 0xfc000100, 288 0x8a18, 0xff000fff, 0x00000100, 289 0x8b28, 0xff000fff, 0x00000100, 290 0x9144, 0xfffc0fff, 0x00000100, 291 0x6ed8, 0x00010101, 0x00010000, 292 0x9830, 0xffffffff, 0x00000000, 293 0x9834, 0xf00fffff, 0x00000400, 294 0x9838, 0xfffffffe, 0x00000000, 295 0xd0c0, 0xff000fff, 0x00000100, 296 0xd02c, 0xbfffff1f, 0x08421000, 297 0xd0b8, 0x73773777, 0x12010001, 298 0x5bb0, 0x000000f0, 0x00000070, 299 0x98f8, 0x73773777, 0x12010001, 300 0x98fc, 0xffffffff, 0x00000010, 301 0x9b7c, 0x00ff0000, 0x00fc0000, 302 0x8030, 0x00001f0f, 0x0000100a, 303 0x2f48, 0x73773777, 0x12010001, 304 0x2408, 0x00030000, 0x000c007f, 305 0x8a14, 0xf000003f, 0x00000007, 306 0x8b24, 0x3fff3fff, 0x00ff0fff, 307 0x8b10, 0x0000ff0f, 0x00000000, 308 0x28a4c, 0x07ffffff, 0x06000000, 309 0x4d8, 0x00000fff, 0x00000100, 310 0xa008, 0xffffffff, 0x00010000, 311 0x913c, 0xffff03ff, 0x01000100, 312 0x8c00, 0x000000ff, 0x00000003, 313 0x8c04, 0xf8ff00ff, 0x40600060, 314 0x8cf0, 0x1fff1fff, 0x08e00410, 315 0x28350, 0x00000f01, 0x00000000, 316 0x9508, 0xf700071f, 0x00000002, 317 0x960c, 0xffffffff, 0x54763210, 318 0x20ef8, 0x01ff01ff, 0x00000002, 319 0x20e98, 0xfffffbff, 0x00200000, 320 0x2015c, 0xffffffff, 0x00000f40, 321 0x88c4, 0x001f3ae3, 0x00000082, 322 0x8978, 0x3fffffff, 0x04050140, 323 0x88d4, 0x0000001f, 0x00000010, 324 0x8974, 0xffffffff, 0x00000000 325 }; 326 327 static const u32 scrapper_golden_registers[] = 328 { 329 0x690, 0x3fff3fff, 0x20c00033, 330 0x918c, 0x0fff0fff, 0x00010006, 331 0x918c, 0x0fff0fff, 0x00010006, 332 0x91a8, 0x0fff0fff, 0x00010006, 333 0x91a8, 0x0fff0fff, 0x00010006, 334 0x9150, 0xffffdfff, 0x6e944040, 335 0x9150, 0xffffdfff, 0x6e944040, 336 0x917c, 0x0fff0fff, 0x00030002, 337 0x917c, 0x0fff0fff, 0x00030002, 338 0x9198, 0x0fff0fff, 0x00030002, 339 0x9198, 0x0fff0fff, 0x00030002, 340 0x915c, 0x0fff0fff, 0x00010000, 341 0x915c, 0x0fff0fff, 0x00010000, 342 0x3f90, 0xffff0001, 0xff000000, 343 0x3f90, 0xffff0001, 0xff000000, 344 0x9178, 0x0fff0fff, 0x00070000, 345 0x9178, 0x0fff0fff, 0x00070000, 346 0x9194, 0x0fff0fff, 0x00070000, 347 0x9194, 0x0fff0fff, 0x00070000, 348 0x9148, 0xffff0001, 0xff000000, 349 0x9148, 0xffff0001, 0xff000000, 350 0x9190, 0x0fff0fff, 0x00090008, 351 0x9190, 0x0fff0fff, 0x00090008, 352 0x91ac, 0x0fff0fff, 0x00090008, 353 0x91ac, 0x0fff0fff, 0x00090008, 354 0x3f94, 0xffff0000, 0xff000000, 355 0x3f94, 0xffff0000, 0xff000000, 356 0x914c, 0xffff0000, 0xff000000, 357 0x914c, 0xffff0000, 0xff000000, 358 0x929c, 0x00000fff, 0x00000001, 359 0x929c, 0x00000fff, 0x00000001, 360 0x55e4, 0xff607fff, 0xfc000100, 361 0x8a18, 0xff000fff, 0x00000100, 362 0x8a18, 0xff000fff, 0x00000100, 363 0x8b28, 0xff000fff, 0x00000100, 364 0x8b28, 0xff000fff, 0x00000100, 365 0x9144, 0xfffc0fff, 0x00000100, 366 0x9144, 0xfffc0fff, 0x00000100, 367 0x6ed8, 0x00010101, 0x00010000, 368 0x9830, 0xffffffff, 0x00000000, 369 0x9830, 0xffffffff, 0x00000000, 370 0x9834, 0xf00fffff, 0x00000400, 371 0x9834, 0xf00fffff, 0x00000400, 372 0x9838, 0xfffffffe, 0x00000000, 373 0x9838, 0xfffffffe, 0x00000000, 374 0xd0c0, 0xff000fff, 0x00000100, 375 0xd02c, 0xbfffff1f, 0x08421000, 376 0xd02c, 0xbfffff1f, 0x08421000, 377 0xd0b8, 0x73773777, 0x12010001, 378 0xd0b8, 0x73773777, 0x12010001, 379 0x5bb0, 0x000000f0, 0x00000070, 380 0x98f8, 0x73773777, 0x12010001, 381 0x98f8, 0x73773777, 0x12010001, 382 0x98fc, 0xffffffff, 0x00000010, 383 0x98fc, 0xffffffff, 0x00000010, 384 0x9b7c, 0x00ff0000, 0x00fc0000, 385 0x9b7c, 0x00ff0000, 0x00fc0000, 386 0x8030, 0x00001f0f, 0x0000100a, 387 0x8030, 0x00001f0f, 0x0000100a, 388 0x2f48, 0x73773777, 0x12010001, 389 0x2f48, 0x73773777, 0x12010001, 390 0x2408, 0x00030000, 0x000c007f, 391 0x8a14, 0xf000003f, 0x00000007, 392 0x8a14, 0xf000003f, 0x00000007, 393 0x8b24, 0x3fff3fff, 0x00ff0fff, 394 0x8b24, 0x3fff3fff, 0x00ff0fff, 395 0x8b10, 0x0000ff0f, 0x00000000, 396 0x8b10, 0x0000ff0f, 0x00000000, 397 0x28a4c, 0x07ffffff, 0x06000000, 398 0x28a4c, 0x07ffffff, 0x06000000, 399 0x4d8, 0x00000fff, 0x00000100, 400 0x4d8, 0x00000fff, 0x00000100, 401 0xa008, 0xffffffff, 0x00010000, 402 0xa008, 0xffffffff, 0x00010000, 403 0x913c, 0xffff03ff, 0x01000100, 404 0x913c, 0xffff03ff, 0x01000100, 405 0x90e8, 0x001fffff, 0x010400c0, 406 0x8c00, 0x000000ff, 0x00000003, 407 0x8c00, 0x000000ff, 0x00000003, 408 0x8c04, 0xf8ff00ff, 0x40600060, 409 0x8c04, 0xf8ff00ff, 0x40600060, 410 0x8c30, 0x0000000f, 0x00040005, 411 0x8cf0, 0x1fff1fff, 0x08e00410, 412 0x8cf0, 0x1fff1fff, 0x08e00410, 413 0x900c, 0x00ffffff, 0x0017071f, 414 0x28350, 0x00000f01, 0x00000000, 415 0x28350, 0x00000f01, 0x00000000, 416 0x9508, 0xf700071f, 0x00000002, 417 0x9508, 0xf700071f, 0x00000002, 418 0x9688, 0x00300000, 0x0017000f, 419 0x960c, 0xffffffff, 0x54763210, 420 0x960c, 0xffffffff, 0x54763210, 421 0x20ef8, 0x01ff01ff, 0x00000002, 422 0x20e98, 0xfffffbff, 0x00200000, 423 0x2015c, 0xffffffff, 0x00000f40, 424 0x88c4, 0x001f3ae3, 0x00000082, 425 0x88c4, 0x001f3ae3, 0x00000082, 426 0x8978, 0x3fffffff, 0x04050140, 427 0x8978, 0x3fffffff, 0x04050140, 428 0x88d4, 0x0000001f, 0x00000010, 429 0x88d4, 0x0000001f, 0x00000010, 430 0x8974, 0xffffffff, 0x00000000, 431 0x8974, 0xffffffff, 0x00000000 432 }; 433 434 static void ni_init_golden_registers(struct radeon_device *rdev) 435 { 436 switch (rdev->family) { 437 case CHIP_CAYMAN: 438 radeon_program_register_sequence(rdev, 439 cayman_golden_registers, 440 (const u32)ARRAY_SIZE(cayman_golden_registers)); 441 radeon_program_register_sequence(rdev, 442 cayman_golden_registers2, 443 (const u32)ARRAY_SIZE(cayman_golden_registers2)); 444 break; 445 case CHIP_ARUBA: 446 if ((rdev->pdev->device == 0x9900) || 447 (rdev->pdev->device == 0x9901) || 448 (rdev->pdev->device == 0x9903) || 449 (rdev->pdev->device == 0x9904) || 450 (rdev->pdev->device == 0x9905) || 451 (rdev->pdev->device == 0x9906) || 452 (rdev->pdev->device == 0x9907) || 453 (rdev->pdev->device == 0x9908) || 454 (rdev->pdev->device == 0x9909) || 455 (rdev->pdev->device == 0x990A) || 456 (rdev->pdev->device == 0x990B) || 457 (rdev->pdev->device == 0x990C) || 458 (rdev->pdev->device == 0x990D) || 459 (rdev->pdev->device == 0x990E) || 460 (rdev->pdev->device == 0x990F) || 461 (rdev->pdev->device == 0x9910) || 462 (rdev->pdev->device == 0x9913) || 463 (rdev->pdev->device == 0x9917) || 464 (rdev->pdev->device == 0x9918)) { 465 radeon_program_register_sequence(rdev, 466 dvst_golden_registers, 467 (const u32)ARRAY_SIZE(dvst_golden_registers)); 468 radeon_program_register_sequence(rdev, 469 dvst_golden_registers2, 470 (const u32)ARRAY_SIZE(dvst_golden_registers2)); 471 } else { 472 radeon_program_register_sequence(rdev, 473 scrapper_golden_registers, 474 (const u32)ARRAY_SIZE(scrapper_golden_registers)); 475 radeon_program_register_sequence(rdev, 476 dvst_golden_registers2, 477 (const u32)ARRAY_SIZE(dvst_golden_registers2)); 478 } 479 break; 480 default: 481 break; 482 } 483 } 484 485 #define BTC_IO_MC_REGS_SIZE 29 486 487 static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 488 {0x00000077, 0xff010100}, 489 {0x00000078, 0x00000000}, 490 {0x00000079, 0x00001434}, 491 {0x0000007a, 0xcc08ec08}, 492 {0x0000007b, 0x00040000}, 493 {0x0000007c, 0x000080c0}, 494 {0x0000007d, 0x09000000}, 495 {0x0000007e, 0x00210404}, 496 {0x00000081, 0x08a8e800}, 497 {0x00000082, 0x00030444}, 498 {0x00000083, 0x00000000}, 499 {0x00000085, 0x00000001}, 500 {0x00000086, 0x00000002}, 501 {0x00000087, 0x48490000}, 502 {0x00000088, 0x20244647}, 503 {0x00000089, 0x00000005}, 504 {0x0000008b, 0x66030000}, 505 {0x0000008c, 0x00006603}, 506 {0x0000008d, 0x00000100}, 507 {0x0000008f, 0x00001c0a}, 508 {0x00000090, 0xff000001}, 509 {0x00000094, 0x00101101}, 510 {0x00000095, 0x00000fff}, 511 {0x00000096, 0x00116fff}, 512 {0x00000097, 0x60010000}, 513 {0x00000098, 0x10010000}, 514 {0x00000099, 0x00006000}, 515 {0x0000009a, 0x00001000}, 516 {0x0000009f, 0x00946a00} 517 }; 518 519 static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 520 {0x00000077, 0xff010100}, 521 {0x00000078, 0x00000000}, 522 {0x00000079, 0x00001434}, 523 {0x0000007a, 0xcc08ec08}, 524 {0x0000007b, 0x00040000}, 525 {0x0000007c, 0x000080c0}, 526 {0x0000007d, 0x09000000}, 527 {0x0000007e, 0x00210404}, 528 {0x00000081, 0x08a8e800}, 529 {0x00000082, 0x00030444}, 530 {0x00000083, 0x00000000}, 531 {0x00000085, 0x00000001}, 532 {0x00000086, 0x00000002}, 533 {0x00000087, 0x48490000}, 534 {0x00000088, 0x20244647}, 535 {0x00000089, 0x00000005}, 536 {0x0000008b, 0x66030000}, 537 {0x0000008c, 0x00006603}, 538 {0x0000008d, 0x00000100}, 539 {0x0000008f, 0x00001c0a}, 540 {0x00000090, 0xff000001}, 541 {0x00000094, 0x00101101}, 542 {0x00000095, 0x00000fff}, 543 {0x00000096, 0x00116fff}, 544 {0x00000097, 0x60010000}, 545 {0x00000098, 0x10010000}, 546 {0x00000099, 0x00006000}, 547 {0x0000009a, 0x00001000}, 548 {0x0000009f, 0x00936a00} 549 }; 550 551 static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 552 {0x00000077, 0xff010100}, 553 {0x00000078, 0x00000000}, 554 {0x00000079, 0x00001434}, 555 {0x0000007a, 0xcc08ec08}, 556 {0x0000007b, 0x00040000}, 557 {0x0000007c, 0x000080c0}, 558 {0x0000007d, 0x09000000}, 559 {0x0000007e, 0x00210404}, 560 {0x00000081, 0x08a8e800}, 561 {0x00000082, 0x00030444}, 562 {0x00000083, 0x00000000}, 563 {0x00000085, 0x00000001}, 564 {0x00000086, 0x00000002}, 565 {0x00000087, 0x48490000}, 566 {0x00000088, 0x20244647}, 567 {0x00000089, 0x00000005}, 568 {0x0000008b, 0x66030000}, 569 {0x0000008c, 0x00006603}, 570 {0x0000008d, 0x00000100}, 571 {0x0000008f, 0x00001c0a}, 572 {0x00000090, 0xff000001}, 573 {0x00000094, 0x00101101}, 574 {0x00000095, 0x00000fff}, 575 {0x00000096, 0x00116fff}, 576 {0x00000097, 0x60010000}, 577 {0x00000098, 0x10010000}, 578 {0x00000099, 0x00006000}, 579 {0x0000009a, 0x00001000}, 580 {0x0000009f, 0x00916a00} 581 }; 582 583 static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 584 {0x00000077, 0xff010100}, 585 {0x00000078, 0x00000000}, 586 {0x00000079, 0x00001434}, 587 {0x0000007a, 0xcc08ec08}, 588 {0x0000007b, 0x00040000}, 589 {0x0000007c, 0x000080c0}, 590 {0x0000007d, 0x09000000}, 591 {0x0000007e, 0x00210404}, 592 {0x00000081, 0x08a8e800}, 593 {0x00000082, 0x00030444}, 594 {0x00000083, 0x00000000}, 595 {0x00000085, 0x00000001}, 596 {0x00000086, 0x00000002}, 597 {0x00000087, 0x48490000}, 598 {0x00000088, 0x20244647}, 599 {0x00000089, 0x00000005}, 600 {0x0000008b, 0x66030000}, 601 {0x0000008c, 0x00006603}, 602 {0x0000008d, 0x00000100}, 603 {0x0000008f, 0x00001c0a}, 604 {0x00000090, 0xff000001}, 605 {0x00000094, 0x00101101}, 606 {0x00000095, 0x00000fff}, 607 {0x00000096, 0x00116fff}, 608 {0x00000097, 0x60010000}, 609 {0x00000098, 0x10010000}, 610 {0x00000099, 0x00006000}, 611 {0x0000009a, 0x00001000}, 612 {0x0000009f, 0x00976b00} 613 }; 614 615 int ni_mc_load_microcode(struct radeon_device *rdev) 616 { 617 const __be32 *fw_data; 618 u32 mem_type, running, blackout = 0; 619 u32 *io_mc_regs; 620 int i, ucode_size, regs_size; 621 622 if (!rdev->mc_fw) 623 return -EINVAL; 624 625 switch (rdev->family) { 626 case CHIP_BARTS: 627 io_mc_regs = (u32 *)&barts_io_mc_regs; 628 ucode_size = BTC_MC_UCODE_SIZE; 629 regs_size = BTC_IO_MC_REGS_SIZE; 630 break; 631 case CHIP_TURKS: 632 io_mc_regs = (u32 *)&turks_io_mc_regs; 633 ucode_size = BTC_MC_UCODE_SIZE; 634 regs_size = BTC_IO_MC_REGS_SIZE; 635 break; 636 case CHIP_CAICOS: 637 default: 638 io_mc_regs = (u32 *)&caicos_io_mc_regs; 639 ucode_size = BTC_MC_UCODE_SIZE; 640 regs_size = BTC_IO_MC_REGS_SIZE; 641 break; 642 case CHIP_CAYMAN: 643 io_mc_regs = (u32 *)&cayman_io_mc_regs; 644 ucode_size = CAYMAN_MC_UCODE_SIZE; 645 regs_size = BTC_IO_MC_REGS_SIZE; 646 break; 647 } 648 649 mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT; 650 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; 651 652 if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) { 653 if (running) { 654 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); 655 WREG32(MC_SHARED_BLACKOUT_CNTL, 1); 656 } 657 658 /* reset the engine and set to writable */ 659 WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 660 WREG32(MC_SEQ_SUP_CNTL, 0x00000010); 661 662 /* load mc io regs */ 663 for (i = 0; i < regs_size; i++) { 664 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 665 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 666 } 667 /* load the MC ucode */ 668 fw_data = (const __be32 *)rdev->mc_fw->data; 669 for (i = 0; i < ucode_size; i++) 670 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 671 672 /* put the engine back into the active state */ 673 WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 674 WREG32(MC_SEQ_SUP_CNTL, 0x00000004); 675 WREG32(MC_SEQ_SUP_CNTL, 0x00000001); 676 677 /* wait for training to complete */ 678 for (i = 0; i < rdev->usec_timeout; i++) { 679 if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD) 680 break; 681 udelay(1); 682 } 683 684 if (running) 685 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout); 686 } 687 688 return 0; 689 } 690 691 int ni_init_microcode(struct radeon_device *rdev) 692 { 693 const char *chip_name; 694 const char *rlc_chip_name; 695 size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size; 696 size_t smc_req_size = 0; 697 char fw_name[30]; 698 int err; 699 700 DRM_DEBUG("\n"); 701 702 switch (rdev->family) { 703 case CHIP_BARTS: 704 chip_name = "BARTS"; 705 rlc_chip_name = "BTC"; 706 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 707 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 708 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 709 mc_req_size = BTC_MC_UCODE_SIZE * 4; 710 smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4); 711 break; 712 case CHIP_TURKS: 713 chip_name = "TURKS"; 714 rlc_chip_name = "BTC"; 715 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 716 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 717 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 718 mc_req_size = BTC_MC_UCODE_SIZE * 4; 719 smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4); 720 break; 721 case CHIP_CAICOS: 722 chip_name = "CAICOS"; 723 rlc_chip_name = "BTC"; 724 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 725 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 726 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 727 mc_req_size = BTC_MC_UCODE_SIZE * 4; 728 smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4); 729 break; 730 case CHIP_CAYMAN: 731 chip_name = "CAYMAN"; 732 rlc_chip_name = "CAYMAN"; 733 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 734 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 735 rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4; 736 mc_req_size = CAYMAN_MC_UCODE_SIZE * 4; 737 smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4); 738 break; 739 case CHIP_ARUBA: 740 chip_name = "ARUBA"; 741 rlc_chip_name = "ARUBA"; 742 /* pfp/me same size as CAYMAN */ 743 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 744 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 745 rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4; 746 mc_req_size = 0; 747 break; 748 default: BUG(); 749 } 750 751 DRM_INFO("Loading %s Microcode\n", chip_name); 752 753 ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_pfp", chip_name); 754 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 755 if (err) 756 goto out; 757 if (rdev->pfp_fw->datasize != pfp_req_size) { 758 printk(KERN_ERR 759 "ni_pfp: Bogus length %zu in firmware \"%s\"\n", 760 rdev->pfp_fw->datasize, fw_name); 761 err = -EINVAL; 762 goto out; 763 } 764 765 ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_me", chip_name); 766 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 767 if (err) 768 goto out; 769 if (rdev->me_fw->datasize != me_req_size) { 770 printk(KERN_ERR 771 "ni_me: Bogus length %zu in firmware \"%s\"\n", 772 rdev->me_fw->datasize, fw_name); 773 err = -EINVAL; 774 } 775 776 ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_rlc", 777 rlc_chip_name); 778 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 779 if (err) 780 goto out; 781 if (rdev->rlc_fw->datasize != rlc_req_size) { 782 printk(KERN_ERR 783 "ni_rlc: Bogus length %zu in firmware \"%s\"\n", 784 rdev->rlc_fw->datasize, fw_name); 785 err = -EINVAL; 786 } 787 788 /* no MC ucode on TN */ 789 if (!(rdev->flags & RADEON_IS_IGP)) { 790 ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mc", chip_name); 791 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 792 if (err) 793 goto out; 794 if (rdev->mc_fw->datasize != mc_req_size) { 795 printk(KERN_ERR 796 "ni_mc: Bogus length %zu in firmware \"%s\"\n", 797 rdev->mc_fw->datasize, fw_name); 798 err = -EINVAL; 799 } 800 } 801 802 if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) { 803 ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_smc", chip_name); 804 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 805 if (err) { 806 printk(KERN_ERR 807 "smc: error loading firmware \"%s\"\n", 808 fw_name); 809 release_firmware(rdev->smc_fw); 810 rdev->smc_fw = NULL; 811 err = 0; 812 } else if (rdev->smc_fw->datasize != smc_req_size) { 813 printk(KERN_ERR 814 "ni_smc: Bogus length %zu in firmware \"%s\"\n", 815 rdev->smc_fw->datasize, fw_name); 816 err = -EINVAL; 817 } 818 } 819 820 out: 821 if (err) { 822 if (err != -EINVAL) 823 printk(KERN_ERR 824 "ni_cp: Failed to load firmware \"%s\"\n", 825 fw_name); 826 release_firmware(rdev->pfp_fw); 827 rdev->pfp_fw = NULL; 828 release_firmware(rdev->me_fw); 829 rdev->me_fw = NULL; 830 release_firmware(rdev->rlc_fw); 831 rdev->rlc_fw = NULL; 832 release_firmware(rdev->mc_fw); 833 rdev->mc_fw = NULL; 834 release_firmware(rdev->smc_fw); 835 rdev->smc_fw = NULL; 836 } 837 return err; 838 } 839 840 /** 841 * ni_fini_microcode - drop the firmwares image references 842 * 843 * @rdev: radeon_device pointer 844 * 845 * Drop the pfp, me, mc and rlc firmwares image references. 846 * Called at driver shutdown. 847 */ 848 void ni_fini_microcode(struct radeon_device *rdev) 849 { 850 release_firmware(rdev->pfp_fw); 851 rdev->pfp_fw = NULL; 852 release_firmware(rdev->me_fw); 853 rdev->me_fw = NULL; 854 release_firmware(rdev->rlc_fw); 855 rdev->rlc_fw = NULL; 856 release_firmware(rdev->mc_fw); 857 rdev->mc_fw = NULL; 858 release_firmware(rdev->smc_fw); 859 rdev->smc_fw = NULL; 860 } 861 862 /** 863 * cayman_get_allowed_info_register - fetch the register for the info ioctl 864 * 865 * @rdev: radeon_device pointer 866 * @reg: register offset in bytes 867 * @val: register value 868 * 869 * Returns 0 for success or -EINVAL for an invalid register 870 * 871 */ 872 int cayman_get_allowed_info_register(struct radeon_device *rdev, 873 u32 reg, u32 *val) 874 { 875 switch (reg) { 876 case GRBM_STATUS: 877 case GRBM_STATUS_SE0: 878 case GRBM_STATUS_SE1: 879 case SRBM_STATUS: 880 case SRBM_STATUS2: 881 case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET): 882 case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET): 883 case UVD_STATUS: 884 *val = RREG32(reg); 885 return 0; 886 default: 887 return -EINVAL; 888 } 889 } 890 891 int tn_get_temp(struct radeon_device *rdev) 892 { 893 u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff; 894 int actual_temp = (temp / 8) - 49; 895 896 return actual_temp * 1000; 897 } 898 899 /* 900 * Core functions 901 */ 902 static void cayman_gpu_init(struct radeon_device *rdev) 903 { 904 u32 gb_addr_config = 0; 905 u32 mc_shared_chmap, mc_arb_ramcfg; 906 u32 cgts_tcc_disable; 907 u32 sx_debug_1; 908 u32 smx_dc_ctl0; 909 u32 cgts_sm_ctrl_reg; 910 u32 hdp_host_path_cntl; 911 u32 tmp; 912 u32 disabled_rb_mask; 913 int i, j; 914 915 switch (rdev->family) { 916 case CHIP_CAYMAN: 917 rdev->config.cayman.max_shader_engines = 2; 918 rdev->config.cayman.max_pipes_per_simd = 4; 919 rdev->config.cayman.max_tile_pipes = 8; 920 rdev->config.cayman.max_simds_per_se = 12; 921 rdev->config.cayman.max_backends_per_se = 4; 922 rdev->config.cayman.max_texture_channel_caches = 8; 923 rdev->config.cayman.max_gprs = 256; 924 rdev->config.cayman.max_threads = 256; 925 rdev->config.cayman.max_gs_threads = 32; 926 rdev->config.cayman.max_stack_entries = 512; 927 rdev->config.cayman.sx_num_of_sets = 8; 928 rdev->config.cayman.sx_max_export_size = 256; 929 rdev->config.cayman.sx_max_export_pos_size = 64; 930 rdev->config.cayman.sx_max_export_smx_size = 192; 931 rdev->config.cayman.max_hw_contexts = 8; 932 rdev->config.cayman.sq_num_cf_insts = 2; 933 934 rdev->config.cayman.sc_prim_fifo_size = 0x100; 935 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 936 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 937 gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN; 938 break; 939 case CHIP_ARUBA: 940 default: 941 rdev->config.cayman.max_shader_engines = 1; 942 rdev->config.cayman.max_pipes_per_simd = 4; 943 rdev->config.cayman.max_tile_pipes = 2; 944 if ((rdev->pdev->device == 0x9900) || 945 (rdev->pdev->device == 0x9901) || 946 (rdev->pdev->device == 0x9905) || 947 (rdev->pdev->device == 0x9906) || 948 (rdev->pdev->device == 0x9907) || 949 (rdev->pdev->device == 0x9908) || 950 (rdev->pdev->device == 0x9909) || 951 (rdev->pdev->device == 0x990B) || 952 (rdev->pdev->device == 0x990C) || 953 (rdev->pdev->device == 0x990F) || 954 (rdev->pdev->device == 0x9910) || 955 (rdev->pdev->device == 0x9917) || 956 (rdev->pdev->device == 0x9999) || 957 (rdev->pdev->device == 0x999C)) { 958 rdev->config.cayman.max_simds_per_se = 6; 959 rdev->config.cayman.max_backends_per_se = 2; 960 rdev->config.cayman.max_hw_contexts = 8; 961 rdev->config.cayman.sx_max_export_size = 256; 962 rdev->config.cayman.sx_max_export_pos_size = 64; 963 rdev->config.cayman.sx_max_export_smx_size = 192; 964 } else if ((rdev->pdev->device == 0x9903) || 965 (rdev->pdev->device == 0x9904) || 966 (rdev->pdev->device == 0x990A) || 967 (rdev->pdev->device == 0x990D) || 968 (rdev->pdev->device == 0x990E) || 969 (rdev->pdev->device == 0x9913) || 970 (rdev->pdev->device == 0x9918) || 971 (rdev->pdev->device == 0x999D)) { 972 rdev->config.cayman.max_simds_per_se = 4; 973 rdev->config.cayman.max_backends_per_se = 2; 974 rdev->config.cayman.max_hw_contexts = 8; 975 rdev->config.cayman.sx_max_export_size = 256; 976 rdev->config.cayman.sx_max_export_pos_size = 64; 977 rdev->config.cayman.sx_max_export_smx_size = 192; 978 } else if ((rdev->pdev->device == 0x9919) || 979 (rdev->pdev->device == 0x9990) || 980 (rdev->pdev->device == 0x9991) || 981 (rdev->pdev->device == 0x9994) || 982 (rdev->pdev->device == 0x9995) || 983 (rdev->pdev->device == 0x9996) || 984 (rdev->pdev->device == 0x999A) || 985 (rdev->pdev->device == 0x99A0)) { 986 rdev->config.cayman.max_simds_per_se = 3; 987 rdev->config.cayman.max_backends_per_se = 1; 988 rdev->config.cayman.max_hw_contexts = 4; 989 rdev->config.cayman.sx_max_export_size = 128; 990 rdev->config.cayman.sx_max_export_pos_size = 32; 991 rdev->config.cayman.sx_max_export_smx_size = 96; 992 } else { 993 rdev->config.cayman.max_simds_per_se = 2; 994 rdev->config.cayman.max_backends_per_se = 1; 995 rdev->config.cayman.max_hw_contexts = 4; 996 rdev->config.cayman.sx_max_export_size = 128; 997 rdev->config.cayman.sx_max_export_pos_size = 32; 998 rdev->config.cayman.sx_max_export_smx_size = 96; 999 } 1000 rdev->config.cayman.max_texture_channel_caches = 2; 1001 rdev->config.cayman.max_gprs = 256; 1002 rdev->config.cayman.max_threads = 256; 1003 rdev->config.cayman.max_gs_threads = 32; 1004 rdev->config.cayman.max_stack_entries = 512; 1005 rdev->config.cayman.sx_num_of_sets = 8; 1006 rdev->config.cayman.sq_num_cf_insts = 2; 1007 1008 rdev->config.cayman.sc_prim_fifo_size = 0x40; 1009 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 1010 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 1011 gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN; 1012 break; 1013 } 1014 1015 /* Initialize HDP */ 1016 for (i = 0, j = 0; i < 32; i++, j += 0x18) { 1017 WREG32((0x2c14 + j), 0x00000000); 1018 WREG32((0x2c18 + j), 0x00000000); 1019 WREG32((0x2c1c + j), 0x00000000); 1020 WREG32((0x2c20 + j), 0x00000000); 1021 WREG32((0x2c24 + j), 0x00000000); 1022 } 1023 1024 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 1025 WREG32(SRBM_INT_CNTL, 0x1); 1026 WREG32(SRBM_INT_ACK, 0x1); 1027 1028 evergreen_fix_pci_max_read_req_size(rdev); 1029 1030 mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 1031 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 1032 1033 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; 1034 rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; 1035 if (rdev->config.cayman.mem_row_size_in_kb > 4) 1036 rdev->config.cayman.mem_row_size_in_kb = 4; 1037 /* XXX use MC settings? */ 1038 rdev->config.cayman.shader_engine_tile_size = 32; 1039 rdev->config.cayman.num_gpus = 1; 1040 rdev->config.cayman.multi_gpu_tile_size = 64; 1041 1042 tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; 1043 rdev->config.cayman.num_tile_pipes = (1 << tmp); 1044 tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; 1045 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256; 1046 tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT; 1047 rdev->config.cayman.num_shader_engines = tmp + 1; 1048 tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT; 1049 rdev->config.cayman.num_gpus = tmp + 1; 1050 tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT; 1051 rdev->config.cayman.multi_gpu_tile_size = 1 << tmp; 1052 tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; 1053 rdev->config.cayman.mem_row_size_in_kb = 1 << tmp; 1054 1055 1056 /* setup tiling info dword. gb_addr_config is not adequate since it does 1057 * not have bank info, so create a custom tiling dword. 1058 * bits 3:0 num_pipes 1059 * bits 7:4 num_banks 1060 * bits 11:8 group_size 1061 * bits 15:12 row_size 1062 */ 1063 rdev->config.cayman.tile_config = 0; 1064 switch (rdev->config.cayman.num_tile_pipes) { 1065 case 1: 1066 default: 1067 rdev->config.cayman.tile_config |= (0 << 0); 1068 break; 1069 case 2: 1070 rdev->config.cayman.tile_config |= (1 << 0); 1071 break; 1072 case 4: 1073 rdev->config.cayman.tile_config |= (2 << 0); 1074 break; 1075 case 8: 1076 rdev->config.cayman.tile_config |= (3 << 0); 1077 break; 1078 } 1079 1080 /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ 1081 if (rdev->flags & RADEON_IS_IGP) 1082 rdev->config.cayman.tile_config |= 1 << 4; 1083 else { 1084 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { 1085 case 0: /* four banks */ 1086 rdev->config.cayman.tile_config |= 0 << 4; 1087 break; 1088 case 1: /* eight banks */ 1089 rdev->config.cayman.tile_config |= 1 << 4; 1090 break; 1091 case 2: /* sixteen banks */ 1092 default: 1093 rdev->config.cayman.tile_config |= 2 << 4; 1094 break; 1095 } 1096 } 1097 rdev->config.cayman.tile_config |= 1098 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; 1099 rdev->config.cayman.tile_config |= 1100 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; 1101 1102 tmp = 0; 1103 for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) { 1104 u32 rb_disable_bitmap; 1105 1106 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1107 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1108 rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; 1109 tmp <<= 4; 1110 tmp |= rb_disable_bitmap; 1111 } 1112 /* enabled rb are just the one not disabled :) */ 1113 disabled_rb_mask = tmp; 1114 tmp = 0; 1115 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 1116 tmp |= (1 << i); 1117 /* if all the backends are disabled, fix it up here */ 1118 if ((disabled_rb_mask & tmp) == tmp) { 1119 for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 1120 disabled_rb_mask &= ~(1 << i); 1121 } 1122 1123 for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) { 1124 u32 simd_disable_bitmap; 1125 1126 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1127 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 1128 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; 1129 simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se; 1130 tmp <<= 16; 1131 tmp |= simd_disable_bitmap; 1132 } 1133 rdev->config.cayman.active_simds = hweight32(~tmp); 1134 1135 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1136 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1137 1138 WREG32(GB_ADDR_CONFIG, gb_addr_config); 1139 WREG32(DMIF_ADDR_CONFIG, gb_addr_config); 1140 if (ASIC_IS_DCE6(rdev)) 1141 WREG32(DMIF_ADDR_CALC, gb_addr_config); 1142 WREG32(HDP_ADDR_CONFIG, gb_addr_config); 1143 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config); 1144 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config); 1145 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config); 1146 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config); 1147 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config); 1148 1149 if ((rdev->config.cayman.max_backends_per_se == 1) && 1150 (rdev->flags & RADEON_IS_IGP)) { 1151 if ((disabled_rb_mask & 3) == 2) { 1152 /* RB1 disabled, RB0 enabled */ 1153 tmp = 0x00000000; 1154 } else { 1155 /* RB0 disabled, RB1 enabled */ 1156 tmp = 0x11111111; 1157 } 1158 } else { 1159 tmp = gb_addr_config & NUM_PIPES_MASK; 1160 tmp = r6xx_remap_render_backend(rdev, tmp, 1161 rdev->config.cayman.max_backends_per_se * 1162 rdev->config.cayman.max_shader_engines, 1163 CAYMAN_MAX_BACKENDS, disabled_rb_mask); 1164 } 1165 WREG32(GB_BACKEND_MAP, tmp); 1166 1167 cgts_tcc_disable = 0xffff0000; 1168 for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++) 1169 cgts_tcc_disable &= ~(1 << (16 + i)); 1170 WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); 1171 WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable); 1172 WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable); 1173 WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); 1174 1175 /* reprogram the shader complex */ 1176 cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG); 1177 for (i = 0; i < 16; i++) 1178 WREG32(CGTS_SM_CTRL_REG, OVERRIDE); 1179 WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg); 1180 1181 /* set HW defaults for 3D engine */ 1182 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60)); 1183 1184 sx_debug_1 = RREG32(SX_DEBUG_1); 1185 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 1186 WREG32(SX_DEBUG_1, sx_debug_1); 1187 1188 smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 1189 smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff); 1190 smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets); 1191 WREG32(SMX_DC_CTL0, smx_dc_ctl0); 1192 1193 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE); 1194 1195 /* need to be explicitly zero-ed */ 1196 WREG32(VGT_OFFCHIP_LDS_BASE, 0); 1197 WREG32(SQ_LSTMP_RING_BASE, 0); 1198 WREG32(SQ_HSTMP_RING_BASE, 0); 1199 WREG32(SQ_ESTMP_RING_BASE, 0); 1200 WREG32(SQ_GSTMP_RING_BASE, 0); 1201 WREG32(SQ_VSTMP_RING_BASE, 0); 1202 WREG32(SQ_PSTMP_RING_BASE, 0); 1203 1204 WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO); 1205 1206 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) | 1207 POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) | 1208 SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1))); 1209 1210 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) | 1211 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) | 1212 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size))); 1213 1214 1215 WREG32(VGT_NUM_INSTANCES, 1); 1216 1217 WREG32(CP_PERFMON_CNTL, 0); 1218 1219 WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) | 1220 FETCH_FIFO_HIWATER(0x4) | 1221 DONE_FIFO_HIWATER(0xe0) | 1222 ALU_UPDATE_FIFO_HIWATER(0x8))); 1223 1224 WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4)); 1225 WREG32(SQ_CONFIG, (VC_ENABLE | 1226 EXPORT_SRC_C | 1227 GFX_PRIO(0) | 1228 CS1_PRIO(0) | 1229 CS2_PRIO(1))); 1230 WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE); 1231 1232 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 1233 FORCE_EOV_MAX_REZ_CNT(255))); 1234 1235 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) | 1236 AUTO_INVLD_EN(ES_AND_GS_AUTO)); 1237 1238 WREG32(VGT_GS_VERTEX_REUSE, 16); 1239 WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 1240 1241 WREG32(CB_PERF_CTR0_SEL_0, 0); 1242 WREG32(CB_PERF_CTR0_SEL_1, 0); 1243 WREG32(CB_PERF_CTR1_SEL_0, 0); 1244 WREG32(CB_PERF_CTR1_SEL_1, 0); 1245 WREG32(CB_PERF_CTR2_SEL_0, 0); 1246 WREG32(CB_PERF_CTR2_SEL_1, 0); 1247 WREG32(CB_PERF_CTR3_SEL_0, 0); 1248 WREG32(CB_PERF_CTR3_SEL_1, 0); 1249 1250 tmp = RREG32(HDP_MISC_CNTL); 1251 tmp |= HDP_FLUSH_INVALIDATE_CACHE; 1252 WREG32(HDP_MISC_CNTL, tmp); 1253 1254 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 1255 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 1256 1257 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3)); 1258 1259 udelay(50); 1260 1261 /* set clockgating golden values on TN */ 1262 if (rdev->family == CHIP_ARUBA) { 1263 tmp = RREG32_CG(CG_CGTT_LOCAL_0); 1264 tmp &= ~0x00380000; 1265 WREG32_CG(CG_CGTT_LOCAL_0, tmp); 1266 tmp = RREG32_CG(CG_CGTT_LOCAL_1); 1267 tmp &= ~0x0e000000; 1268 WREG32_CG(CG_CGTT_LOCAL_1, tmp); 1269 } 1270 } 1271 1272 /* 1273 * GART 1274 */ 1275 void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev) 1276 { 1277 /* flush hdp cache */ 1278 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 1279 1280 /* bits 0-7 are the VM contexts0-7 */ 1281 WREG32(VM_INVALIDATE_REQUEST, 1); 1282 } 1283 1284 static int cayman_pcie_gart_enable(struct radeon_device *rdev) 1285 { 1286 int i, r; 1287 1288 if (rdev->gart.robj == NULL) { 1289 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 1290 return -EINVAL; 1291 } 1292 r = radeon_gart_table_vram_pin(rdev); 1293 if (r) 1294 return r; 1295 /* Setup TLB control */ 1296 WREG32(MC_VM_MX_L1_TLB_CNTL, 1297 (0xA << 7) | 1298 ENABLE_L1_TLB | 1299 ENABLE_L1_FRAGMENT_PROCESSING | 1300 SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1301 ENABLE_ADVANCED_DRIVER_MODEL | 1302 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 1303 /* Setup L2 cache */ 1304 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | 1305 ENABLE_L2_FRAGMENT_PROCESSING | 1306 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1307 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 1308 EFFECTIVE_L2_QUEUE_SIZE(7) | 1309 CONTEXT1_IDENTITY_ACCESS_MODE(1)); 1310 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE); 1311 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 1312 BANK_SELECT(6) | 1313 L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 1314 /* setup context0 */ 1315 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 1316 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 1317 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 1318 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 1319 (u32)(rdev->dummy_page.addr >> 12)); 1320 WREG32(VM_CONTEXT0_CNTL2, 0); 1321 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 1322 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 1323 1324 WREG32(0x15D4, 0); 1325 WREG32(0x15D8, 0); 1326 WREG32(0x15DC, 0); 1327 1328 /* empty context1-7 */ 1329 /* Assign the pt base to something valid for now; the pts used for 1330 * the VMs are determined by the application and setup and assigned 1331 * on the fly in the vm part of radeon_gart.c 1332 */ 1333 for (i = 1; i < 8; i++) { 1334 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0); 1335 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), 1336 rdev->vm_manager.max_pfn - 1); 1337 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), 1338 rdev->vm_manager.saved_table_addr[i]); 1339 } 1340 1341 /* enable context1-7 */ 1342 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR, 1343 (u32)(rdev->dummy_page.addr >> 12)); 1344 WREG32(VM_CONTEXT1_CNTL2, 4); 1345 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 1346 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) | 1347 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1348 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 1349 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1350 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT | 1351 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT | 1352 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT | 1353 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT | 1354 VALID_PROTECTION_FAULT_ENABLE_DEFAULT | 1355 READ_PROTECTION_FAULT_ENABLE_INTERRUPT | 1356 READ_PROTECTION_FAULT_ENABLE_DEFAULT | 1357 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1358 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); 1359 1360 cayman_pcie_gart_tlb_flush(rdev); 1361 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1362 (unsigned)(rdev->mc.gtt_size >> 20), 1363 (unsigned long long)rdev->gart.table_addr); 1364 rdev->gart.ready = true; 1365 return 0; 1366 } 1367 1368 static void cayman_pcie_gart_disable(struct radeon_device *rdev) 1369 { 1370 unsigned i; 1371 1372 for (i = 1; i < 8; ++i) { 1373 rdev->vm_manager.saved_table_addr[i] = RREG32( 1374 VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2)); 1375 } 1376 1377 /* Disable all tables */ 1378 WREG32(VM_CONTEXT0_CNTL, 0); 1379 WREG32(VM_CONTEXT1_CNTL, 0); 1380 /* Setup TLB control */ 1381 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING | 1382 SYSTEM_ACCESS_MODE_NOT_IN_SYS | 1383 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 1384 /* Setup L2 cache */ 1385 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 1386 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 1387 EFFECTIVE_L2_QUEUE_SIZE(7) | 1388 CONTEXT1_IDENTITY_ACCESS_MODE(1)); 1389 WREG32(VM_L2_CNTL2, 0); 1390 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 1391 L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 1392 radeon_gart_table_vram_unpin(rdev); 1393 } 1394 1395 static void cayman_pcie_gart_fini(struct radeon_device *rdev) 1396 { 1397 cayman_pcie_gart_disable(rdev); 1398 radeon_gart_table_vram_free(rdev); 1399 radeon_gart_fini(rdev); 1400 } 1401 1402 void cayman_cp_int_cntl_setup(struct radeon_device *rdev, 1403 int ring, u32 cp_int_cntl) 1404 { 1405 WREG32(SRBM_GFX_CNTL, RINGID(ring)); 1406 WREG32(CP_INT_CNTL, cp_int_cntl); 1407 } 1408 1409 /* 1410 * CP. 1411 */ 1412 void cayman_fence_ring_emit(struct radeon_device *rdev, 1413 struct radeon_fence *fence) 1414 { 1415 struct radeon_ring *ring = &rdev->ring[fence->ring]; 1416 u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 1417 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 1418 PACKET3_SH_ACTION_ENA; 1419 1420 /* flush read cache over gart for this vmid */ 1421 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 1422 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 1423 radeon_ring_write(ring, 0xFFFFFFFF); 1424 radeon_ring_write(ring, 0); 1425 radeon_ring_write(ring, 10); /* poll interval */ 1426 /* EVENT_WRITE_EOP - flush caches, send int */ 1427 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 1428 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 1429 radeon_ring_write(ring, lower_32_bits(addr)); 1430 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 1431 radeon_ring_write(ring, fence->seq); 1432 radeon_ring_write(ring, 0); 1433 } 1434 1435 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 1436 { 1437 struct radeon_ring *ring = &rdev->ring[ib->ring]; 1438 unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0; 1439 u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 1440 PACKET3_SH_ACTION_ENA; 1441 1442 /* set to DX10/11 mode */ 1443 radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); 1444 radeon_ring_write(ring, 1); 1445 1446 if (ring->rptr_save_reg) { 1447 uint32_t next_rptr = ring->wptr + 3 + 4 + 8; 1448 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 1449 radeon_ring_write(ring, ((ring->rptr_save_reg - 1450 PACKET3_SET_CONFIG_REG_START) >> 2)); 1451 radeon_ring_write(ring, next_rptr); 1452 } 1453 1454 radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 1455 radeon_ring_write(ring, 1456 #ifdef __BIG_ENDIAN 1457 (2 << 0) | 1458 #endif 1459 (ib->gpu_addr & 0xFFFFFFFC)); 1460 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF); 1461 radeon_ring_write(ring, ib->length_dw | (vm_id << 24)); 1462 1463 /* flush read cache over gart for this vmid */ 1464 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 1465 radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 1466 radeon_ring_write(ring, 0xFFFFFFFF); 1467 radeon_ring_write(ring, 0); 1468 radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */ 1469 } 1470 1471 static void cayman_cp_enable(struct radeon_device *rdev, bool enable) 1472 { 1473 if (enable) 1474 WREG32(CP_ME_CNTL, 0); 1475 else { 1476 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 1477 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 1478 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 1479 WREG32(SCRATCH_UMSK, 0); 1480 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1481 } 1482 } 1483 1484 u32 cayman_gfx_get_rptr(struct radeon_device *rdev, 1485 struct radeon_ring *ring) 1486 { 1487 u32 rptr; 1488 1489 if (rdev->wb.enabled) 1490 rptr = rdev->wb.wb[ring->rptr_offs/4]; 1491 else { 1492 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 1493 rptr = RREG32(CP_RB0_RPTR); 1494 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 1495 rptr = RREG32(CP_RB1_RPTR); 1496 else 1497 rptr = RREG32(CP_RB2_RPTR); 1498 } 1499 1500 return rptr; 1501 } 1502 1503 u32 cayman_gfx_get_wptr(struct radeon_device *rdev, 1504 struct radeon_ring *ring) 1505 { 1506 u32 wptr; 1507 1508 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 1509 wptr = RREG32(CP_RB0_WPTR); 1510 else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 1511 wptr = RREG32(CP_RB1_WPTR); 1512 else 1513 wptr = RREG32(CP_RB2_WPTR); 1514 1515 return wptr; 1516 } 1517 1518 void cayman_gfx_set_wptr(struct radeon_device *rdev, 1519 struct radeon_ring *ring) 1520 { 1521 if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) { 1522 WREG32(CP_RB0_WPTR, ring->wptr); 1523 (void)RREG32(CP_RB0_WPTR); 1524 } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) { 1525 WREG32(CP_RB1_WPTR, ring->wptr); 1526 (void)RREG32(CP_RB1_WPTR); 1527 } else { 1528 WREG32(CP_RB2_WPTR, ring->wptr); 1529 (void)RREG32(CP_RB2_WPTR); 1530 } 1531 } 1532 1533 static int cayman_cp_load_microcode(struct radeon_device *rdev) 1534 { 1535 const __be32 *fw_data; 1536 int i; 1537 1538 if (!rdev->me_fw || !rdev->pfp_fw) 1539 return -EINVAL; 1540 1541 cayman_cp_enable(rdev, false); 1542 1543 fw_data = (const __be32 *)rdev->pfp_fw->data; 1544 WREG32(CP_PFP_UCODE_ADDR, 0); 1545 for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++) 1546 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 1547 WREG32(CP_PFP_UCODE_ADDR, 0); 1548 1549 fw_data = (const __be32 *)rdev->me_fw->data; 1550 WREG32(CP_ME_RAM_WADDR, 0); 1551 for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++) 1552 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 1553 1554 WREG32(CP_PFP_UCODE_ADDR, 0); 1555 WREG32(CP_ME_RAM_WADDR, 0); 1556 WREG32(CP_ME_RAM_RADDR, 0); 1557 return 0; 1558 } 1559 1560 static int cayman_cp_start(struct radeon_device *rdev) 1561 { 1562 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1563 int r, i; 1564 1565 r = radeon_ring_lock(rdev, ring, 7); 1566 if (r) { 1567 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 1568 return r; 1569 } 1570 radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5)); 1571 radeon_ring_write(ring, 0x1); 1572 radeon_ring_write(ring, 0x0); 1573 radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1); 1574 radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); 1575 radeon_ring_write(ring, 0); 1576 radeon_ring_write(ring, 0); 1577 radeon_ring_unlock_commit(rdev, ring, false); 1578 1579 cayman_cp_enable(rdev, true); 1580 1581 r = radeon_ring_lock(rdev, ring, cayman_default_size + 19); 1582 if (r) { 1583 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 1584 return r; 1585 } 1586 1587 /* setup clear context state */ 1588 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 1589 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); 1590 1591 for (i = 0; i < cayman_default_size; i++) 1592 radeon_ring_write(ring, cayman_default_state[i]); 1593 1594 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 1595 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); 1596 1597 /* set clear context state */ 1598 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0)); 1599 radeon_ring_write(ring, 0); 1600 1601 /* SQ_VTX_BASE_VTX_LOC */ 1602 radeon_ring_write(ring, 0xc0026f00); 1603 radeon_ring_write(ring, 0x00000000); 1604 radeon_ring_write(ring, 0x00000000); 1605 radeon_ring_write(ring, 0x00000000); 1606 1607 /* Clear consts */ 1608 radeon_ring_write(ring, 0xc0036f00); 1609 radeon_ring_write(ring, 0x00000bc4); 1610 radeon_ring_write(ring, 0xffffffff); 1611 radeon_ring_write(ring, 0xffffffff); 1612 radeon_ring_write(ring, 0xffffffff); 1613 1614 radeon_ring_write(ring, 0xc0026900); 1615 radeon_ring_write(ring, 0x00000316); 1616 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ 1617 radeon_ring_write(ring, 0x00000010); /* */ 1618 1619 radeon_ring_unlock_commit(rdev, ring, false); 1620 1621 /* XXX init other rings */ 1622 1623 return 0; 1624 } 1625 1626 static void cayman_cp_fini(struct radeon_device *rdev) 1627 { 1628 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1629 cayman_cp_enable(rdev, false); 1630 radeon_ring_fini(rdev, ring); 1631 radeon_scratch_free(rdev, ring->rptr_save_reg); 1632 } 1633 1634 static int cayman_cp_resume(struct radeon_device *rdev) 1635 { 1636 static const int ridx[] = { 1637 RADEON_RING_TYPE_GFX_INDEX, 1638 CAYMAN_RING_TYPE_CP1_INDEX, 1639 CAYMAN_RING_TYPE_CP2_INDEX 1640 }; 1641 static const unsigned cp_rb_cntl[] = { 1642 CP_RB0_CNTL, 1643 CP_RB1_CNTL, 1644 CP_RB2_CNTL, 1645 }; 1646 static const unsigned cp_rb_rptr_addr[] = { 1647 CP_RB0_RPTR_ADDR, 1648 CP_RB1_RPTR_ADDR, 1649 CP_RB2_RPTR_ADDR 1650 }; 1651 static const unsigned cp_rb_rptr_addr_hi[] = { 1652 CP_RB0_RPTR_ADDR_HI, 1653 CP_RB1_RPTR_ADDR_HI, 1654 CP_RB2_RPTR_ADDR_HI 1655 }; 1656 static const unsigned cp_rb_base[] = { 1657 CP_RB0_BASE, 1658 CP_RB1_BASE, 1659 CP_RB2_BASE 1660 }; 1661 static const unsigned cp_rb_rptr[] = { 1662 CP_RB0_RPTR, 1663 CP_RB1_RPTR, 1664 CP_RB2_RPTR 1665 }; 1666 static const unsigned cp_rb_wptr[] = { 1667 CP_RB0_WPTR, 1668 CP_RB1_WPTR, 1669 CP_RB2_WPTR 1670 }; 1671 struct radeon_ring *ring; 1672 int i, r; 1673 1674 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */ 1675 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP | 1676 SOFT_RESET_PA | 1677 SOFT_RESET_SH | 1678 SOFT_RESET_VGT | 1679 SOFT_RESET_SPI | 1680 SOFT_RESET_SX)); 1681 RREG32(GRBM_SOFT_RESET); 1682 mdelay(15); 1683 WREG32(GRBM_SOFT_RESET, 0); 1684 RREG32(GRBM_SOFT_RESET); 1685 1686 WREG32(CP_SEM_WAIT_TIMER, 0x0); 1687 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); 1688 1689 /* Set the write pointer delay */ 1690 WREG32(CP_RB_WPTR_DELAY, 0); 1691 1692 WREG32(CP_DEBUG, (1 << 27)); 1693 1694 /* set the wb address whether it's enabled or not */ 1695 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); 1696 WREG32(SCRATCH_UMSK, 0xff); 1697 1698 for (i = 0; i < 3; ++i) { 1699 uint32_t rb_cntl; 1700 uint64_t addr; 1701 1702 /* Set ring buffer size */ 1703 ring = &rdev->ring[ridx[i]]; 1704 rb_cntl = order_base_2(ring->ring_size / 8); 1705 rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8; 1706 #ifdef __BIG_ENDIAN 1707 rb_cntl |= BUF_SWAP_32BIT; 1708 #endif 1709 WREG32(cp_rb_cntl[i], rb_cntl); 1710 1711 /* set the wb address whether it's enabled or not */ 1712 addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET; 1713 WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC); 1714 WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF); 1715 } 1716 1717 /* set the rb base addr, this causes an internal reset of ALL rings */ 1718 for (i = 0; i < 3; ++i) { 1719 ring = &rdev->ring[ridx[i]]; 1720 WREG32(cp_rb_base[i], ring->gpu_addr >> 8); 1721 } 1722 1723 for (i = 0; i < 3; ++i) { 1724 /* Initialize the ring buffer's read and write pointers */ 1725 ring = &rdev->ring[ridx[i]]; 1726 WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); 1727 1728 ring->wptr = 0; 1729 WREG32(cp_rb_rptr[i], 0); 1730 WREG32(cp_rb_wptr[i], ring->wptr); 1731 1732 mdelay(1); 1733 WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA); 1734 } 1735 1736 /* start the rings */ 1737 cayman_cp_start(rdev); 1738 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true; 1739 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 1740 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 1741 /* this only test cp0 */ 1742 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); 1743 if (r) { 1744 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1745 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 1746 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 1747 return r; 1748 } 1749 1750 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 1751 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 1752 1753 return 0; 1754 } 1755 1756 u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev) 1757 { 1758 u32 reset_mask = 0; 1759 u32 tmp; 1760 1761 /* GRBM_STATUS */ 1762 tmp = RREG32(GRBM_STATUS); 1763 if (tmp & (PA_BUSY | SC_BUSY | 1764 SH_BUSY | SX_BUSY | 1765 TA_BUSY | VGT_BUSY | 1766 DB_BUSY | CB_BUSY | 1767 GDS_BUSY | SPI_BUSY | 1768 IA_BUSY | IA_BUSY_NO_DMA)) 1769 reset_mask |= RADEON_RESET_GFX; 1770 1771 if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 1772 CP_BUSY | CP_COHERENCY_BUSY)) 1773 reset_mask |= RADEON_RESET_CP; 1774 1775 if (tmp & GRBM_EE_BUSY) 1776 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 1777 1778 /* DMA_STATUS_REG 0 */ 1779 tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 1780 if (!(tmp & DMA_IDLE)) 1781 reset_mask |= RADEON_RESET_DMA; 1782 1783 /* DMA_STATUS_REG 1 */ 1784 tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 1785 if (!(tmp & DMA_IDLE)) 1786 reset_mask |= RADEON_RESET_DMA1; 1787 1788 /* SRBM_STATUS2 */ 1789 tmp = RREG32(SRBM_STATUS2); 1790 if (tmp & DMA_BUSY) 1791 reset_mask |= RADEON_RESET_DMA; 1792 1793 if (tmp & DMA1_BUSY) 1794 reset_mask |= RADEON_RESET_DMA1; 1795 1796 /* SRBM_STATUS */ 1797 tmp = RREG32(SRBM_STATUS); 1798 if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 1799 reset_mask |= RADEON_RESET_RLC; 1800 1801 if (tmp & IH_BUSY) 1802 reset_mask |= RADEON_RESET_IH; 1803 1804 if (tmp & SEM_BUSY) 1805 reset_mask |= RADEON_RESET_SEM; 1806 1807 if (tmp & GRBM_RQ_PENDING) 1808 reset_mask |= RADEON_RESET_GRBM; 1809 1810 if (tmp & VMC_BUSY) 1811 reset_mask |= RADEON_RESET_VMC; 1812 1813 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 1814 MCC_BUSY | MCD_BUSY)) 1815 reset_mask |= RADEON_RESET_MC; 1816 1817 if (evergreen_is_display_hung(rdev)) 1818 reset_mask |= RADEON_RESET_DISPLAY; 1819 1820 /* VM_L2_STATUS */ 1821 tmp = RREG32(VM_L2_STATUS); 1822 if (tmp & L2_BUSY) 1823 reset_mask |= RADEON_RESET_VMC; 1824 1825 /* Skip MC reset as it's mostly likely not hung, just busy */ 1826 if (reset_mask & RADEON_RESET_MC) { 1827 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask); 1828 reset_mask &= ~RADEON_RESET_MC; 1829 } 1830 1831 return reset_mask; 1832 } 1833 1834 static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1835 { 1836 struct evergreen_mc_save save; 1837 u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 1838 u32 tmp; 1839 1840 if (reset_mask == 0) 1841 return; 1842 1843 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 1844 1845 evergreen_print_gpu_status_regs(rdev); 1846 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", 1847 RREG32(0x14F8)); 1848 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", 1849 RREG32(0x14D8)); 1850 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 1851 RREG32(0x14FC)); 1852 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 1853 RREG32(0x14DC)); 1854 1855 /* Disable CP parsing/prefetching */ 1856 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 1857 1858 if (reset_mask & RADEON_RESET_DMA) { 1859 /* dma0 */ 1860 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 1861 tmp &= ~DMA_RB_ENABLE; 1862 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 1863 } 1864 1865 if (reset_mask & RADEON_RESET_DMA1) { 1866 /* dma1 */ 1867 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 1868 tmp &= ~DMA_RB_ENABLE; 1869 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 1870 } 1871 1872 udelay(50); 1873 1874 evergreen_mc_stop(rdev, &save); 1875 if (evergreen_mc_wait_for_idle(rdev)) { 1876 dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1877 } 1878 1879 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 1880 grbm_soft_reset = SOFT_RESET_CB | 1881 SOFT_RESET_DB | 1882 SOFT_RESET_GDS | 1883 SOFT_RESET_PA | 1884 SOFT_RESET_SC | 1885 SOFT_RESET_SPI | 1886 SOFT_RESET_SH | 1887 SOFT_RESET_SX | 1888 SOFT_RESET_TC | 1889 SOFT_RESET_TA | 1890 SOFT_RESET_VGT | 1891 SOFT_RESET_IA; 1892 } 1893 1894 if (reset_mask & RADEON_RESET_CP) { 1895 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT; 1896 1897 srbm_soft_reset |= SOFT_RESET_GRBM; 1898 } 1899 1900 if (reset_mask & RADEON_RESET_DMA) 1901 srbm_soft_reset |= SOFT_RESET_DMA; 1902 1903 if (reset_mask & RADEON_RESET_DMA1) 1904 srbm_soft_reset |= SOFT_RESET_DMA1; 1905 1906 if (reset_mask & RADEON_RESET_DISPLAY) 1907 srbm_soft_reset |= SOFT_RESET_DC; 1908 1909 if (reset_mask & RADEON_RESET_RLC) 1910 srbm_soft_reset |= SOFT_RESET_RLC; 1911 1912 if (reset_mask & RADEON_RESET_SEM) 1913 srbm_soft_reset |= SOFT_RESET_SEM; 1914 1915 if (reset_mask & RADEON_RESET_IH) 1916 srbm_soft_reset |= SOFT_RESET_IH; 1917 1918 if (reset_mask & RADEON_RESET_GRBM) 1919 srbm_soft_reset |= SOFT_RESET_GRBM; 1920 1921 if (reset_mask & RADEON_RESET_VMC) 1922 srbm_soft_reset |= SOFT_RESET_VMC; 1923 1924 if (!(rdev->flags & RADEON_IS_IGP)) { 1925 if (reset_mask & RADEON_RESET_MC) 1926 srbm_soft_reset |= SOFT_RESET_MC; 1927 } 1928 1929 if (grbm_soft_reset) { 1930 tmp = RREG32(GRBM_SOFT_RESET); 1931 tmp |= grbm_soft_reset; 1932 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 1933 WREG32(GRBM_SOFT_RESET, tmp); 1934 tmp = RREG32(GRBM_SOFT_RESET); 1935 1936 udelay(50); 1937 1938 tmp &= ~grbm_soft_reset; 1939 WREG32(GRBM_SOFT_RESET, tmp); 1940 tmp = RREG32(GRBM_SOFT_RESET); 1941 } 1942 1943 if (srbm_soft_reset) { 1944 tmp = RREG32(SRBM_SOFT_RESET); 1945 tmp |= srbm_soft_reset; 1946 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1947 WREG32(SRBM_SOFT_RESET, tmp); 1948 tmp = RREG32(SRBM_SOFT_RESET); 1949 1950 udelay(50); 1951 1952 tmp &= ~srbm_soft_reset; 1953 WREG32(SRBM_SOFT_RESET, tmp); 1954 tmp = RREG32(SRBM_SOFT_RESET); 1955 } 1956 1957 /* Wait a little for things to settle down */ 1958 udelay(50); 1959 1960 evergreen_mc_resume(rdev, &save); 1961 udelay(50); 1962 1963 evergreen_print_gpu_status_regs(rdev); 1964 } 1965 1966 int cayman_asic_reset(struct radeon_device *rdev) 1967 { 1968 u32 reset_mask; 1969 1970 reset_mask = cayman_gpu_check_soft_reset(rdev); 1971 1972 if (reset_mask) 1973 r600_set_bios_scratch_engine_hung(rdev, true); 1974 1975 cayman_gpu_soft_reset(rdev, reset_mask); 1976 1977 reset_mask = cayman_gpu_check_soft_reset(rdev); 1978 1979 if (reset_mask) 1980 evergreen_gpu_pci_config_reset(rdev); 1981 1982 r600_set_bios_scratch_engine_hung(rdev, false); 1983 1984 return 0; 1985 } 1986 1987 /** 1988 * cayman_gfx_is_lockup - Check if the GFX engine is locked up 1989 * 1990 * @rdev: radeon_device pointer 1991 * @ring: radeon_ring structure holding ring information 1992 * 1993 * Check if the GFX engine is locked up. 1994 * Returns true if the engine appears to be locked up, false if not. 1995 */ 1996 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1997 { 1998 u32 reset_mask = cayman_gpu_check_soft_reset(rdev); 1999 2000 if (!(reset_mask & (RADEON_RESET_GFX | 2001 RADEON_RESET_COMPUTE | 2002 RADEON_RESET_CP))) { 2003 radeon_ring_lockup_update(rdev, ring); 2004 return false; 2005 } 2006 return radeon_ring_test_lockup(rdev, ring); 2007 } 2008 2009 static int cayman_startup(struct radeon_device *rdev) 2010 { 2011 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2012 int r; 2013 2014 /* enable pcie gen2 link */ 2015 evergreen_pcie_gen2_enable(rdev); 2016 /* enable aspm */ 2017 evergreen_program_aspm(rdev); 2018 2019 /* scratch needs to be initialized before MC */ 2020 r = r600_vram_scratch_init(rdev); 2021 if (r) 2022 return r; 2023 2024 evergreen_mc_program(rdev); 2025 2026 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) { 2027 r = ni_mc_load_microcode(rdev); 2028 if (r) { 2029 DRM_ERROR("Failed to load MC firmware!\n"); 2030 return r; 2031 } 2032 } 2033 2034 r = cayman_pcie_gart_enable(rdev); 2035 if (r) 2036 return r; 2037 cayman_gpu_init(rdev); 2038 2039 /* allocate rlc buffers */ 2040 if (rdev->flags & RADEON_IS_IGP) { 2041 rdev->rlc.reg_list = tn_rlc_save_restore_register_list; 2042 rdev->rlc.reg_list_size = 2043 (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list); 2044 rdev->rlc.cs_data = cayman_cs_data; 2045 r = sumo_rlc_init(rdev); 2046 if (r) { 2047 DRM_ERROR("Failed to init rlc BOs!\n"); 2048 return r; 2049 } 2050 } 2051 2052 /* allocate wb buffer */ 2053 r = radeon_wb_init(rdev); 2054 if (r) 2055 return r; 2056 2057 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 2058 if (r) { 2059 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2060 return r; 2061 } 2062 2063 r = uvd_v2_2_resume(rdev); 2064 if (!r) { 2065 r = radeon_fence_driver_start_ring(rdev, 2066 R600_RING_TYPE_UVD_INDEX); 2067 if (r) 2068 dev_err(rdev->dev, "UVD fences init error (%d).\n", r); 2069 } 2070 if (r) 2071 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 2072 2073 if (rdev->family == CHIP_ARUBA) { 2074 r = radeon_vce_resume(rdev); 2075 if (!r) 2076 r = vce_v1_0_resume(rdev); 2077 2078 if (!r) 2079 r = radeon_fence_driver_start_ring(rdev, 2080 TN_RING_TYPE_VCE1_INDEX); 2081 if (!r) 2082 r = radeon_fence_driver_start_ring(rdev, 2083 TN_RING_TYPE_VCE2_INDEX); 2084 2085 if (r) { 2086 dev_err(rdev->dev, "VCE init error (%d).\n", r); 2087 rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0; 2088 rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0; 2089 } 2090 } 2091 2092 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX); 2093 if (r) { 2094 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2095 return r; 2096 } 2097 2098 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX); 2099 if (r) { 2100 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 2101 return r; 2102 } 2103 2104 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 2105 if (r) { 2106 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 2107 return r; 2108 } 2109 2110 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX); 2111 if (r) { 2112 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 2113 return r; 2114 } 2115 2116 /* Enable IRQ */ 2117 if (!rdev->irq.installed) { 2118 r = radeon_irq_kms_init(rdev); 2119 if (r) 2120 return r; 2121 } 2122 2123 r = r600_irq_init(rdev); 2124 if (r) { 2125 DRM_ERROR("radeon: IH init failed (%d).\n", r); 2126 radeon_irq_kms_fini(rdev); 2127 return r; 2128 } 2129 evergreen_irq_set(rdev); 2130 2131 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 2132 RADEON_CP_PACKET2); 2133 if (r) 2134 return r; 2135 2136 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 2137 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 2138 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 2139 if (r) 2140 return r; 2141 2142 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 2143 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 2144 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 2145 if (r) 2146 return r; 2147 2148 r = cayman_cp_load_microcode(rdev); 2149 if (r) 2150 return r; 2151 r = cayman_cp_resume(rdev); 2152 if (r) 2153 return r; 2154 2155 r = cayman_dma_resume(rdev); 2156 if (r) 2157 return r; 2158 2159 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 2160 if (ring->ring_size) { 2161 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 2162 RADEON_CP_PACKET2); 2163 if (!r) 2164 r = uvd_v1_0_init(rdev); 2165 if (r) 2166 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); 2167 } 2168 2169 if (rdev->family == CHIP_ARUBA) { 2170 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; 2171 if (ring->ring_size) 2172 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 2173 2174 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; 2175 if (ring->ring_size) 2176 r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 2177 2178 if (!r) 2179 r = vce_v1_0_init(rdev); 2180 if (r) 2181 DRM_ERROR("radeon: failed initializing VCE (%d).\n", r); 2182 } 2183 2184 r = radeon_ib_pool_init(rdev); 2185 if (r) { 2186 dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 2187 return r; 2188 } 2189 2190 r = radeon_vm_manager_init(rdev); 2191 if (r) { 2192 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); 2193 return r; 2194 } 2195 2196 r = radeon_audio_init(rdev); 2197 if (r) 2198 return r; 2199 2200 return 0; 2201 } 2202 2203 int cayman_resume(struct radeon_device *rdev) 2204 { 2205 int r; 2206 2207 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 2208 * posting will perform necessary task to bring back GPU into good 2209 * shape. 2210 */ 2211 /* post card */ 2212 atom_asic_init(rdev->mode_info.atom_context); 2213 2214 /* init golden registers */ 2215 ni_init_golden_registers(rdev); 2216 2217 if (rdev->pm.pm_method == PM_METHOD_DPM) 2218 radeon_pm_resume(rdev); 2219 2220 rdev->accel_working = true; 2221 r = cayman_startup(rdev); 2222 if (r) { 2223 DRM_ERROR("cayman startup failed on resume\n"); 2224 rdev->accel_working = false; 2225 return r; 2226 } 2227 return r; 2228 } 2229 2230 int cayman_suspend(struct radeon_device *rdev) 2231 { 2232 radeon_pm_suspend(rdev); 2233 radeon_audio_fini(rdev); 2234 radeon_vm_manager_fini(rdev); 2235 cayman_cp_enable(rdev, false); 2236 cayman_dma_stop(rdev); 2237 uvd_v1_0_fini(rdev); 2238 radeon_uvd_suspend(rdev); 2239 evergreen_irq_suspend(rdev); 2240 radeon_wb_disable(rdev); 2241 cayman_pcie_gart_disable(rdev); 2242 return 0; 2243 } 2244 2245 /* Plan is to move initialization in that function and use 2246 * helper function so that radeon_device_init pretty much 2247 * do nothing more than calling asic specific function. This 2248 * should also allow to remove a bunch of callback function 2249 * like vram_info. 2250 */ 2251 int cayman_init(struct radeon_device *rdev) 2252 { 2253 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2254 int r; 2255 2256 /* Read BIOS */ 2257 if (!radeon_get_bios(rdev)) { 2258 if (ASIC_IS_AVIVO(rdev)) 2259 return -EINVAL; 2260 } 2261 /* Must be an ATOMBIOS */ 2262 if (!rdev->is_atom_bios) { 2263 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n"); 2264 return -EINVAL; 2265 } 2266 r = radeon_atombios_init(rdev); 2267 if (r) 2268 return r; 2269 2270 /* Post card if necessary */ 2271 if (!radeon_card_posted(rdev)) { 2272 if (!rdev->bios) { 2273 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 2274 return -EINVAL; 2275 } 2276 DRM_INFO("GPU not posted. posting now...\n"); 2277 atom_asic_init(rdev->mode_info.atom_context); 2278 } 2279 /* init golden registers */ 2280 ni_init_golden_registers(rdev); 2281 /* Initialize scratch registers */ 2282 r600_scratch_init(rdev); 2283 /* Initialize surface registers */ 2284 radeon_surface_init(rdev); 2285 /* Initialize clocks */ 2286 radeon_get_clock_info(rdev->ddev); 2287 /* Fence driver */ 2288 r = radeon_fence_driver_init(rdev); 2289 if (r) 2290 return r; 2291 /* initialize memory controller */ 2292 r = evergreen_mc_init(rdev); 2293 if (r) 2294 return r; 2295 /* Memory manager */ 2296 r = radeon_bo_init(rdev); 2297 if (r) 2298 return r; 2299 2300 if (rdev->flags & RADEON_IS_IGP) { 2301 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2302 r = ni_init_microcode(rdev); 2303 if (r) { 2304 DRM_ERROR("Failed to load firmware!\n"); 2305 return r; 2306 } 2307 } 2308 } else { 2309 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 2310 r = ni_init_microcode(rdev); 2311 if (r) { 2312 DRM_ERROR("Failed to load firmware!\n"); 2313 return r; 2314 } 2315 } 2316 } 2317 2318 /* Initialize power management */ 2319 radeon_pm_init(rdev); 2320 2321 ring->ring_obj = NULL; 2322 r600_ring_init(rdev, ring, 1024 * 1024); 2323 2324 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 2325 ring->ring_obj = NULL; 2326 r600_ring_init(rdev, ring, 64 * 1024); 2327 2328 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 2329 ring->ring_obj = NULL; 2330 r600_ring_init(rdev, ring, 64 * 1024); 2331 2332 r = radeon_uvd_init(rdev); 2333 if (!r) { 2334 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 2335 ring->ring_obj = NULL; 2336 r600_ring_init(rdev, ring, 4096); 2337 } 2338 2339 if (rdev->family == CHIP_ARUBA) { 2340 r = radeon_vce_init(rdev); 2341 if (!r) { 2342 ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; 2343 ring->ring_obj = NULL; 2344 r600_ring_init(rdev, ring, 4096); 2345 2346 ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; 2347 ring->ring_obj = NULL; 2348 r600_ring_init(rdev, ring, 4096); 2349 } 2350 } 2351 2352 rdev->ih.ring_obj = NULL; 2353 r600_ih_ring_init(rdev, 64 * 1024); 2354 2355 r = r600_pcie_gart_init(rdev); 2356 if (r) 2357 return r; 2358 2359 rdev->accel_working = true; 2360 r = cayman_startup(rdev); 2361 if (r) { 2362 dev_err(rdev->dev, "disabling GPU acceleration\n"); 2363 cayman_cp_fini(rdev); 2364 cayman_dma_fini(rdev); 2365 r600_irq_fini(rdev); 2366 if (rdev->flags & RADEON_IS_IGP) 2367 sumo_rlc_fini(rdev); 2368 radeon_wb_fini(rdev); 2369 radeon_ib_pool_fini(rdev); 2370 radeon_vm_manager_fini(rdev); 2371 radeon_irq_kms_fini(rdev); 2372 cayman_pcie_gart_fini(rdev); 2373 rdev->accel_working = false; 2374 } 2375 2376 /* Don't start up if the MC ucode is missing. 2377 * The default clocks and voltages before the MC ucode 2378 * is loaded are not suffient for advanced operations. 2379 * 2380 * We can skip this check for TN, because there is no MC 2381 * ucode. 2382 */ 2383 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { 2384 DRM_ERROR("radeon: MC ucode required for NI+.\n"); 2385 return -EINVAL; 2386 } 2387 2388 return 0; 2389 } 2390 2391 void cayman_fini(struct radeon_device *rdev) 2392 { 2393 radeon_pm_fini(rdev); 2394 cayman_cp_fini(rdev); 2395 cayman_dma_fini(rdev); 2396 r600_irq_fini(rdev); 2397 if (rdev->flags & RADEON_IS_IGP) 2398 sumo_rlc_fini(rdev); 2399 radeon_wb_fini(rdev); 2400 radeon_vm_manager_fini(rdev); 2401 radeon_ib_pool_fini(rdev); 2402 radeon_irq_kms_fini(rdev); 2403 uvd_v1_0_fini(rdev); 2404 radeon_uvd_fini(rdev); 2405 if (rdev->family == CHIP_ARUBA) 2406 radeon_vce_fini(rdev); 2407 cayman_pcie_gart_fini(rdev); 2408 r600_vram_scratch_fini(rdev); 2409 radeon_gem_fini(rdev); 2410 radeon_fence_driver_fini(rdev); 2411 radeon_bo_fini(rdev); 2412 radeon_atombios_fini(rdev); 2413 ni_fini_microcode(rdev); 2414 kfree(rdev->bios); 2415 rdev->bios = NULL; 2416 } 2417 2418 /* 2419 * vm 2420 */ 2421 int cayman_vm_init(struct radeon_device *rdev) 2422 { 2423 /* number of VMs */ 2424 rdev->vm_manager.nvm = 8; 2425 /* base offset of vram pages */ 2426 if (rdev->flags & RADEON_IS_IGP) { 2427 u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET); 2428 tmp <<= 22; 2429 rdev->vm_manager.vram_base_offset = tmp; 2430 } else 2431 rdev->vm_manager.vram_base_offset = 0; 2432 return 0; 2433 } 2434 2435 void cayman_vm_fini(struct radeon_device *rdev) 2436 { 2437 } 2438 2439 /** 2440 * cayman_vm_decode_fault - print human readable fault info 2441 * 2442 * @rdev: radeon_device pointer 2443 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value 2444 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value 2445 * 2446 * Print human readable fault information (cayman/TN). 2447 */ 2448 void cayman_vm_decode_fault(struct radeon_device *rdev, 2449 u32 status, u32 addr) 2450 { 2451 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; 2452 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; 2453 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; 2454 char *block; 2455 2456 switch (mc_id) { 2457 case 32: 2458 case 16: 2459 case 96: 2460 case 80: 2461 case 160: 2462 case 144: 2463 case 224: 2464 case 208: 2465 block = "CB"; 2466 break; 2467 case 33: 2468 case 17: 2469 case 97: 2470 case 81: 2471 case 161: 2472 case 145: 2473 case 225: 2474 case 209: 2475 block = "CB_FMASK"; 2476 break; 2477 case 34: 2478 case 18: 2479 case 98: 2480 case 82: 2481 case 162: 2482 case 146: 2483 case 226: 2484 case 210: 2485 block = "CB_CMASK"; 2486 break; 2487 case 35: 2488 case 19: 2489 case 99: 2490 case 83: 2491 case 163: 2492 case 147: 2493 case 227: 2494 case 211: 2495 block = "CB_IMMED"; 2496 break; 2497 case 36: 2498 case 20: 2499 case 100: 2500 case 84: 2501 case 164: 2502 case 148: 2503 case 228: 2504 case 212: 2505 block = "DB"; 2506 break; 2507 case 37: 2508 case 21: 2509 case 101: 2510 case 85: 2511 case 165: 2512 case 149: 2513 case 229: 2514 case 213: 2515 block = "DB_HTILE"; 2516 break; 2517 case 38: 2518 case 22: 2519 case 102: 2520 case 86: 2521 case 166: 2522 case 150: 2523 case 230: 2524 case 214: 2525 block = "SX"; 2526 break; 2527 case 39: 2528 case 23: 2529 case 103: 2530 case 87: 2531 case 167: 2532 case 151: 2533 case 231: 2534 case 215: 2535 block = "DB_STEN"; 2536 break; 2537 case 40: 2538 case 24: 2539 case 104: 2540 case 88: 2541 case 232: 2542 case 216: 2543 case 168: 2544 case 152: 2545 block = "TC_TFETCH"; 2546 break; 2547 case 41: 2548 case 25: 2549 case 105: 2550 case 89: 2551 case 233: 2552 case 217: 2553 case 169: 2554 case 153: 2555 block = "TC_VFETCH"; 2556 break; 2557 case 42: 2558 case 26: 2559 case 106: 2560 case 90: 2561 case 234: 2562 case 218: 2563 case 170: 2564 case 154: 2565 block = "VC"; 2566 break; 2567 case 112: 2568 block = "CP"; 2569 break; 2570 case 113: 2571 case 114: 2572 block = "SH"; 2573 break; 2574 case 115: 2575 block = "VGT"; 2576 break; 2577 case 178: 2578 block = "IH"; 2579 break; 2580 case 51: 2581 block = "RLC"; 2582 break; 2583 case 55: 2584 block = "DMA"; 2585 break; 2586 case 56: 2587 block = "HDP"; 2588 break; 2589 default: 2590 block = "unknown"; 2591 break; 2592 } 2593 2594 printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", 2595 protections, vmid, addr, 2596 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", 2597 block, mc_id); 2598 } 2599 2600 /** 2601 * cayman_vm_flush - vm flush using the CP 2602 * 2603 * @rdev: radeon_device pointer 2604 * 2605 * Update the page table base and flush the VM TLB 2606 * using the CP (cayman-si). 2607 */ 2608 void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, 2609 unsigned vm_id, uint64_t pd_addr) 2610 { 2611 radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0)); 2612 radeon_ring_write(ring, pd_addr >> 12); 2613 2614 /* flush hdp cache */ 2615 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0)); 2616 radeon_ring_write(ring, 0x1); 2617 2618 /* bits 0-7 are the VM contexts0-7 */ 2619 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); 2620 radeon_ring_write(ring, 1 << vm_id); 2621 2622 /* wait for the invalidate to complete */ 2623 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 2624 radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ 2625 WAIT_REG_MEM_ENGINE(0))); /* me */ 2626 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 2627 radeon_ring_write(ring, 0); 2628 radeon_ring_write(ring, 0); /* ref */ 2629 radeon_ring_write(ring, 0); /* mask */ 2630 radeon_ring_write(ring, 0x20); /* poll interval */ 2631 2632 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 2633 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2634 radeon_ring_write(ring, 0x0); 2635 } 2636 2637 int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk) 2638 { 2639 struct atom_clock_dividers dividers; 2640 int r, i; 2641 2642 r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 2643 ecclk, false, ÷rs); 2644 if (r) 2645 return r; 2646 2647 for (i = 0; i < 100; i++) { 2648 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2649 break; 2650 mdelay(10); 2651 } 2652 if (i == 100) 2653 return -ETIMEDOUT; 2654 2655 WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK)); 2656 2657 for (i = 0; i < 100; i++) { 2658 if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2659 break; 2660 mdelay(10); 2661 } 2662 if (i == 100) 2663 return -ETIMEDOUT; 2664 2665 return 0; 2666 } 2667