]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/misc/cxl/sysfs.c
cxl: Disable prefault_mode in Radix mode
[mirror_ubuntu-bionic-kernel.git] / drivers / misc / cxl / sysfs.c
index a8b6d6a635e962b057325d9d5d6af96382474eba..629e2e156412487d99edf30ae825b9e3cf790072 100644 (file)
@@ -62,10 +62,31 @@ static ssize_t psl_timebase_synced_show(struct device *device,
                                        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);
 }
 
+static ssize_t tunneled_ops_supported_show(struct device *device,
+                                       struct device_attribute *attr,
+                                       char *buf)
+{
+       struct cxl *adapter = to_cxl_adapter(device);
+
+       return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->tunneled_ops_supported);
+}
+
 static ssize_t reset_adapter_store(struct device *device,
                                   struct device_attribute *attr,
                                   const char *buf, size_t count)
@@ -171,6 +192,7 @@ static struct device_attribute adapter_attrs[] = {
        __ATTR_RO(base_image),
        __ATTR_RO(image_loaded),
        __ATTR_RO(psl_timebase_synced),
+       __ATTR_RO(tunneled_ops_supported),
        __ATTR_RW(load_image_on_perst),
        __ATTR_RW(perst_reloads_same_image),
        __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),
@@ -331,12 +353,20 @@ static ssize_t prefault_mode_store(struct device *device,
        struct cxl_afu *afu = to_cxl_afu(device);
        enum prefault_modes mode = -1;
 
-       if (!strncmp(buf, "work_element_descriptor", 23))
-               mode = CXL_PREFAULT_WED;
-       if (!strncmp(buf, "all", 3))
-               mode = CXL_PREFAULT_ALL;
        if (!strncmp(buf, "none", 4))
                mode = CXL_PREFAULT_NONE;
+       else {
+               if (!radix_enabled()) {
+
+                       /* only allowed when not in radix mode */
+                       if (!strncmp(buf, "work_element_descriptor", 23))
+                               mode = CXL_PREFAULT_WED;
+                       if (!strncmp(buf, "all", 3))
+                               mode = CXL_PREFAULT_ALL;
+               } else {
+                       dev_err(device, "Cannot prefault with radix enabled\n");
+               }
+       }
 
        if (mode == -1)
                return -EINVAL;