]> rtime.felk.cvut.cz Git - linux-imx.git/blobdiff - drivers/gpu/drm/radeon/ni.c
drm/radeon: fix halting UVD
[linux-imx.git] / drivers / gpu / drm / radeon / ni.c
index 465b17e1fa4e45b3767623f349cdf2e3a225370f..16e91b08bf575c5a157b0ea8550331f19846432b 100644 (file)
@@ -2286,7 +2286,7 @@ int cayman_suspend(struct radeon_device *rdev)
        radeon_vm_manager_fini(rdev);
        cayman_cp_enable(rdev, false);
        cayman_dma_stop(rdev);
-       r600_uvd_rbc_stop(rdev);
+       r600_uvd_stop(rdev);
        radeon_uvd_suspend(rdev);
        evergreen_irq_suspend(rdev);
        radeon_wb_disable(rdev);
@@ -2418,6 +2418,7 @@ void cayman_fini(struct radeon_device *rdev)
        radeon_vm_manager_fini(rdev);
        radeon_ib_pool_fini(rdev);
        radeon_irq_kms_fini(rdev);
+       r600_uvd_stop(rdev);
        radeon_uvd_fini(rdev);
        cayman_pcie_gart_fini(rdev);
        r600_vram_scratch_fini(rdev);
@@ -2450,6 +2451,167 @@ void cayman_vm_fini(struct radeon_device *rdev)
 {
 }
 
+/**
+ * cayman_vm_decode_fault - print human readable fault info
+ *
+ * @rdev: radeon_device pointer
+ * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
+ * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
+ *
+ * Print human readable fault information (cayman/TN).
+ */
+void cayman_vm_decode_fault(struct radeon_device *rdev,
+                           u32 status, u32 addr)
+{
+       u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
+       u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
+       u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
+       char *block;
+
+       switch (mc_id) {
+       case 32:
+       case 16:
+       case 96:
+       case 80:
+       case 160:
+       case 144:
+       case 224:
+       case 208:
+               block = "CB";
+               break;
+       case 33:
+       case 17:
+       case 97:
+       case 81:
+       case 161:
+       case 145:
+       case 225:
+       case 209:
+               block = "CB_FMASK";
+               break;
+       case 34:
+       case 18:
+       case 98:
+       case 82:
+       case 162:
+       case 146:
+       case 226:
+       case 210:
+               block = "CB_CMASK";
+               break;
+       case 35:
+       case 19:
+       case 99:
+       case 83:
+       case 163:
+       case 147:
+       case 227:
+       case 211:
+               block = "CB_IMMED";
+               break;
+       case 36:
+       case 20:
+       case 100:
+       case 84:
+       case 164:
+       case 148:
+       case 228:
+       case 212:
+               block = "DB";
+               break;
+       case 37:
+       case 21:
+       case 101:
+       case 85:
+       case 165:
+       case 149:
+       case 229:
+       case 213:
+               block = "DB_HTILE";
+               break;
+       case 38:
+       case 22:
+       case 102:
+       case 86:
+       case 166:
+       case 150:
+       case 230:
+       case 214:
+               block = "SX";
+               break;
+       case 39:
+       case 23:
+       case 103:
+       case 87:
+       case 167:
+       case 151:
+       case 231:
+       case 215:
+               block = "DB_STEN";
+               break;
+       case 40:
+       case 24:
+       case 104:
+       case 88:
+       case 232:
+       case 216:
+       case 168:
+       case 152:
+               block = "TC_TFETCH";
+               break;
+       case 41:
+       case 25:
+       case 105:
+       case 89:
+       case 233:
+       case 217:
+       case 169:
+       case 153:
+               block = "TC_VFETCH";
+               break;
+       case 42:
+       case 26:
+       case 106:
+       case 90:
+       case 234:
+       case 218:
+       case 170:
+       case 154:
+               block = "VC";
+               break;
+       case 112:
+               block = "CP";
+               break;
+       case 113:
+       case 114:
+               block = "SH";
+               break;
+       case 115:
+               block = "VGT";
+               break;
+       case 178:
+               block = "IH";
+               break;
+       case 51:
+               block = "RLC";
+               break;
+       case 55:
+               block = "DMA";
+               break;
+       case 56:
+               block = "HDP";
+               break;
+       default:
+               block = "unknown";
+               break;
+       }
+
+       printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
+              protections, vmid, addr,
+              (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
+              block, mc_id);
+}
+
 #define R600_ENTRY_VALID   (1 << 0)
 #define R600_PTE_SYSTEM    (1 << 1)
 #define R600_PTE_SNOOPED   (1 << 2)