diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-06-14 10:42:22 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-07-14 10:11:29 -0400 |
commit | 3ec7d11b9a8f280cd68e53d4a7877624cc002e43 (patch) | |
tree | dc0b72535475021e7bdd43c5c923ef7c75da886a | |
parent | fbf6dc7ac7291841f53367d461a01a8e8bad0369 (diff) |
drm/radeon: add fault decode function for CIK
Helpful for debugging GPUVM errors as we can see what
hw block and page generated the fault in the log.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cikd.h | 16 |
2 files changed, 46 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 27891d87c1d3..68b4fc599e03 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -4442,6 +4442,29 @@ void cik_vm_fini(struct radeon_device *rdev) | |||
4442 | } | 4442 | } |
4443 | 4443 | ||
4444 | /** | 4444 | /** |
4445 | * cik_vm_decode_fault - print human readable fault info | ||
4446 | * | ||
4447 | * @rdev: radeon_device pointer | ||
4448 | * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value | ||
4449 | * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value | ||
4450 | * | ||
4451 | * Print human readable fault information (CIK). | ||
4452 | */ | ||
4453 | static void cik_vm_decode_fault(struct radeon_device *rdev, | ||
4454 | u32 status, u32 addr, u32 mc_client) | ||
4455 | { | ||
4456 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | ||
4457 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | ||
4458 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | ||
4459 | char *block = (char *)&mc_client; | ||
4460 | |||
4461 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", | ||
4462 | protections, vmid, addr, | ||
4463 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | ||
4464 | block, mc_id); | ||
4465 | } | ||
4466 | |||
4467 | /** | ||
4445 | * cik_vm_flush - cik vm flush using the CP | 4468 | * cik_vm_flush - cik vm flush using the CP |
4446 | * | 4469 | * |
4447 | * @rdev: radeon_device pointer | 4470 | * @rdev: radeon_device pointer |
@@ -5496,6 +5519,7 @@ int cik_irq_process(struct radeon_device *rdev) | |||
5496 | u32 ring_index; | 5519 | u32 ring_index; |
5497 | bool queue_hotplug = false; | 5520 | bool queue_hotplug = false; |
5498 | bool queue_reset = false; | 5521 | bool queue_reset = false; |
5522 | u32 addr, status, mc_client; | ||
5499 | 5523 | ||
5500 | if (!rdev->ih.enabled || rdev->shutdown) | 5524 | if (!rdev->ih.enabled || rdev->shutdown) |
5501 | return IRQ_NONE; | 5525 | return IRQ_NONE; |
@@ -5731,11 +5755,15 @@ restart_ih: | |||
5731 | break; | 5755 | break; |
5732 | case 146: | 5756 | case 146: |
5733 | case 147: | 5757 | case 147: |
5758 | addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR); | ||
5759 | status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS); | ||
5760 | mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT); | ||
5734 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); | 5761 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); |
5735 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | 5762 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
5736 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); | 5763 | addr); |
5737 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | 5764 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
5738 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); | 5765 | status); |
5766 | cik_vm_decode_fault(rdev, status, addr, mc_client); | ||
5739 | /* reset addr and status */ | 5767 | /* reset addr and status */ |
5740 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); | 5768 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); |
5741 | break; | 5769 | break; |
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h index 63514b95889a..7e9275eaef80 100644 --- a/drivers/gpu/drm/radeon/cikd.h +++ b/drivers/gpu/drm/radeon/cikd.h | |||
@@ -136,6 +136,22 @@ | |||
136 | #define VM_INVALIDATE_RESPONSE 0x147c | 136 | #define VM_INVALIDATE_RESPONSE 0x147c |
137 | 137 | ||
138 | #define VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x14DC | 138 | #define VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x14DC |
139 | #define PROTECTIONS_MASK (0xf << 0) | ||
140 | #define PROTECTIONS_SHIFT 0 | ||
141 | /* bit 0: range | ||
142 | * bit 1: pde0 | ||
143 | * bit 2: valid | ||
144 | * bit 3: read | ||
145 | * bit 4: write | ||
146 | */ | ||
147 | #define MEMORY_CLIENT_ID_MASK (0xff << 12) | ||
148 | #define MEMORY_CLIENT_ID_SHIFT 12 | ||
149 | #define MEMORY_CLIENT_RW_MASK (1 << 24) | ||
150 | #define MEMORY_CLIENT_RW_SHIFT 24 | ||
151 | #define FAULT_VMID_MASK (0xf << 25) | ||
152 | #define FAULT_VMID_SHIFT 25 | ||
153 | |||
154 | #define VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT 0x14E4 | ||
139 | 155 | ||
140 | #define VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x14FC | 156 | #define VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x14FC |
141 | 157 | ||