Commit 521289d2 authored by Mario Limonciello's avatar Mario Limonciello Committed by Alex Deucher

drm/amd: Use attribute groups for PSP flashing attributes

Individually creating attributes can be racy, instead make attributes
using attribute groups and control their visibility with an is_visible
callback to only show when using appropriate products.

v2: squash in fix for PSP 13.0.10
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3e6a9329
...@@ -1034,7 +1034,6 @@ struct amdgpu_device { ...@@ -1034,7 +1034,6 @@ struct amdgpu_device {
bool has_pr3; bool has_pr3;
bool ucode_sysfs_en; bool ucode_sysfs_en;
bool psp_sysfs_en;
/* Chip product information */ /* Chip product information */
char product_number[20]; char product_number[20];
......
...@@ -4050,14 +4050,6 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -4050,14 +4050,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
} else } else
adev->ucode_sysfs_en = true; adev->ucode_sysfs_en = true;
r = amdgpu_psp_sysfs_init(adev);
if (r) {
adev->psp_sysfs_en = false;
if (!amdgpu_sriov_vf(adev))
DRM_ERROR("Creating psp sysfs failed\n");
} else
adev->psp_sysfs_en = true;
/* /*
* Register gpu instance before amdgpu_device_enable_mgpu_fan_boost. * Register gpu instance before amdgpu_device_enable_mgpu_fan_boost.
* Otherwise the mgpu fan boost feature will be skipped due to the * Otherwise the mgpu fan boost feature will be skipped due to the
...@@ -4207,8 +4199,6 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev) ...@@ -4207,8 +4199,6 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
amdgpu_pm_sysfs_fini(adev); amdgpu_pm_sysfs_fini(adev);
if (adev->ucode_sysfs_en) if (adev->ucode_sysfs_en)
amdgpu_ucode_sysfs_fini(adev); amdgpu_ucode_sysfs_fini(adev);
if (adev->psp_sysfs_en)
amdgpu_psp_sysfs_fini(adev);
sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
/* disable ras feature must before hw fini */ /* disable ras feature must before hw fini */
......
...@@ -2899,10 +2899,12 @@ static struct pci_error_handlers amdgpu_pci_err_handler = { ...@@ -2899,10 +2899,12 @@ static struct pci_error_handlers amdgpu_pci_err_handler = {
extern const struct attribute_group amdgpu_vram_mgr_attr_group; extern const struct attribute_group amdgpu_vram_mgr_attr_group;
extern const struct attribute_group amdgpu_gtt_mgr_attr_group; extern const struct attribute_group amdgpu_gtt_mgr_attr_group;
extern const struct attribute_group amdgpu_flash_attr_group;
static const struct attribute_group *amdgpu_sysfs_groups[] = { static const struct attribute_group *amdgpu_sysfs_groups[] = {
&amdgpu_vram_mgr_attr_group, &amdgpu_vram_mgr_attr_group,
&amdgpu_gtt_mgr_attr_group, &amdgpu_gtt_mgr_attr_group,
&amdgpu_flash_attr_group,
NULL, NULL,
}; };
......
...@@ -202,7 +202,6 @@ static int psp_early_init(void *handle) ...@@ -202,7 +202,6 @@ static int psp_early_init(void *handle)
case IP_VERSION(13, 0, 3): case IP_VERSION(13, 0, 3):
case IP_VERSION(13, 0, 5): case IP_VERSION(13, 0, 5):
case IP_VERSION(13, 0, 8): case IP_VERSION(13, 0, 8):
case IP_VERSION(13, 0, 10):
case IP_VERSION(13, 0, 11): case IP_VERSION(13, 0, 11):
psp_v13_0_set_psp_funcs(psp); psp_v13_0_set_psp_funcs(psp);
psp->autoload_supported = true; psp->autoload_supported = true;
...@@ -215,6 +214,7 @@ static int psp_early_init(void *handle) ...@@ -215,6 +214,7 @@ static int psp_early_init(void *handle)
break; break;
case IP_VERSION(13, 0, 0): case IP_VERSION(13, 0, 0):
case IP_VERSION(13, 0, 7): case IP_VERSION(13, 0, 7):
case IP_VERSION(13, 0, 10):
psp_v13_0_set_psp_funcs(psp); psp_v13_0_set_psp_funcs(psp);
psp->autoload_supported = true; psp->autoload_supported = true;
break; break;
...@@ -3677,6 +3677,13 @@ static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj, ...@@ -3677,6 +3677,13 @@ static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,
return 0; return 0;
} }
static struct bin_attribute psp_vbflash_bin_attr = {
.attr = {.name = "psp_vbflash", .mode = 0660},
.size = 0,
.write = amdgpu_psp_vbflash_write,
.read = amdgpu_psp_vbflash_read,
};
static ssize_t amdgpu_psp_vbflash_status(struct device *dev, static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
...@@ -3693,39 +3700,39 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev, ...@@ -3693,39 +3700,39 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
return sysfs_emit(buf, "0x%x\n", vbflash_status); return sysfs_emit(buf, "0x%x\n", vbflash_status);
} }
static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
static const struct bin_attribute psp_vbflash_bin_attr = { static struct attribute *flash_attrs[] = {
.attr = {.name = "psp_vbflash", .mode = 0660}, &dev_attr_psp_vbflash_status.attr,
.size = 0, &psp_vbflash_bin_attr.attr,
.write = amdgpu_psp_vbflash_write, NULL
.read = amdgpu_psp_vbflash_read,
}; };
static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL); static umode_t amdgpu_flash_attr_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
int amdgpu_psp_sysfs_init(struct amdgpu_device *adev)
{ {
int ret = 0; struct device *dev = kobj_to_dev(kobj);
struct drm_device *ddev = dev_get_drvdata(dev);
struct amdgpu_device *adev = drm_to_adev(ddev);
if (amdgpu_sriov_vf(adev)) if (amdgpu_sriov_vf(adev))
return -EINVAL; return 0;
switch (adev->ip_versions[MP0_HWIP][0]) { switch (adev->ip_versions[MP0_HWIP][0]) {
case IP_VERSION(13, 0, 0): case IP_VERSION(13, 0, 0):
case IP_VERSION(13, 0, 7): case IP_VERSION(13, 0, 7):
case IP_VERSION(13, 0, 10): if (attr == &psp_vbflash_bin_attr.attr)
ret = sysfs_create_bin_file(&adev->dev->kobj, &psp_vbflash_bin_attr); return 0660;
if (ret) return 0440;
dev_err(adev->dev, "Failed to create device file psp_vbflash");
ret = device_create_file(adev->dev, &dev_attr_psp_vbflash_status);
if (ret)
dev_err(adev->dev, "Failed to create device file psp_vbflash_status");
return ret;
default: default:
return 0; return 0;
} }
} }
const struct attribute_group amdgpu_flash_attr_group = {
.attrs = flash_attrs,
.is_visible = amdgpu_flash_attr_is_visible,
};
const struct amd_ip_funcs psp_ip_funcs = { const struct amd_ip_funcs psp_ip_funcs = {
.name = "psp", .name = "psp",
.early_init = psp_early_init, .early_init = psp_early_init,
...@@ -3754,12 +3761,6 @@ static int psp_sysfs_init(struct amdgpu_device *adev) ...@@ -3754,12 +3761,6 @@ static int psp_sysfs_init(struct amdgpu_device *adev)
return ret; return ret;
} }
void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev)
{
sysfs_remove_bin_file(&adev->dev->kobj, &psp_vbflash_bin_attr);
device_remove_file(adev->dev, &dev_attr_psp_vbflash_status);
}
static void psp_sysfs_fini(struct amdgpu_device *adev) static void psp_sysfs_fini(struct amdgpu_device *adev)
{ {
device_remove_file(adev->dev, &dev_attr_usbc_pd_fw); device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);
......
...@@ -525,6 +525,4 @@ int psp_spatial_partition(struct psp_context *psp, int mode); ...@@ -525,6 +525,4 @@ int psp_spatial_partition(struct psp_context *psp, int mode);
int is_psp_fw_valid(struct psp_bin_desc bin); int is_psp_fw_valid(struct psp_bin_desc bin);
int amdgpu_psp_sysfs_init(struct amdgpu_device *adev);
void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment