diff options
Diffstat (limited to 'drivers/platform/x86/intel/pmt/class.c')
| -rw-r--r-- | drivers/platform/x86/intel/pmt/class.c | 52 | 
1 files changed, 42 insertions, 10 deletions
diff --git a/drivers/platform/x86/intel/pmt/class.c b/drivers/platform/x86/intel/pmt/class.c index 7233b654bbad..7c3023d5d91d 100644 --- a/drivers/platform/x86/intel/pmt/class.c +++ b/drivers/platform/x86/intel/pmt/class.c @@ -9,11 +9,13 @@   */  #include <linux/kernel.h> +#include <linux/log2.h>  #include <linux/intel_vsec.h>  #include <linux/io-64-nonatomic-lo-hi.h>  #include <linux/module.h>  #include <linux/mm.h>  #include <linux/pci.h> +#include <linux/sysfs.h>  #include "class.h" @@ -97,7 +99,7 @@ intel_pmt_read(struct file *filp, struct kobject *kobj,  	if (count > entry->size - off)  		count = entry->size - off; -	count = pmt_telem_read_mmio(entry->ep->pcidev, entry->cb, entry->header.guid, buf, +	count = pmt_telem_read_mmio(entry->pcidev, entry->cb, entry->header.guid, buf,  				    entry->base, off, count);  	return count; @@ -166,12 +168,41 @@ static struct attribute *intel_pmt_attrs[] = {  	&dev_attr_offset.attr,  	NULL  }; -ATTRIBUTE_GROUPS(intel_pmt); -static struct class intel_pmt_class = { +static umode_t intel_pmt_attr_visible(struct kobject *kobj, +				      struct attribute *attr, int n) +{ +	struct device *dev = container_of(kobj, struct device, kobj); +	struct auxiliary_device *auxdev = to_auxiliary_dev(dev->parent); +	struct intel_vsec_device *ivdev = auxdev_to_ivdev(auxdev); + +	/* +	 * Place the discovery features folder in /sys/class/intel_pmt, but +	 * exclude the common attributes as they are not applicable. +	 */ +	if (ivdev->cap_id == ilog2(VSEC_CAP_DISCOVERY)) +		return 0; + +	return attr->mode; +} + +static bool intel_pmt_group_visible(struct kobject *kobj) +{ +	return true; +} +DEFINE_SYSFS_GROUP_VISIBLE(intel_pmt); + +static const struct attribute_group intel_pmt_group = { +	.attrs = intel_pmt_attrs, +	.is_visible = SYSFS_GROUP_VISIBLE(intel_pmt), +}; +__ATTRIBUTE_GROUPS(intel_pmt); + +struct class intel_pmt_class = {  	.name = "intel_pmt",  	.dev_groups = intel_pmt_groups,  }; +EXPORT_SYMBOL_GPL(intel_pmt_class);  static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,  				    struct intel_vsec_device *ivdev, @@ -252,6 +283,7 @@ static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,  		return -EINVAL;  	} +	entry->pcidev = pci_dev;  	entry->guid = header->guid;  	entry->size = header->size;  	entry->cb = ivdev->priv_data; @@ -284,8 +316,8 @@ static int intel_pmt_dev_register(struct intel_pmt_entry *entry,  	entry->kobj = &dev->kobj; -	if (ns->attr_grp) { -		ret = sysfs_create_group(entry->kobj, ns->attr_grp); +	if (entry->attr_grp) { +		ret = sysfs_create_group(entry->kobj, entry->attr_grp);  		if (ret)  			goto fail_sysfs_create_group;  	} @@ -308,7 +340,7 @@ static int intel_pmt_dev_register(struct intel_pmt_entry *entry,  	entry->pmt_bin_attr.attr.name = ns->name;  	entry->pmt_bin_attr.attr.mode = 0440;  	entry->pmt_bin_attr.mmap = intel_pmt_mmap; -	entry->pmt_bin_attr.read_new = intel_pmt_read; +	entry->pmt_bin_attr.read = intel_pmt_read;  	entry->pmt_bin_attr.size = entry->size;  	ret = sysfs_create_bin_file(&dev->kobj, &entry->pmt_bin_attr); @@ -326,8 +358,8 @@ static int intel_pmt_dev_register(struct intel_pmt_entry *entry,  fail_add_endpoint:  	sysfs_remove_bin_file(entry->kobj, &entry->pmt_bin_attr);  fail_ioremap: -	if (ns->attr_grp) -		sysfs_remove_group(entry->kobj, ns->attr_grp); +	if (entry->attr_grp) +		sysfs_remove_group(entry->kobj, entry->attr_grp);  fail_sysfs_create_group:  	device_unregister(dev);  fail_dev_create: @@ -369,8 +401,8 @@ void intel_pmt_dev_destroy(struct intel_pmt_entry *entry,  	if (entry->size)  		sysfs_remove_bin_file(entry->kobj, &entry->pmt_bin_attr); -	if (ns->attr_grp) -		sysfs_remove_group(entry->kobj, ns->attr_grp); +	if (entry->attr_grp) +		sysfs_remove_group(entry->kobj, entry->attr_grp);  	device_unregister(dev);  	xa_erase(ns->xa, entry->devid);  | 
