diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-18 17:01:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-18 17:01:08 -0400 |
commit | 0a693ab6b6b2af0a230e98323023acd3678b0f81 (patch) | |
tree | 9ffd73de7e6d342a106b1414dacef8115a3e209d /drivers/gpu/drm/radeon/si.c | |
parent | 7a62711aacda8887d94c40daa199b37abb1d54e1 (diff) | |
parent | 3668f0df6e62cd989909f40669bbe585e8dd51ae (diff) |
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"You'll be terribly disappointed in this, I'm not trying to sneak any
features in or anything, its mostly radeon and intel fixes, a couple
of ARM driver fixes"
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (34 commits)
drm/radeon/dpm: add debugfs support for RS780/RS880 (v3)
drm/radeon/dpm/atom: fix broken gcc harder
drm/radeon/dpm/atom: restructure logic to work around a compiler bug
drm/radeon/dpm: fix atom vram table parsing
drm/radeon: fix an endian bug in atom table parsing
drm/radeon: add a module parameter to disable aspm
drm/rcar-du: Use the GEM PRIME helpers
drm/shmobile: Use the GEM PRIME helpers
uvesafb: Really allow mtrr being 0, as documented and warn()ed
radeon kms: do not flush uninitialized hotplug work
drm/radeon/dpm/sumo: handle boost states properly when forcing a perf level
drm/radeon: align VM PTBs (Page Table Blocks) to 32K
drm/radeon: allow selection of alignment in the sub-allocator
drm/radeon: never unpin UVD bo v3
drm/radeon: fix UVD fence emit
drm/radeon: add fault decode function for CIK
drm/radeon: add fault decode function for SI (v2)
drm/radeon: add fault decode function for cayman/TN (v2)
drm/radeon: use radeon device for request firmware
drm/radeon: add missing ttm_eu_backoff_reservation to radeon_bo_list_validate
...
Diffstat (limited to 'drivers/gpu/drm/radeon/si.c')
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 298 |
1 files changed, 279 insertions, 19 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 234906709067..d325280e2f9f 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -22,7 +22,6 @@ | |||
22 | * Authors: Alex Deucher | 22 | * Authors: Alex Deucher |
23 | */ | 23 | */ |
24 | #include <linux/firmware.h> | 24 | #include <linux/firmware.h> |
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
27 | #include <linux/module.h> | 26 | #include <linux/module.h> |
28 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
@@ -1541,7 +1540,6 @@ static int si_mc_load_microcode(struct radeon_device *rdev) | |||
1541 | 1540 | ||
1542 | static int si_init_microcode(struct radeon_device *rdev) | 1541 | static int si_init_microcode(struct radeon_device *rdev) |
1543 | { | 1542 | { |
1544 | struct platform_device *pdev; | ||
1545 | const char *chip_name; | 1543 | const char *chip_name; |
1546 | const char *rlc_chip_name; | 1544 | const char *rlc_chip_name; |
1547 | size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size; | 1545 | size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size; |
@@ -1551,13 +1549,6 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1551 | 1549 | ||
1552 | DRM_DEBUG("\n"); | 1550 | DRM_DEBUG("\n"); |
1553 | 1551 | ||
1554 | pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0); | ||
1555 | err = IS_ERR(pdev); | ||
1556 | if (err) { | ||
1557 | printk(KERN_ERR "radeon_cp: Failed to register firmware\n"); | ||
1558 | return -EINVAL; | ||
1559 | } | ||
1560 | |||
1561 | switch (rdev->family) { | 1552 | switch (rdev->family) { |
1562 | case CHIP_TAHITI: | 1553 | case CHIP_TAHITI: |
1563 | chip_name = "TAHITI"; | 1554 | chip_name = "TAHITI"; |
@@ -1615,7 +1606,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1615 | DRM_INFO("Loading %s Microcode\n", chip_name); | 1606 | DRM_INFO("Loading %s Microcode\n", chip_name); |
1616 | 1607 | ||
1617 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); | 1608 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); |
1618 | err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev); | 1609 | err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); |
1619 | if (err) | 1610 | if (err) |
1620 | goto out; | 1611 | goto out; |
1621 | if (rdev->pfp_fw->size != pfp_req_size) { | 1612 | if (rdev->pfp_fw->size != pfp_req_size) { |
@@ -1627,7 +1618,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1627 | } | 1618 | } |
1628 | 1619 | ||
1629 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); | 1620 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); |
1630 | err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev); | 1621 | err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); |
1631 | if (err) | 1622 | if (err) |
1632 | goto out; | 1623 | goto out; |
1633 | if (rdev->me_fw->size != me_req_size) { | 1624 | if (rdev->me_fw->size != me_req_size) { |
@@ -1638,7 +1629,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1638 | } | 1629 | } |
1639 | 1630 | ||
1640 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); | 1631 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); |
1641 | err = request_firmware(&rdev->ce_fw, fw_name, &pdev->dev); | 1632 | err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); |
1642 | if (err) | 1633 | if (err) |
1643 | goto out; | 1634 | goto out; |
1644 | if (rdev->ce_fw->size != ce_req_size) { | 1635 | if (rdev->ce_fw->size != ce_req_size) { |
@@ -1649,7 +1640,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1649 | } | 1640 | } |
1650 | 1641 | ||
1651 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); | 1642 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); |
1652 | err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev); | 1643 | err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); |
1653 | if (err) | 1644 | if (err) |
1654 | goto out; | 1645 | goto out; |
1655 | if (rdev->rlc_fw->size != rlc_req_size) { | 1646 | if (rdev->rlc_fw->size != rlc_req_size) { |
@@ -1660,7 +1651,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1660 | } | 1651 | } |
1661 | 1652 | ||
1662 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); | 1653 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
1663 | err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev); | 1654 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1664 | if (err) | 1655 | if (err) |
1665 | goto out; | 1656 | goto out; |
1666 | if (rdev->mc_fw->size != mc_req_size) { | 1657 | if (rdev->mc_fw->size != mc_req_size) { |
@@ -1671,7 +1662,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1671 | } | 1662 | } |
1672 | 1663 | ||
1673 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); | 1664 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
1674 | err = request_firmware(&rdev->smc_fw, fw_name, &pdev->dev); | 1665 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
1675 | if (err) | 1666 | if (err) |
1676 | goto out; | 1667 | goto out; |
1677 | if (rdev->smc_fw->size != smc_req_size) { | 1668 | if (rdev->smc_fw->size != smc_req_size) { |
@@ -1682,8 +1673,6 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1682 | } | 1673 | } |
1683 | 1674 | ||
1684 | out: | 1675 | out: |
1685 | platform_device_unregister(pdev); | ||
1686 | |||
1687 | if (err) { | 1676 | if (err) { |
1688 | if (err != -EINVAL) | 1677 | if (err != -EINVAL) |
1689 | printk(KERN_ERR | 1678 | printk(KERN_ERR |
@@ -4401,6 +4390,270 @@ void si_vm_fini(struct radeon_device *rdev) | |||
4401 | } | 4390 | } |
4402 | 4391 | ||
4403 | /** | 4392 | /** |
4393 | * si_vm_decode_fault - print human readable fault info | ||
4394 | * | ||
4395 | * @rdev: radeon_device pointer | ||
4396 | * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value | ||
4397 | * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value | ||
4398 | * | ||
4399 | * Print human readable fault information (SI). | ||
4400 | */ | ||
4401 | static void si_vm_decode_fault(struct radeon_device *rdev, | ||
4402 | u32 status, u32 addr) | ||
4403 | { | ||
4404 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | ||
4405 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | ||
4406 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | ||
4407 | char *block; | ||
4408 | |||
4409 | if (rdev->family == CHIP_TAHITI) { | ||
4410 | switch (mc_id) { | ||
4411 | case 160: | ||
4412 | case 144: | ||
4413 | case 96: | ||
4414 | case 80: | ||
4415 | case 224: | ||
4416 | case 208: | ||
4417 | case 32: | ||
4418 | case 16: | ||
4419 | block = "CB"; | ||
4420 | break; | ||
4421 | case 161: | ||
4422 | case 145: | ||
4423 | case 97: | ||
4424 | case 81: | ||
4425 | case 225: | ||
4426 | case 209: | ||
4427 | case 33: | ||
4428 | case 17: | ||
4429 | block = "CB_FMASK"; | ||
4430 | break; | ||
4431 | case 162: | ||
4432 | case 146: | ||
4433 | case 98: | ||
4434 | case 82: | ||
4435 | case 226: | ||
4436 | case 210: | ||
4437 | case 34: | ||
4438 | case 18: | ||
4439 | block = "CB_CMASK"; | ||
4440 | break; | ||
4441 | case 163: | ||
4442 | case 147: | ||
4443 | case 99: | ||
4444 | case 83: | ||
4445 | case 227: | ||
4446 | case 211: | ||
4447 | case 35: | ||
4448 | case 19: | ||
4449 | block = "CB_IMMED"; | ||
4450 | break; | ||
4451 | case 164: | ||
4452 | case 148: | ||
4453 | case 100: | ||
4454 | case 84: | ||
4455 | case 228: | ||
4456 | case 212: | ||
4457 | case 36: | ||
4458 | case 20: | ||
4459 | block = "DB"; | ||
4460 | break; | ||
4461 | case 165: | ||
4462 | case 149: | ||
4463 | case 101: | ||
4464 | case 85: | ||
4465 | case 229: | ||
4466 | case 213: | ||
4467 | case 37: | ||
4468 | case 21: | ||
4469 | block = "DB_HTILE"; | ||
4470 | break; | ||
4471 | case 167: | ||
4472 | case 151: | ||
4473 | case 103: | ||
4474 | case 87: | ||
4475 | case 231: | ||
4476 | case 215: | ||
4477 | case 39: | ||
4478 | case 23: | ||
4479 | block = "DB_STEN"; | ||
4480 | break; | ||
4481 | case 72: | ||
4482 | case 68: | ||
4483 | case 64: | ||
4484 | case 8: | ||
4485 | case 4: | ||
4486 | case 0: | ||
4487 | case 136: | ||
4488 | case 132: | ||
4489 | case 128: | ||
4490 | case 200: | ||
4491 | case 196: | ||
4492 | case 192: | ||
4493 | block = "TC"; | ||
4494 | break; | ||
4495 | case 112: | ||
4496 | case 48: | ||
4497 | block = "CP"; | ||
4498 | break; | ||
4499 | case 49: | ||
4500 | case 177: | ||
4501 | case 50: | ||
4502 | case 178: | ||
4503 | block = "SH"; | ||
4504 | break; | ||
4505 | case 53: | ||
4506 | case 190: | ||
4507 | block = "VGT"; | ||
4508 | break; | ||
4509 | case 117: | ||
4510 | block = "IH"; | ||
4511 | break; | ||
4512 | case 51: | ||
4513 | case 115: | ||
4514 | block = "RLC"; | ||
4515 | break; | ||
4516 | case 119: | ||
4517 | case 183: | ||
4518 | block = "DMA0"; | ||
4519 | break; | ||
4520 | case 61: | ||
4521 | block = "DMA1"; | ||
4522 | break; | ||
4523 | case 248: | ||
4524 | case 120: | ||
4525 | block = "HDP"; | ||
4526 | break; | ||
4527 | default: | ||
4528 | block = "unknown"; | ||
4529 | break; | ||
4530 | } | ||
4531 | } else { | ||
4532 | switch (mc_id) { | ||
4533 | case 32: | ||
4534 | case 16: | ||
4535 | case 96: | ||
4536 | case 80: | ||
4537 | case 160: | ||
4538 | case 144: | ||
4539 | case 224: | ||
4540 | case 208: | ||
4541 | block = "CB"; | ||
4542 | break; | ||
4543 | case 33: | ||
4544 | case 17: | ||
4545 | case 97: | ||
4546 | case 81: | ||
4547 | case 161: | ||
4548 | case 145: | ||
4549 | case 225: | ||
4550 | case 209: | ||
4551 | block = "CB_FMASK"; | ||
4552 | break; | ||
4553 | case 34: | ||
4554 | case 18: | ||
4555 | case 98: | ||
4556 | case 82: | ||
4557 | case 162: | ||
4558 | case 146: | ||
4559 | case 226: | ||
4560 | case 210: | ||
4561 | block = "CB_CMASK"; | ||
4562 | break; | ||
4563 | case 35: | ||
4564 | case 19: | ||
4565 | case 99: | ||
4566 | case 83: | ||
4567 | case 163: | ||
4568 | case 147: | ||
4569 | case 227: | ||
4570 | case 211: | ||
4571 | block = "CB_IMMED"; | ||
4572 | break; | ||
4573 | case 36: | ||
4574 | case 20: | ||
4575 | case 100: | ||
4576 | case 84: | ||
4577 | case 164: | ||
4578 | case 148: | ||
4579 | case 228: | ||
4580 | case 212: | ||
4581 | block = "DB"; | ||
4582 | break; | ||
4583 | case 37: | ||
4584 | case 21: | ||
4585 | case 101: | ||
4586 | case 85: | ||
4587 | case 165: | ||
4588 | case 149: | ||
4589 | case 229: | ||
4590 | case 213: | ||
4591 | block = "DB_HTILE"; | ||
4592 | break; | ||
4593 | case 39: | ||
4594 | case 23: | ||
4595 | case 103: | ||
4596 | case 87: | ||
4597 | case 167: | ||
4598 | case 151: | ||
4599 | case 231: | ||
4600 | case 215: | ||
4601 | block = "DB_STEN"; | ||
4602 | break; | ||
4603 | case 72: | ||
4604 | case 68: | ||
4605 | case 8: | ||
4606 | case 4: | ||
4607 | case 136: | ||
4608 | case 132: | ||
4609 | case 200: | ||
4610 | case 196: | ||
4611 | block = "TC"; | ||
4612 | break; | ||
4613 | case 112: | ||
4614 | case 48: | ||
4615 | block = "CP"; | ||
4616 | break; | ||
4617 | case 49: | ||
4618 | case 177: | ||
4619 | case 50: | ||
4620 | case 178: | ||
4621 | block = "SH"; | ||
4622 | break; | ||
4623 | case 53: | ||
4624 | block = "VGT"; | ||
4625 | break; | ||
4626 | case 117: | ||
4627 | block = "IH"; | ||
4628 | break; | ||
4629 | case 51: | ||
4630 | case 115: | ||
4631 | block = "RLC"; | ||
4632 | break; | ||
4633 | case 119: | ||
4634 | case 183: | ||
4635 | block = "DMA0"; | ||
4636 | break; | ||
4637 | case 61: | ||
4638 | block = "DMA1"; | ||
4639 | break; | ||
4640 | case 248: | ||
4641 | case 120: | ||
4642 | block = "HDP"; | ||
4643 | break; | ||
4644 | default: | ||
4645 | block = "unknown"; | ||
4646 | break; | ||
4647 | } | ||
4648 | } | ||
4649 | |||
4650 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", | ||
4651 | protections, vmid, addr, | ||
4652 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | ||
4653 | block, mc_id); | ||
4654 | } | ||
4655 | |||
4656 | /** | ||
4404 | * si_vm_set_page - update the page tables using the CP | 4657 | * si_vm_set_page - update the page tables using the CP |
4405 | * | 4658 | * |
4406 | * @rdev: radeon_device pointer | 4659 | * @rdev: radeon_device pointer |
@@ -5766,6 +6019,7 @@ int si_irq_process(struct radeon_device *rdev) | |||
5766 | u32 ring_index; | 6019 | u32 ring_index; |
5767 | bool queue_hotplug = false; | 6020 | bool queue_hotplug = false; |
5768 | bool queue_thermal = false; | 6021 | bool queue_thermal = false; |
6022 | u32 status, addr; | ||
5769 | 6023 | ||
5770 | if (!rdev->ih.enabled || rdev->shutdown) | 6024 | if (!rdev->ih.enabled || rdev->shutdown) |
5771 | return IRQ_NONE; | 6025 | return IRQ_NONE; |
@@ -6001,11 +6255,14 @@ restart_ih: | |||
6001 | break; | 6255 | break; |
6002 | case 146: | 6256 | case 146: |
6003 | case 147: | 6257 | case 147: |
6258 | addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR); | ||
6259 | status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS); | ||
6004 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); | 6260 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); |
6005 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | 6261 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
6006 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); | 6262 | addr); |
6007 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | 6263 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
6008 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); | 6264 | status); |
6265 | si_vm_decode_fault(rdev, status, addr); | ||
6009 | /* reset addr and status */ | 6266 | /* reset addr and status */ |
6010 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); | 6267 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); |
6011 | break; | 6268 | break; |
@@ -6796,6 +7053,9 @@ static void si_program_aspm(struct radeon_device *rdev) | |||
6796 | bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false; | 7053 | bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false; |
6797 | bool disable_clkreq = false; | 7054 | bool disable_clkreq = false; |
6798 | 7055 | ||
7056 | if (radeon_aspm == 0) | ||
7057 | return; | ||
7058 | |||
6799 | if (!(rdev->flags & RADEON_IS_PCIE)) | 7059 | if (!(rdev->flags & RADEON_IS_PCIE)) |
6800 | return; | 7060 | return; |
6801 | 7061 | ||