|
@@ -139,6 +139,8 @@ void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
|
|
|
void evergreen_program_aspm(struct radeon_device *rdev);
|
|
|
extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
|
|
|
int ring, u32 cp_int_cntl);
|
|
|
+extern void cayman_vm_decode_fault(struct radeon_device *rdev,
|
|
|
+ u32 status, u32 addr);
|
|
|
|
|
|
static const u32 evergreen_golden_registers[] =
|
|
|
{
|
|
@@ -4586,6 +4588,7 @@ int evergreen_irq_process(struct radeon_device *rdev)
|
|
|
bool queue_hotplug = false;
|
|
|
bool queue_hdmi = false;
|
|
|
bool queue_thermal = false;
|
|
|
+ u32 status, addr;
|
|
|
|
|
|
if (!rdev->ih.enabled || rdev->shutdown)
|
|
|
return IRQ_NONE;
|
|
@@ -4872,11 +4875,14 @@ restart_ih:
|
|
|
break;
|
|
|
case 146:
|
|
|
case 147:
|
|
|
+ addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
|
|
|
+ status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
|
|
|
dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
|
|
|
dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
|
|
|
- RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
|
|
|
+ addr);
|
|
|
dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
|
|
|
- RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
|
|
|
+ status);
|
|
|
+ cayman_vm_decode_fault(rdev, status, addr);
|
|
|
/* reset addr and status */
|
|
|
WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
|
|
|
break;
|