dmaengine: idxd: expose IAA CAP register via sysfs knob
[linux-2.6-microblaze.git] / drivers / dma / idxd / sysfs.c
index 927c9d6..2eba8ca 100644 (file)
@@ -1561,6 +1561,18 @@ static ssize_t cmd_status_store(struct device *dev, struct device_attribute *att
 }
 static DEVICE_ATTR_RW(cmd_status);
 
+static ssize_t iaa_cap_show(struct device *dev,
+                           struct device_attribute *attr, char *buf)
+{
+       struct idxd_device *idxd = confdev_to_idxd(dev);
+
+       if (idxd->hw.version < DEVICE_VERSION_2)
+               return -EOPNOTSUPP;
+
+       return sysfs_emit(buf, "%#llx\n", idxd->hw.iaa_cap.bits);
+}
+static DEVICE_ATTR_RO(iaa_cap);
+
 static bool idxd_device_attr_max_batch_size_invisible(struct attribute *attr,
                                                      struct idxd_device *idxd)
 {
@@ -1583,6 +1595,14 @@ static bool idxd_device_attr_read_buffers_invisible(struct attribute *attr,
                idxd->data->type == IDXD_TYPE_IAX;
 }
 
+static bool idxd_device_attr_iaa_cap_invisible(struct attribute *attr,
+                                              struct idxd_device *idxd)
+{
+       return attr == &dev_attr_iaa_cap.attr &&
+              (idxd->data->type != IDXD_TYPE_IAX ||
+              idxd->hw.version < DEVICE_VERSION_2);
+}
+
 static umode_t idxd_device_attr_visible(struct kobject *kobj,
                                        struct attribute *attr, int n)
 {
@@ -1595,6 +1615,9 @@ static umode_t idxd_device_attr_visible(struct kobject *kobj,
        if (idxd_device_attr_read_buffers_invisible(attr, idxd))
                return 0;
 
+       if (idxd_device_attr_iaa_cap_invisible(attr, idxd))
+               return 0;
+
        return attr->mode;
 }
 
@@ -1620,6 +1643,7 @@ static struct attribute *idxd_device_attributes[] = {
        &dev_attr_read_buffer_limit.attr,
        &dev_attr_cdev_major.attr,
        &dev_attr_cmd_status.attr,
+       &dev_attr_iaa_cap.attr,
        NULL,
 };