diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 63 | 
1 files changed, 42 insertions, 21 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index 08869e4a5374..3949470edbb0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -1027,6 +1027,33 @@ static ssize_t amdgpu_ras_sysfs_features_read(struct device *dev,  	return scnprintf(buf, PAGE_SIZE, "feature mask: 0x%x\n", con->features);  } +static void amdgpu_ras_sysfs_add_bad_page_node(struct amdgpu_device *adev) +{ +	struct amdgpu_ras *con = amdgpu_ras_get_context(adev); +	struct attribute_group group; +	struct bin_attribute *bin_attrs[] = { +		&con->badpages_attr, +		NULL, +	}; + +	con->badpages_attr = (struct bin_attribute) { +		.attr = { +			.name = "gpu_vram_bad_pages", +			.mode = S_IRUGO, +		}, +		.size = 0, +		.private = NULL, +		.read = amdgpu_ras_sysfs_badpages_read, +	}; + +	group.name = RAS_FS_NAME; +	group.bin_attrs = bin_attrs; + +	sysfs_bin_attr_init(bin_attrs[0]); + +	sysfs_update_group(&adev->dev->kobj, &group); +} +  static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)  {  	struct amdgpu_ras *con = amdgpu_ras_get_context(adev); @@ -1034,14 +1061,9 @@ static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)  		&con->features_attr.attr,  		NULL  	}; -	struct bin_attribute *bin_attrs[] = { -		&con->badpages_attr, -		NULL -	};  	struct attribute_group group = {  		.name = RAS_FS_NAME,  		.attrs = attrs, -		.bin_attrs = bin_attrs,  	};  	con->features_attr = (struct device_attribute) { @@ -1052,22 +1074,20 @@ static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)  			.show = amdgpu_ras_sysfs_features_read,  	}; -	con->badpages_attr = (struct bin_attribute) { -		.attr = { -			.name = "gpu_vram_bad_pages", -			.mode = S_IRUGO, -		}, -		.size = 0, -		.private = NULL, -		.read = amdgpu_ras_sysfs_badpages_read, -	}; -  	sysfs_attr_init(attrs[0]); -	sysfs_bin_attr_init(bin_attrs[0]);  	return sysfs_create_group(&adev->dev->kobj, &group);  } +static void amdgpu_ras_sysfs_remove_bad_page_node(struct amdgpu_device *adev) +{ +	struct amdgpu_ras *con = amdgpu_ras_get_context(adev); + +	sysfs_remove_file_from_group(&adev->dev->kobj, +				&con->badpages_attr.attr, +				RAS_FS_NAME); +} +  static int amdgpu_ras_sysfs_remove_feature_node(struct amdgpu_device *adev)  {  	struct amdgpu_ras *con = amdgpu_ras_get_context(adev); @@ -1075,14 +1095,9 @@ static int amdgpu_ras_sysfs_remove_feature_node(struct amdgpu_device *adev)  		&con->features_attr.attr,  		NULL  	}; -	struct bin_attribute *bin_attrs[] = { -		&con->badpages_attr, -		NULL -	};  	struct attribute_group group = {  		.name = RAS_FS_NAME,  		.attrs = attrs, -		.bin_attrs = bin_attrs,  	};  	sysfs_remove_group(&adev->dev->kobj, &group); @@ -1151,6 +1166,9 @@ static int amdgpu_ras_sysfs_remove_all(struct amdgpu_device *adev)  		amdgpu_ras_sysfs_remove(adev, &obj->head);  	} +	if (amdgpu_bad_page_threshold != 0) +		amdgpu_ras_sysfs_remove_bad_page_node(adev); +  	amdgpu_ras_sysfs_remove_feature_node(adev);  	return 0; @@ -1278,6 +1296,9 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)  {  	amdgpu_ras_sysfs_create_feature_node(adev); +	if (amdgpu_bad_page_threshold != 0) +		amdgpu_ras_sysfs_add_bad_page_node(adev); +  	return 0;  }  | 
