diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 504 |
1 files changed, 496 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index e8544758b569..ae92aa041c6a 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -41,6 +41,14 @@ MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); | |||
41 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); | 41 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); |
42 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); | 42 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); |
43 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); | 43 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); |
44 | MODULE_FIRMWARE("radeon/HAWAII_pfp.bin"); | ||
45 | MODULE_FIRMWARE("radeon/HAWAII_me.bin"); | ||
46 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); | ||
47 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); | ||
48 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); | ||
49 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); | ||
50 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); | ||
51 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); | ||
44 | MODULE_FIRMWARE("radeon/KAVERI_pfp.bin"); | 52 | MODULE_FIRMWARE("radeon/KAVERI_pfp.bin"); |
45 | MODULE_FIRMWARE("radeon/KAVERI_me.bin"); | 53 | MODULE_FIRMWARE("radeon/KAVERI_me.bin"); |
46 | MODULE_FIRMWARE("radeon/KAVERI_ce.bin"); | 54 | MODULE_FIRMWARE("radeon/KAVERI_ce.bin"); |
@@ -1297,6 +1305,171 @@ static const u32 kalindi_mgcg_cgcg_init[] = | |||
1297 | 0xd80c, 0xff000ff0, 0x00000100 | 1305 | 0xd80c, 0xff000ff0, 0x00000100 |
1298 | }; | 1306 | }; |
1299 | 1307 | ||
1308 | static const u32 hawaii_golden_spm_registers[] = | ||
1309 | { | ||
1310 | 0x30800, 0xe0ffffff, 0xe0000000 | ||
1311 | }; | ||
1312 | |||
1313 | static const u32 hawaii_golden_common_registers[] = | ||
1314 | { | ||
1315 | 0x30800, 0xffffffff, 0xe0000000, | ||
1316 | 0x28350, 0xffffffff, 0x3a00161a, | ||
1317 | 0x28354, 0xffffffff, 0x0000002e, | ||
1318 | 0x9a10, 0xffffffff, 0x00018208, | ||
1319 | 0x98f8, 0xffffffff, 0x12011003 | ||
1320 | }; | ||
1321 | |||
1322 | static const u32 hawaii_golden_registers[] = | ||
1323 | { | ||
1324 | 0x3354, 0x00000333, 0x00000333, | ||
1325 | 0x9a10, 0x00010000, 0x00058208, | ||
1326 | 0x9830, 0xffffffff, 0x00000000, | ||
1327 | 0x9834, 0xf00fffff, 0x00000400, | ||
1328 | 0x9838, 0x0002021c, 0x00020200, | ||
1329 | 0xc78, 0x00000080, 0x00000000, | ||
1330 | 0x5bb0, 0x000000f0, 0x00000070, | ||
1331 | 0x5bc0, 0xf0311fff, 0x80300000, | ||
1332 | 0x350c, 0x00810000, 0x408af000, | ||
1333 | 0x7030, 0x31000111, 0x00000011, | ||
1334 | 0x2f48, 0x73773777, 0x12010001, | ||
1335 | 0x2120, 0x0000007f, 0x0000001b, | ||
1336 | 0x21dc, 0x00007fb6, 0x00002191, | ||
1337 | 0x3628, 0x0000003f, 0x0000000a, | ||
1338 | 0x362c, 0x0000003f, 0x0000000a, | ||
1339 | 0x2ae4, 0x00073ffe, 0x000022a2, | ||
1340 | 0x240c, 0x000007ff, 0x00000000, | ||
1341 | 0x8bf0, 0x00002001, 0x00000001, | ||
1342 | 0x8b24, 0xffffffff, 0x00ffffff, | ||
1343 | 0x30a04, 0x0000ff0f, 0x00000000, | ||
1344 | 0x28a4c, 0x07ffffff, 0x06000000, | ||
1345 | 0x3e78, 0x00000001, 0x00000002, | ||
1346 | 0xc768, 0x00000008, 0x00000008, | ||
1347 | 0xc770, 0x00000f00, 0x00000800, | ||
1348 | 0xc774, 0x00000f00, 0x00000800, | ||
1349 | 0xc798, 0x00ffffff, 0x00ff7fbf, | ||
1350 | 0xc79c, 0x00ffffff, 0x00ff7faf, | ||
1351 | 0x8c00, 0x000000ff, 0x00000800, | ||
1352 | 0xe40, 0x00001fff, 0x00001fff, | ||
1353 | 0x9060, 0x0000007f, 0x00000020, | ||
1354 | 0x9508, 0x00010000, 0x00010000, | ||
1355 | 0xae00, 0x00100000, 0x000ff07c, | ||
1356 | 0xac14, 0x000003ff, 0x0000000f, | ||
1357 | 0xac10, 0xffffffff, 0x7564fdec, | ||
1358 | 0xac0c, 0xffffffff, 0x3120b9a8, | ||
1359 | 0xac08, 0x20000000, 0x0f9c0000 | ||
1360 | }; | ||
1361 | |||
1362 | static const u32 hawaii_mgcg_cgcg_init[] = | ||
1363 | { | ||
1364 | 0xc420, 0xffffffff, 0xfffffffd, | ||
1365 | 0x30800, 0xffffffff, 0xe0000000, | ||
1366 | 0x3c2a0, 0xffffffff, 0x00000100, | ||
1367 | 0x3c208, 0xffffffff, 0x00000100, | ||
1368 | 0x3c2c0, 0xffffffff, 0x00000100, | ||
1369 | 0x3c2c8, 0xffffffff, 0x00000100, | ||
1370 | 0x3c2c4, 0xffffffff, 0x00000100, | ||
1371 | 0x55e4, 0xffffffff, 0x00200100, | ||
1372 | 0x3c280, 0xffffffff, 0x00000100, | ||
1373 | 0x3c214, 0xffffffff, 0x06000100, | ||
1374 | 0x3c220, 0xffffffff, 0x00000100, | ||
1375 | 0x3c218, 0xffffffff, 0x06000100, | ||
1376 | 0x3c204, 0xffffffff, 0x00000100, | ||
1377 | 0x3c2e0, 0xffffffff, 0x00000100, | ||
1378 | 0x3c224, 0xffffffff, 0x00000100, | ||
1379 | 0x3c200, 0xffffffff, 0x00000100, | ||
1380 | 0x3c230, 0xffffffff, 0x00000100, | ||
1381 | 0x3c234, 0xffffffff, 0x00000100, | ||
1382 | 0x3c250, 0xffffffff, 0x00000100, | ||
1383 | 0x3c254, 0xffffffff, 0x00000100, | ||
1384 | 0x3c258, 0xffffffff, 0x00000100, | ||
1385 | 0x3c25c, 0xffffffff, 0x00000100, | ||
1386 | 0x3c260, 0xffffffff, 0x00000100, | ||
1387 | 0x3c27c, 0xffffffff, 0x00000100, | ||
1388 | 0x3c278, 0xffffffff, 0x00000100, | ||
1389 | 0x3c210, 0xffffffff, 0x06000100, | ||
1390 | 0x3c290, 0xffffffff, 0x00000100, | ||
1391 | 0x3c274, 0xffffffff, 0x00000100, | ||
1392 | 0x3c2b4, 0xffffffff, 0x00000100, | ||
1393 | 0x3c2b0, 0xffffffff, 0x00000100, | ||
1394 | 0x3c270, 0xffffffff, 0x00000100, | ||
1395 | 0x30800, 0xffffffff, 0xe0000000, | ||
1396 | 0x3c020, 0xffffffff, 0x00010000, | ||
1397 | 0x3c024, 0xffffffff, 0x00030002, | ||
1398 | 0x3c028, 0xffffffff, 0x00040007, | ||
1399 | 0x3c02c, 0xffffffff, 0x00060005, | ||
1400 | 0x3c030, 0xffffffff, 0x00090008, | ||
1401 | 0x3c034, 0xffffffff, 0x00010000, | ||
1402 | 0x3c038, 0xffffffff, 0x00030002, | ||
1403 | 0x3c03c, 0xffffffff, 0x00040007, | ||
1404 | 0x3c040, 0xffffffff, 0x00060005, | ||
1405 | 0x3c044, 0xffffffff, 0x00090008, | ||
1406 | 0x3c048, 0xffffffff, 0x00010000, | ||
1407 | 0x3c04c, 0xffffffff, 0x00030002, | ||
1408 | 0x3c050, 0xffffffff, 0x00040007, | ||
1409 | 0x3c054, 0xffffffff, 0x00060005, | ||
1410 | 0x3c058, 0xffffffff, 0x00090008, | ||
1411 | 0x3c05c, 0xffffffff, 0x00010000, | ||
1412 | 0x3c060, 0xffffffff, 0x00030002, | ||
1413 | 0x3c064, 0xffffffff, 0x00040007, | ||
1414 | 0x3c068, 0xffffffff, 0x00060005, | ||
1415 | 0x3c06c, 0xffffffff, 0x00090008, | ||
1416 | 0x3c070, 0xffffffff, 0x00010000, | ||
1417 | 0x3c074, 0xffffffff, 0x00030002, | ||
1418 | 0x3c078, 0xffffffff, 0x00040007, | ||
1419 | 0x3c07c, 0xffffffff, 0x00060005, | ||
1420 | 0x3c080, 0xffffffff, 0x00090008, | ||
1421 | 0x3c084, 0xffffffff, 0x00010000, | ||
1422 | 0x3c088, 0xffffffff, 0x00030002, | ||
1423 | 0x3c08c, 0xffffffff, 0x00040007, | ||
1424 | 0x3c090, 0xffffffff, 0x00060005, | ||
1425 | 0x3c094, 0xffffffff, 0x00090008, | ||
1426 | 0x3c098, 0xffffffff, 0x00010000, | ||
1427 | 0x3c09c, 0xffffffff, 0x00030002, | ||
1428 | 0x3c0a0, 0xffffffff, 0x00040007, | ||
1429 | 0x3c0a4, 0xffffffff, 0x00060005, | ||
1430 | 0x3c0a8, 0xffffffff, 0x00090008, | ||
1431 | 0x3c0ac, 0xffffffff, 0x00010000, | ||
1432 | 0x3c0b0, 0xffffffff, 0x00030002, | ||
1433 | 0x3c0b4, 0xffffffff, 0x00040007, | ||
1434 | 0x3c0b8, 0xffffffff, 0x00060005, | ||
1435 | 0x3c0bc, 0xffffffff, 0x00090008, | ||
1436 | 0x3c0c0, 0xffffffff, 0x00010000, | ||
1437 | 0x3c0c4, 0xffffffff, 0x00030002, | ||
1438 | 0x3c0c8, 0xffffffff, 0x00040007, | ||
1439 | 0x3c0cc, 0xffffffff, 0x00060005, | ||
1440 | 0x3c0d0, 0xffffffff, 0x00090008, | ||
1441 | 0x3c0d4, 0xffffffff, 0x00010000, | ||
1442 | 0x3c0d8, 0xffffffff, 0x00030002, | ||
1443 | 0x3c0dc, 0xffffffff, 0x00040007, | ||
1444 | 0x3c0e0, 0xffffffff, 0x00060005, | ||
1445 | 0x3c0e4, 0xffffffff, 0x00090008, | ||
1446 | 0x3c0e8, 0xffffffff, 0x00010000, | ||
1447 | 0x3c0ec, 0xffffffff, 0x00030002, | ||
1448 | 0x3c0f0, 0xffffffff, 0x00040007, | ||
1449 | 0x3c0f4, 0xffffffff, 0x00060005, | ||
1450 | 0x3c0f8, 0xffffffff, 0x00090008, | ||
1451 | 0xc318, 0xffffffff, 0x00020200, | ||
1452 | 0x3350, 0xffffffff, 0x00000200, | ||
1453 | 0x15c0, 0xffffffff, 0x00000400, | ||
1454 | 0x55e8, 0xffffffff, 0x00000000, | ||
1455 | 0x2f50, 0xffffffff, 0x00000902, | ||
1456 | 0x3c000, 0xffffffff, 0x96940200, | ||
1457 | 0x8708, 0xffffffff, 0x00900100, | ||
1458 | 0xc424, 0xffffffff, 0x0020003f, | ||
1459 | 0x38, 0xffffffff, 0x0140001c, | ||
1460 | 0x3c, 0x000f0000, 0x000f0000, | ||
1461 | 0x220, 0xffffffff, 0xc060000c, | ||
1462 | 0x224, 0xc0000fff, 0x00000100, | ||
1463 | 0xf90, 0xffffffff, 0x00000100, | ||
1464 | 0xf98, 0x00000101, 0x00000000, | ||
1465 | 0x20a8, 0xffffffff, 0x00000104, | ||
1466 | 0x55e4, 0xff000fff, 0x00000100, | ||
1467 | 0x30cc, 0xc0000fff, 0x00000104, | ||
1468 | 0xc1e4, 0x00000001, 0x00000001, | ||
1469 | 0xd00c, 0xff000ff0, 0x00000100, | ||
1470 | 0xd80c, 0xff000ff0, 0x00000100 | ||
1471 | }; | ||
1472 | |||
1300 | static void cik_init_golden_registers(struct radeon_device *rdev) | 1473 | static void cik_init_golden_registers(struct radeon_device *rdev) |
1301 | { | 1474 | { |
1302 | switch (rdev->family) { | 1475 | switch (rdev->family) { |
@@ -1342,6 +1515,20 @@ static void cik_init_golden_registers(struct radeon_device *rdev) | |||
1342 | spectre_golden_spm_registers, | 1515 | spectre_golden_spm_registers, |
1343 | (const u32)ARRAY_SIZE(spectre_golden_spm_registers)); | 1516 | (const u32)ARRAY_SIZE(spectre_golden_spm_registers)); |
1344 | break; | 1517 | break; |
1518 | case CHIP_HAWAII: | ||
1519 | radeon_program_register_sequence(rdev, | ||
1520 | hawaii_mgcg_cgcg_init, | ||
1521 | (const u32)ARRAY_SIZE(hawaii_mgcg_cgcg_init)); | ||
1522 | radeon_program_register_sequence(rdev, | ||
1523 | hawaii_golden_registers, | ||
1524 | (const u32)ARRAY_SIZE(hawaii_golden_registers)); | ||
1525 | radeon_program_register_sequence(rdev, | ||
1526 | hawaii_golden_common_registers, | ||
1527 | (const u32)ARRAY_SIZE(hawaii_golden_common_registers)); | ||
1528 | radeon_program_register_sequence(rdev, | ||
1529 | hawaii_golden_spm_registers, | ||
1530 | (const u32)ARRAY_SIZE(hawaii_golden_spm_registers)); | ||
1531 | break; | ||
1345 | default: | 1532 | default: |
1346 | break; | 1533 | break; |
1347 | } | 1534 | } |
@@ -1449,6 +1636,35 @@ static const u32 bonaire_io_mc_regs[BONAIRE_IO_MC_REGS_SIZE][2] = | |||
1449 | {0x0000009f, 0x00b48000} | 1636 | {0x0000009f, 0x00b48000} |
1450 | }; | 1637 | }; |
1451 | 1638 | ||
1639 | #define HAWAII_IO_MC_REGS_SIZE 22 | ||
1640 | |||
1641 | static const u32 hawaii_io_mc_regs[HAWAII_IO_MC_REGS_SIZE][2] = | ||
1642 | { | ||
1643 | {0x0000007d, 0x40000000}, | ||
1644 | {0x0000007e, 0x40180304}, | ||
1645 | {0x0000007f, 0x0000ff00}, | ||
1646 | {0x00000081, 0x00000000}, | ||
1647 | {0x00000083, 0x00000800}, | ||
1648 | {0x00000086, 0x00000000}, | ||
1649 | {0x00000087, 0x00000100}, | ||
1650 | {0x00000088, 0x00020100}, | ||
1651 | {0x00000089, 0x00000000}, | ||
1652 | {0x0000008b, 0x00040000}, | ||
1653 | {0x0000008c, 0x00000100}, | ||
1654 | {0x0000008e, 0xff010000}, | ||
1655 | {0x00000090, 0xffffefff}, | ||
1656 | {0x00000091, 0xfff3efff}, | ||
1657 | {0x00000092, 0xfff3efbf}, | ||
1658 | {0x00000093, 0xf7ffffff}, | ||
1659 | {0x00000094, 0xffffff7f}, | ||
1660 | {0x00000095, 0x00000fff}, | ||
1661 | {0x00000096, 0x00116fff}, | ||
1662 | {0x00000097, 0x60010000}, | ||
1663 | {0x00000098, 0x10010000}, | ||
1664 | {0x0000009f, 0x00c79000} | ||
1665 | }; | ||
1666 | |||
1667 | |||
1452 | /** | 1668 | /** |
1453 | * cik_srbm_select - select specific register instances | 1669 | * cik_srbm_select - select specific register instances |
1454 | * | 1670 | * |
@@ -1493,11 +1709,17 @@ static int ci_mc_load_microcode(struct radeon_device *rdev) | |||
1493 | 1709 | ||
1494 | switch (rdev->family) { | 1710 | switch (rdev->family) { |
1495 | case CHIP_BONAIRE: | 1711 | case CHIP_BONAIRE: |
1496 | default: | ||
1497 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; | 1712 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; |
1498 | ucode_size = CIK_MC_UCODE_SIZE; | 1713 | ucode_size = CIK_MC_UCODE_SIZE; |
1499 | regs_size = BONAIRE_IO_MC_REGS_SIZE; | 1714 | regs_size = BONAIRE_IO_MC_REGS_SIZE; |
1500 | break; | 1715 | break; |
1716 | case CHIP_HAWAII: | ||
1717 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; | ||
1718 | ucode_size = HAWAII_MC_UCODE_SIZE; | ||
1719 | regs_size = HAWAII_IO_MC_REGS_SIZE; | ||
1720 | break; | ||
1721 | default: | ||
1722 | return -EINVAL; | ||
1501 | } | 1723 | } |
1502 | 1724 | ||
1503 | running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; | 1725 | running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; |
@@ -1559,8 +1781,8 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1559 | { | 1781 | { |
1560 | const char *chip_name; | 1782 | const char *chip_name; |
1561 | size_t pfp_req_size, me_req_size, ce_req_size, | 1783 | size_t pfp_req_size, me_req_size, ce_req_size, |
1562 | mec_req_size, rlc_req_size, mc_req_size, | 1784 | mec_req_size, rlc_req_size, mc_req_size = 0, |
1563 | sdma_req_size, smc_req_size; | 1785 | sdma_req_size, smc_req_size = 0; |
1564 | char fw_name[30]; | 1786 | char fw_name[30]; |
1565 | int err; | 1787 | int err; |
1566 | 1788 | ||
@@ -1578,6 +1800,17 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1578 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1800 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1579 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); | 1801 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); |
1580 | break; | 1802 | break; |
1803 | case CHIP_HAWAII: | ||
1804 | chip_name = "HAWAII"; | ||
1805 | pfp_req_size = CIK_PFP_UCODE_SIZE * 4; | ||
1806 | me_req_size = CIK_ME_UCODE_SIZE * 4; | ||
1807 | ce_req_size = CIK_CE_UCODE_SIZE * 4; | ||
1808 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | ||
1809 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; | ||
1810 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; | ||
1811 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | ||
1812 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); | ||
1813 | break; | ||
1581 | case CHIP_KAVERI: | 1814 | case CHIP_KAVERI: |
1582 | chip_name = "KAVERI"; | 1815 | chip_name = "KAVERI"; |
1583 | pfp_req_size = CIK_PFP_UCODE_SIZE * 4; | 1816 | pfp_req_size = CIK_PFP_UCODE_SIZE * 4; |
@@ -1758,9 +1991,227 @@ static void cik_tiling_mode_table_init(struct radeon_device *rdev) | |||
1758 | 1991 | ||
1759 | num_pipe_configs = rdev->config.cik.max_tile_pipes; | 1992 | num_pipe_configs = rdev->config.cik.max_tile_pipes; |
1760 | if (num_pipe_configs > 8) | 1993 | if (num_pipe_configs > 8) |
1761 | num_pipe_configs = 8; /* ??? */ | 1994 | num_pipe_configs = 16; |
1762 | 1995 | ||
1763 | if (num_pipe_configs == 8) { | 1996 | if (num_pipe_configs == 16) { |
1997 | for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { | ||
1998 | switch (reg_offset) { | ||
1999 | case 0: | ||
2000 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2001 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2002 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2003 | TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B)); | ||
2004 | break; | ||
2005 | case 1: | ||
2006 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2007 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2008 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2009 | TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B)); | ||
2010 | break; | ||
2011 | case 2: | ||
2012 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2013 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2014 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2015 | TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B)); | ||
2016 | break; | ||
2017 | case 3: | ||
2018 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2019 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2020 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2021 | TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B)); | ||
2022 | break; | ||
2023 | case 4: | ||
2024 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2025 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2026 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2027 | TILE_SPLIT(split_equal_to_row_size)); | ||
2028 | break; | ||
2029 | case 5: | ||
2030 | gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | | ||
2031 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); | ||
2032 | break; | ||
2033 | case 6: | ||
2034 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | | ||
2035 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2036 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2037 | TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B)); | ||
2038 | break; | ||
2039 | case 7: | ||
2040 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | | ||
2041 | MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | | ||
2042 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2043 | TILE_SPLIT(split_equal_to_row_size)); | ||
2044 | break; | ||
2045 | case 8: | ||
2046 | gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) | | ||
2047 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16)); | ||
2048 | break; | ||
2049 | case 9: | ||
2050 | gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | | ||
2051 | MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING)); | ||
2052 | break; | ||
2053 | case 10: | ||
2054 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2055 | MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | | ||
2056 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2057 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2058 | break; | ||
2059 | case 11: | ||
2060 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | | ||
2061 | MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | | ||
2062 | PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) | | ||
2063 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2064 | break; | ||
2065 | case 12: | ||
2066 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | | ||
2067 | MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | | ||
2068 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2069 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2070 | break; | ||
2071 | case 13: | ||
2072 | gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | | ||
2073 | MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING)); | ||
2074 | break; | ||
2075 | case 14: | ||
2076 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2077 | MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | | ||
2078 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2079 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2080 | break; | ||
2081 | case 16: | ||
2082 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | | ||
2083 | MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | | ||
2084 | PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) | | ||
2085 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2086 | break; | ||
2087 | case 17: | ||
2088 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | | ||
2089 | MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | | ||
2090 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2091 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2092 | break; | ||
2093 | case 27: | ||
2094 | gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | | ||
2095 | MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING)); | ||
2096 | break; | ||
2097 | case 28: | ||
2098 | gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | | ||
2099 | MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | | ||
2100 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2101 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2102 | break; | ||
2103 | case 29: | ||
2104 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | | ||
2105 | MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | | ||
2106 | PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) | | ||
2107 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2108 | break; | ||
2109 | case 30: | ||
2110 | gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | | ||
2111 | MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | | ||
2112 | PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | | ||
2113 | SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); | ||
2114 | break; | ||
2115 | default: | ||
2116 | gb_tile_moden = 0; | ||
2117 | break; | ||
2118 | } | ||
2119 | rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden; | ||
2120 | WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden); | ||
2121 | } | ||
2122 | for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) { | ||
2123 | switch (reg_offset) { | ||
2124 | case 0: | ||
2125 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2126 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | | ||
2127 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | | ||
2128 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2129 | break; | ||
2130 | case 1: | ||
2131 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2132 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | | ||
2133 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | | ||
2134 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2135 | break; | ||
2136 | case 2: | ||
2137 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2138 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2139 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2140 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2141 | break; | ||
2142 | case 3: | ||
2143 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2144 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2145 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2146 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2147 | break; | ||
2148 | case 4: | ||
2149 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2150 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2151 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2152 | NUM_BANKS(ADDR_SURF_8_BANK)); | ||
2153 | break; | ||
2154 | case 5: | ||
2155 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2156 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2157 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2158 | NUM_BANKS(ADDR_SURF_4_BANK)); | ||
2159 | break; | ||
2160 | case 6: | ||
2161 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2162 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2163 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2164 | NUM_BANKS(ADDR_SURF_2_BANK)); | ||
2165 | break; | ||
2166 | case 8: | ||
2167 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2168 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | | ||
2169 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | | ||
2170 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2171 | break; | ||
2172 | case 9: | ||
2173 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2174 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | | ||
2175 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | | ||
2176 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2177 | break; | ||
2178 | case 10: | ||
2179 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2180 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2181 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2182 | NUM_BANKS(ADDR_SURF_16_BANK)); | ||
2183 | break; | ||
2184 | case 11: | ||
2185 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2186 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2187 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2188 | NUM_BANKS(ADDR_SURF_8_BANK)); | ||
2189 | break; | ||
2190 | case 12: | ||
2191 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2192 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2193 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2194 | NUM_BANKS(ADDR_SURF_4_BANK)); | ||
2195 | break; | ||
2196 | case 13: | ||
2197 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2198 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2199 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2200 | NUM_BANKS(ADDR_SURF_2_BANK)); | ||
2201 | break; | ||
2202 | case 14: | ||
2203 | gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | | ||
2204 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | | ||
2205 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | | ||
2206 | NUM_BANKS(ADDR_SURF_2_BANK)); | ||
2207 | break; | ||
2208 | default: | ||
2209 | gb_tile_moden = 0; | ||
2210 | break; | ||
2211 | } | ||
2212 | WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden); | ||
2213 | } | ||
2214 | } else if (num_pipe_configs == 8) { | ||
1764 | for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { | 2215 | for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { |
1765 | switch (reg_offset) { | 2216 | switch (reg_offset) { |
1766 | case 0: | 2217 | case 0: |
@@ -2645,7 +3096,10 @@ static void cik_setup_rb(struct radeon_device *rdev, | |||
2645 | for (j = 0; j < sh_per_se; j++) { | 3096 | for (j = 0; j < sh_per_se; j++) { |
2646 | cik_select_se_sh(rdev, i, j); | 3097 | cik_select_se_sh(rdev, i, j); |
2647 | data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se); | 3098 | data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se); |
2648 | disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH); | 3099 | if (rdev->family == CHIP_HAWAII) |
3100 | disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH); | ||
3101 | else | ||
3102 | disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH); | ||
2649 | } | 3103 | } |
2650 | } | 3104 | } |
2651 | cik_select_se_sh(rdev, 0xffffffff, 0xffffffff); | 3105 | cik_select_se_sh(rdev, 0xffffffff, 0xffffffff); |
@@ -2662,6 +3116,12 @@ static void cik_setup_rb(struct radeon_device *rdev, | |||
2662 | data = 0; | 3116 | data = 0; |
2663 | for (j = 0; j < sh_per_se; j++) { | 3117 | for (j = 0; j < sh_per_se; j++) { |
2664 | switch (enabled_rbs & 3) { | 3118 | switch (enabled_rbs & 3) { |
3119 | case 0: | ||
3120 | if (j == 0) | ||
3121 | data |= PKR_MAP(RASTER_CONFIG_RB_MAP_3); | ||
3122 | else | ||
3123 | data |= PKR_MAP(RASTER_CONFIG_RB_MAP_0); | ||
3124 | break; | ||
2665 | case 1: | 3125 | case 1: |
2666 | data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2); | 3126 | data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2); |
2667 | break; | 3127 | break; |
@@ -2714,6 +3174,23 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
2714 | rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130; | 3174 | rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130; |
2715 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; | 3175 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; |
2716 | break; | 3176 | break; |
3177 | case CHIP_HAWAII: | ||
3178 | rdev->config.cik.max_shader_engines = 4; | ||
3179 | rdev->config.cik.max_tile_pipes = 16; | ||
3180 | rdev->config.cik.max_cu_per_sh = 11; | ||
3181 | rdev->config.cik.max_sh_per_se = 1; | ||
3182 | rdev->config.cik.max_backends_per_se = 4; | ||
3183 | rdev->config.cik.max_texture_channel_caches = 16; | ||
3184 | rdev->config.cik.max_gprs = 256; | ||
3185 | rdev->config.cik.max_gs_threads = 32; | ||
3186 | rdev->config.cik.max_hw_contexts = 8; | ||
3187 | |||
3188 | rdev->config.cik.sc_prim_fifo_size_frontend = 0x20; | ||
3189 | rdev->config.cik.sc_prim_fifo_size_backend = 0x100; | ||
3190 | rdev->config.cik.sc_hiz_tile_fifo_size = 0x30; | ||
3191 | rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130; | ||
3192 | gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN; | ||
3193 | break; | ||
2717 | case CHIP_KAVERI: | 3194 | case CHIP_KAVERI: |
2718 | rdev->config.cik.max_shader_engines = 1; | 3195 | rdev->config.cik.max_shader_engines = 1; |
2719 | rdev->config.cik.max_tile_pipes = 4; | 3196 | rdev->config.cik.max_tile_pipes = 4; |
@@ -3477,7 +3954,8 @@ static int cik_cp_gfx_resume(struct radeon_device *rdev) | |||
3477 | int r; | 3954 | int r; |
3478 | 3955 | ||
3479 | WREG32(CP_SEM_WAIT_TIMER, 0x0); | 3956 | WREG32(CP_SEM_WAIT_TIMER, 0x0); |
3480 | WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); | 3957 | if (rdev->family != CHIP_HAWAII) |
3958 | WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); | ||
3481 | 3959 | ||
3482 | /* Set the write pointer delay */ | 3960 | /* Set the write pointer delay */ |
3483 | WREG32(CP_RB_WPTR_DELAY, 0); | 3961 | WREG32(CP_RB_WPTR_DELAY, 0); |
@@ -4814,12 +5292,17 @@ void cik_vm_fini(struct radeon_device *rdev) | |||
4814 | static void cik_vm_decode_fault(struct radeon_device *rdev, | 5292 | static void cik_vm_decode_fault(struct radeon_device *rdev, |
4815 | u32 status, u32 addr, u32 mc_client) | 5293 | u32 status, u32 addr, u32 mc_client) |
4816 | { | 5294 | { |
4817 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | 5295 | u32 mc_id; |
4818 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | 5296 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; |
4819 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | 5297 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; |
4820 | char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, | 5298 | char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, |
4821 | (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; | 5299 | (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; |
4822 | 5300 | ||
5301 | if (rdev->family == CHIP_HAWAII) | ||
5302 | mc_id = (status & HAWAII_MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | ||
5303 | else | ||
5304 | mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | ||
5305 | |||
4823 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", | 5306 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", |
4824 | protections, vmid, addr, | 5307 | protections, vmid, addr, |
4825 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | 5308 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", |
@@ -5076,6 +5559,7 @@ static int cik_rlc_resume(struct radeon_device *rdev) | |||
5076 | 5559 | ||
5077 | switch (rdev->family) { | 5560 | switch (rdev->family) { |
5078 | case CHIP_BONAIRE: | 5561 | case CHIP_BONAIRE: |
5562 | case CHIP_HAWAII: | ||
5079 | default: | 5563 | default: |
5080 | size = BONAIRE_RLC_UCODE_SIZE; | 5564 | size = BONAIRE_RLC_UCODE_SIZE; |
5081 | break; | 5565 | break; |
@@ -5832,6 +6316,10 @@ void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer) | |||
5832 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ | 6316 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ |
5833 | buffer[count++] = cpu_to_le32(0x00000000); | 6317 | buffer[count++] = cpu_to_le32(0x00000000); |
5834 | break; | 6318 | break; |
6319 | case CHIP_HAWAII: | ||
6320 | buffer[count++] = 0x3a00161a; | ||
6321 | buffer[count++] = 0x0000002e; | ||
6322 | break; | ||
5835 | default: | 6323 | default: |
5836 | buffer[count++] = cpu_to_le32(0x00000000); | 6324 | buffer[count++] = cpu_to_le32(0x00000000); |
5837 | buffer[count++] = cpu_to_le32(0x00000000); | 6325 | buffer[count++] = cpu_to_le32(0x00000000); |