int                     global_id; /* physical global thread number */
        int                     vabits; /* Virtual Address size in bits */
        int                     pabits; /* Physical Address size in bits */
+       int                     timerbits; /* Width of arch timer in bits */
        unsigned int            ksave_mask; /* Usable KSave mask. */
        unsigned int            watch_dreg_count;   /* Number data breakpoints */
        unsigned int            watch_ireg_count;   /* Number instruction breakpoints */
 
 
 #define LOONGARCH_CSR_TCFG             0x41    /* Timer config */
 #define  CSR_TCFG_VAL_SHIFT            2
-#define         CSR_TCFG_VAL_WIDTH             48
 #define  CSR_TCFG_VAL                  (_ULCAST_(0x3fffffffffff) << CSR_TCFG_VAL_SHIFT)
 #define  CSR_TCFG_PERIOD_SHIFT         1
 #define  CSR_TCFG_PERIOD               (_ULCAST_(0x1) << CSR_TCFG_PERIOD_SHIFT)
 
        set_cpu_asid_mask(c, asid_mask);
 
        config = read_csr_prcfg1();
+       c->timerbits = (config & CSR_CONF1_TMRBITS) >> CSR_CONF1_TMRBITS_SHIFT;
        c->ksave_mask = GENMASK((config & CSR_CONF1_KSNUM) - 1, 0);
        c->ksave_mask &= ~(EXC_KSAVE_MASK | PERCPU_KSAVE_MASK | KVM_KSAVE_MASK);
 
 
 #else
        unsigned long min_delta = 1000;
 #endif
-       unsigned long max_delta = (1UL << 48) - 1;
+       unsigned long max_delta = GENMASK_ULL(boot_cpu_data.timerbits, 0);
        struct clock_event_device *cd;
        static int irq = 0, timer_irq_installed = 0;