WREG32_FIELD(CP_PQ_WPTR_POLL_CNTL, EN, 0);
 
        /* program all HQD registers */
-       for (mqd_reg = mmCP_HQD_VMID; mqd_reg <= mmCP_HQD_ERROR; mqd_reg++)
+       for (mqd_reg = mmCP_HQD_VMID; mqd_reg <= mmCP_HQD_EOP_CONTROL; mqd_reg++)
+               WREG32(mqd_reg, mqd_data[mqd_reg - mmCP_MQD_BASE_ADDR]);
+
+       /* Tonga errata: EOP RPTR/WPTR should be left unmodified.
+        * This is safe since EOP RPTR==WPTR for any inactive HQD
+        * on ASICs that do not support context-save.
+        * EOP writes/reads can start anywhere in the ring.
+        */
+       if (adev->asic_type != CHIP_TONGA) {
+               WREG32(mmCP_HQD_EOP_RPTR, mqd->cp_hqd_eop_rptr);
+               WREG32(mmCP_HQD_EOP_WPTR, mqd->cp_hqd_eop_wptr);
+               WREG32(mmCP_HQD_EOP_WPTR_MEM, mqd->cp_hqd_eop_wptr_mem);
+       }
+
+       for (mqd_reg = mmCP_HQD_EOP_EVENTS; mqd_reg <= mmCP_HQD_ERROR; mqd_reg++)
                WREG32(mqd_reg, mqd_data[mqd_reg - mmCP_MQD_BASE_ADDR]);
 
        /* activate the HQD */