diff options
Diffstat (limited to 'drivers/misc/ocxl/sysfs.c')
| -rw-r--r-- | drivers/misc/ocxl/sysfs.c | 54 | 
1 files changed, 32 insertions, 22 deletions
diff --git a/drivers/misc/ocxl/sysfs.c b/drivers/misc/ocxl/sysfs.c index 0ab1fd1b2682..58f1ba264206 100644 --- a/drivers/misc/ocxl/sysfs.c +++ b/drivers/misc/ocxl/sysfs.c @@ -3,11 +3,18 @@  #include <linux/sysfs.h>  #include "ocxl_internal.h" +static inline struct ocxl_afu *to_afu(struct device *device) +{ +	struct ocxl_file_info *info = container_of(device, struct ocxl_file_info, dev); + +	return info->afu; +} +  static ssize_t global_mmio_size_show(struct device *device,  				struct device_attribute *attr,  				char *buf)  { -	struct ocxl_afu *afu = to_ocxl_afu(device); +	struct ocxl_afu *afu = to_afu(device);  	return scnprintf(buf, PAGE_SIZE, "%d\n",  			afu->config.global_mmio_size); @@ -17,7 +24,7 @@ static ssize_t pp_mmio_size_show(struct device *device,  				struct device_attribute *attr,  				char *buf)  { -	struct ocxl_afu *afu = to_ocxl_afu(device); +	struct ocxl_afu *afu = to_afu(device);  	return scnprintf(buf, PAGE_SIZE, "%d\n",  			afu->config.pp_mmio_stride); @@ -27,7 +34,7 @@ static ssize_t afu_version_show(struct device *device,  				struct device_attribute *attr,  				char *buf)  { -	struct ocxl_afu *afu = to_ocxl_afu(device); +	struct ocxl_afu *afu = to_afu(device);  	return scnprintf(buf, PAGE_SIZE, "%hhu:%hhu\n",  			afu->config.version_major, @@ -38,7 +45,7 @@ static ssize_t contexts_show(struct device *device,  		struct device_attribute *attr,  		char *buf)  { -	struct ocxl_afu *afu = to_ocxl_afu(device); +	struct ocxl_afu *afu = to_afu(device);  	return scnprintf(buf, PAGE_SIZE, "%d/%d\n",  			afu->pasid_count, afu->pasid_max); @@ -55,7 +62,7 @@ static ssize_t global_mmio_read(struct file *filp, struct kobject *kobj,  				struct bin_attribute *bin_attr, char *buf,  				loff_t off, size_t count)  { -	struct ocxl_afu *afu = to_ocxl_afu(kobj_to_dev(kobj)); +	struct ocxl_afu *afu = to_afu(kobj_to_dev(kobj));  	if (count == 0 || off < 0 ||  		off >= afu->config.global_mmio_size) @@ -86,7 +93,7 @@ static int global_mmio_mmap(struct file *filp, struct kobject *kobj,  			struct bin_attribute *bin_attr,  			struct vm_area_struct *vma)  { -	struct ocxl_afu *afu = to_ocxl_afu(kobj_to_dev(kobj)); +	struct ocxl_afu *afu = to_afu(kobj_to_dev(kobj));  	if ((vma_pages(vma) + vma->vm_pgoff) >  		(afu->config.global_mmio_size >> PAGE_SHIFT)) @@ -99,27 +106,25 @@ static int global_mmio_mmap(struct file *filp, struct kobject *kobj,  	return 0;  } -int ocxl_sysfs_add_afu(struct ocxl_afu *afu) +int ocxl_sysfs_register_afu(struct ocxl_file_info *info)  {  	int i, rc;  	for (i = 0; i < ARRAY_SIZE(afu_attrs); i++) { -		rc = device_create_file(&afu->dev, &afu_attrs[i]); +		rc = device_create_file(&info->dev, &afu_attrs[i]);  		if (rc)  			goto err;  	} -	sysfs_attr_init(&afu->attr_global_mmio.attr); -	afu->attr_global_mmio.attr.name = "global_mmio_area"; -	afu->attr_global_mmio.attr.mode = 0600; -	afu->attr_global_mmio.size = afu->config.global_mmio_size; -	afu->attr_global_mmio.read = global_mmio_read; -	afu->attr_global_mmio.mmap = global_mmio_mmap; -	rc = device_create_bin_file(&afu->dev, &afu->attr_global_mmio); +	sysfs_attr_init(&info->attr_global_mmio.attr); +	info->attr_global_mmio.attr.name = "global_mmio_area"; +	info->attr_global_mmio.attr.mode = 0600; +	info->attr_global_mmio.size = info->afu->config.global_mmio_size; +	info->attr_global_mmio.read = global_mmio_read; +	info->attr_global_mmio.mmap = global_mmio_mmap; +	rc = device_create_bin_file(&info->dev, &info->attr_global_mmio);  	if (rc) { -		dev_err(&afu->dev, -			"Unable to create global mmio attr for afu: %d\n", -			rc); +		dev_err(&info->dev, "Unable to create global mmio attr for afu: %d\n", rc);  		goto err;  	} @@ -127,15 +132,20 @@ int ocxl_sysfs_add_afu(struct ocxl_afu *afu)  err:  	for (i--; i >= 0; i--) -		device_remove_file(&afu->dev, &afu_attrs[i]); +		device_remove_file(&info->dev, &afu_attrs[i]); +  	return rc;  } -void ocxl_sysfs_remove_afu(struct ocxl_afu *afu) +void ocxl_sysfs_unregister_afu(struct ocxl_file_info *info)  {  	int i; +	/* +	 * device_remove_bin_file is safe to call if the file is not added as +	 * the files are removed by name, and early exit if not found +	 */  	for (i = 0; i < ARRAY_SIZE(afu_attrs); i++) -		device_remove_file(&afu->dev, &afu_attrs[i]); -	device_remove_bin_file(&afu->dev, &afu->attr_global_mmio); +		device_remove_file(&info->dev, &afu_attrs[i]); +	device_remove_bin_file(&info->dev, &info->attr_global_mmio);  }  |