mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
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: Mario Limonciello <mario.limonciello@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
3e6a9329e6
commit
521289d2a2
|
@ -1034,7 +1034,6 @@ struct amdgpu_device {
|
|||
bool has_pr3;
|
||||
|
||||
bool ucode_sysfs_en;
|
||||
bool psp_sysfs_en;
|
||||
|
||||
/* Chip product information */
|
||||
char product_number[20];
|
||||
|
|
|
@ -4050,14 +4050,6 @@ fence_driver_init:
|
|||
} else
|
||||
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.
|
||||
* 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)
|
|||
amdgpu_pm_sysfs_fini(adev);
|
||||
if (adev->ucode_sysfs_en)
|
||||
amdgpu_ucode_sysfs_fini(adev);
|
||||
if (adev->psp_sysfs_en)
|
||||
amdgpu_psp_sysfs_fini(adev);
|
||||
sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
|
||||
|
||||
/* disable ras feature must before hw fini */
|
||||
|
|
|
@ -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_gtt_mgr_attr_group;
|
||||
extern const struct attribute_group amdgpu_flash_attr_group;
|
||||
|
||||
static const struct attribute_group *amdgpu_sysfs_groups[] = {
|
||||
&amdgpu_vram_mgr_attr_group,
|
||||
&amdgpu_gtt_mgr_attr_group,
|
||||
&amdgpu_flash_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
|
@ -202,7 +202,6 @@ static int psp_early_init(void *handle)
|
|||
case IP_VERSION(13, 0, 3):
|
||||
case IP_VERSION(13, 0, 5):
|
||||
case IP_VERSION(13, 0, 8):
|
||||
case IP_VERSION(13, 0, 10):
|
||||
case IP_VERSION(13, 0, 11):
|
||||
psp_v13_0_set_psp_funcs(psp);
|
||||
psp->autoload_supported = true;
|
||||
|
@ -215,6 +214,7 @@ static int psp_early_init(void *handle)
|
|||
break;
|
||||
case IP_VERSION(13, 0, 0):
|
||||
case IP_VERSION(13, 0, 7):
|
||||
case IP_VERSION(13, 0, 10):
|
||||
psp_v13_0_set_psp_funcs(psp);
|
||||
psp->autoload_supported = true;
|
||||
break;
|
||||
|
@ -3677,6 +3677,13 @@ rel_buf:
|
|||
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,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -3693,39 +3700,39 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
|
|||
|
||||
return sysfs_emit(buf, "0x%x\n", vbflash_status);
|
||||
}
|
||||
|
||||
static const 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 DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
|
||||
|
||||
int amdgpu_psp_sysfs_init(struct amdgpu_device *adev)
|
||||
static struct attribute *flash_attrs[] = {
|
||||
&dev_attr_psp_vbflash_status.attr,
|
||||
&psp_vbflash_bin_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static umode_t amdgpu_flash_attr_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
|
||||
{
|
||||
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))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
|
||||
switch (adev->ip_versions[MP0_HWIP][0]) {
|
||||
case IP_VERSION(13, 0, 0):
|
||||
case IP_VERSION(13, 0, 7):
|
||||
case IP_VERSION(13, 0, 10):
|
||||
ret = sysfs_create_bin_file(&adev->dev->kobj, &psp_vbflash_bin_attr);
|
||||
if (ret)
|
||||
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;
|
||||
if (attr == &psp_vbflash_bin_attr.attr)
|
||||
return 0660;
|
||||
return 0440;
|
||||
default:
|
||||
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 = {
|
||||
.name = "psp",
|
||||
.early_init = psp_early_init,
|
||||
|
@ -3754,12 +3761,6 @@ static int psp_sysfs_init(struct amdgpu_device *adev)
|
|||
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)
|
||||
{
|
||||
device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);
|
||||
|
|
|
@ -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 amdgpu_psp_sysfs_init(struct amdgpu_device *adev);
|
||||
void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue
Block a user