static void cxl_setup_psl_timebase(struct cxl *adapter, struct pci_dev *dev)
 {
-       u64 psl_tb;
-       int delta;
-       unsigned int retry = 0;
        struct device_node *np;
 
        adapter->psl_timebase_synced = false;
        cxl_p1_write(adapter, CXL_PSL_Control, 0x0000000000000000);
        cxl_p1_write(adapter, CXL_PSL_Control, CXL_PSL_Control_tb);
 
-       /* Wait until CORE TB and PSL TB difference <= 16usecs */
-       do {
-               msleep(1);
-               if (retry++ > 5) {
-                       dev_info(&dev->dev, "PSL timebase can't synchronize\n");
-                       return;
-               }
-               psl_tb = adapter->native->sl_ops->timebase_read(adapter);
-               delta = mftb() - psl_tb;
-               if (delta < 0)
-                       delta = -delta;
-       } while (tb_to_ns(delta) > 16000);
-
-       adapter->psl_timebase_synced = true;
        return;
 }
 
 
                                        char *buf)
 {
        struct cxl *adapter = to_cxl_adapter(device);
+       u64 psl_tb, delta;
 
+       /* Recompute the status only in native mode */
+       if (cpu_has_feature(CPU_FTR_HVMODE)) {
+               psl_tb = adapter->native->sl_ops->timebase_read(adapter);
+               delta = abs(mftb() - psl_tb);
+
+               /* CORE TB and PSL TB difference <= 16usecs ? */
+               adapter->psl_timebase_synced = (tb_to_ns(delta) < 16000) ? true : false;
+               pr_devel("PSL timebase %s - delta: 0x%016llx\n",
+                        (tb_to_ns(delta) < 16000) ? "synchronized" :
+                        "not synchronized", tb_to_ns(delta));
+       }
        return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced);
 }