{
        unsigned int hi, hi2, lo;
 
+       if (mips_cm_is64)
+               return (cycle_t)gic_read(GIC_REG(SHARED, GIC_SH_COUNTER));
+
        do {
                hi = gic_read32(GIC_REG(SHARED, GIC_SH_COUNTER_63_32));
                lo = gic_read32(GIC_REG(SHARED, GIC_SH_COUNTER_31_00));
 
 void gic_write_compare(cycle_t cnt)
 {
-       gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_HI),
-                               (int)(cnt >> 32));
-       gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_LO),
-                               (int)(cnt & 0xffffffff));
+       if (mips_cm_is64) {
+               gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE), cnt);
+       } else {
+               gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_HI),
+                                       (int)(cnt >> 32));
+               gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_LO),
+                                       (int)(cnt & 0xffffffff));
+       }
 }
 
 void gic_write_cpu_compare(cycle_t cnt, int cpu)
 
        local_irq_save(flags);
 
-       gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR), cpu);
-       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_HI),
-                               (int)(cnt >> 32));
-       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_LO),
-                               (int)(cnt & 0xffffffff));
+       gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR), cpu);
+
+       if (mips_cm_is64) {
+               gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE), cnt);
+       } else {
+               gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_HI),
+                                       (int)(cnt >> 32));
+               gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_LO),
+                                       (int)(cnt & 0xffffffff));
+       }
 
        local_irq_restore(flags);
 }
 {
        unsigned int hi, lo;
 
+       if (mips_cm_is64)
+               return (cycle_t)gic_read(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE));
+
        hi = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_HI));
        lo = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_LO));
 
 
 
 /* Shared Global Counter */
 #define GIC_SH_COUNTER_31_00_OFS       0x0010
+/* 64-bit counter register for CM3 */
+#define GIC_SH_COUNTER_OFS             GIC_SH_COUNTER_31_00_OFS
 #define GIC_SH_COUNTER_63_32_OFS       0x0014
 #define GIC_SH_REVISIONID_OFS          0x0020
 
 #define GIC_VPE_WD_COUNT0_OFS          0x0094
 #define GIC_VPE_WD_INITIAL0_OFS                0x0098
 #define GIC_VPE_COMPARE_LO_OFS         0x00a0
+/* 64-bit Compare register on CM3 */
+#define GIC_VPE_COMPARE_OFS            GIC_VPE_COMPARE_LO_OFS
 #define GIC_VPE_COMPARE_HI_OFS         0x00a4
 
 #define GIC_VPE_EIC_SHADOW_SET_BASE_OFS        0x0100