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